Open System Design for Multi-touch Interface Using LEDs as Light Sensors A Senior Project Presented to the Computer Engineering Department California Polytechnic State University 1 Grand Avenue; San Luis Obispo CA, 93407 In Partial Fulfillment of the Requirements for the Degree Bachelor of Science in Computer Engineering By Nicholas J. Utschig December 2010 Abstract This report covers the design and development of a microcontroller-driven interactive display using copyright-free applications. The real time operating system FreeRTOS runs on a PIC24 MCU which measures light-intensities using LEDs on a RGB 8x8 matrix display. Utilizing an LED as a photodetector is explained by a physical theory of operation, algorithm and electrical formula. A cross-section of currently available software suites for hobbyist computer engineering is presented. Table of Contents Pithos, Open .................................................................................................................................................. 1 Collective Objective.................................................................................................................................. 1 Disciplines Implemented .......................................................................................................................... 1 Preface and Gratitude ................................................................................................................................ 3 Introduction ................................................................................................................................................... 4 Open .......................................................................................................................................................... 4 Objectives ................................................................................................................................................. 4 Complete Hardware Design and Fabrication ........................................................................................ 4 Real Time Operating System (RTOS) .................................................................................................. 5 Constant-time light sensing for multi-touch ......................................................................................... 5 64 RGB LED Display ........................................................................................................................... 6 Lux Sensus .................................................................................................................................................... 8 Theory of Operation .................................................................................................................................. 8 Embedded Implementation ....................................................................................................................... 9 Mathematical Model ............................................................................................................................... 10 Development Process .................................................................................................................................. 11 Technology review.................................................................................................................................. 11 Microcontroller Selection ................................................................................................................... 12 Real Time Operating System Selection .............................................................................................. 14 Board design ........................................................................................................................................... 17 CAD Selection .................................................................................................................................... 17 EAGLE ............................................................................................................................................... 18 Component Library ............................................................................................................................. 18 Schematic Layout................................................................................................................................ 19 Board Layout ...................................................................................................................................... 21 Gerber-fication .................................................................................................................................... 24 Panelization ......................................................................................................................................... 24 Manufacturing ..................................................................................................................................... 25 Software Design ...................................................................................................................................... 26 Software Tools Selection .................................................................................................................... 26 Tasks ................................................................................................................................................... 26 Integration ................................................................................................................................................... 29 Assembly ................................................................................................................................................ 29 Conclusion .................................................................................................................................................. 30 i|Page Appendix ..................................................................................................................................................... 31 GNU General Public License.................................................................................................................. 31 Table of Tables Table 1 - Acronyms in alphabetical order. ................................................................................................... iv Table 2 - MCU Peripheral Requirements ................................................................................................... 12 ii | P a g e Table of Figures Figure 1 - Demonstration photo of the 8x8 RGB LED matrix capabilities with the common cathode electrical schematic. The display is illuminated one row at a time, with the color assigned by column. ............................................................................................................................................ 7 Figure 2 - Lux Sensus equation, relating LED junction voltage as the exponential decay from VDD at a time constant determined by the quantity of incident photons. ..................................................... 10 Figure 3 - The constant time light sensing by ADC is more reliable and accurate than the variable time digital input, measured against an incrementing counter. .............................................................. 11 Figure 4 - CadSoft EAGLE -Schematic with bus lines, power capacitors and labels. ............................... 20 Figure 5 - Top copper pour is VDD, with silkscreen, pads, vias and holes. ............................................... 21 Figure 6 - Bottom layer VSS copper pour. No SMD, just pins and vias. ................................................... 22 Figure 7 - All layers visible. ....................................................................................................................... 23 Figure 8 - Panelized view of all layers on 7.65" x 7.65". ........................................................................... 25 iii | P a g e Acronyms Table 1 - Acronyms in alphabetical order. ADC API AVR CAD CPE DMA GPL IDE KiB LED MCU MIPS PCB PIC Analog to Digital Converter. A peripheral which measures an analog signal and returns a finite value, for example, measuring 1 V of 3V by an 8-bit, 255-value ADC will return 85. Application Programming Interface. A design document describing exterior/interface functions of a software program, for use by other programs. Atmel introduced this MCU with flash memory in 1996. The creators give no answer on the meaning of AVR. Computer-aided Design. A software suite which drafts manufacturing designs. Computer Engineering. B.S. program and department of California Polytechnic State University, San Luis Obispo. Direct Memory Access. A MCU peripheral which automates the transfer of data between memory addresses. GNU is not UNIX General Public License. A copy-left agreement that assures open use of my development with others. Integrated Development Environment. A single software application which combines a source code editor, compiler, linker, and often a programmer and debugger for development. 2^10 bytes = 1024 = 1 KiB, a unit of binary information storage. A strict definition, as the kilobit (kB) SI unit may be 1024 or 1000 bits. Most MCUs are byte-addressable, with flash memory segmented into pages of a few KiB each. Light Emitting Diode. A semiconductor device which emits light. Microcontroller Unit. An inexpensive, low power processor with full system-on-a-chip capabilities. Most units include flash, RAM, internal oscillator and many peripherals. Millions of instructions per second. Processing rate measurement unit. Printed Circuit Board. Electronics board used for the secure mounting and electrical connections of complex circuits in an affordable design. Microchip’s MCU lines all refer to Peripheral Interface Controller. Portable Operating System Interface [for UNIX]. An IEEE set of API standards and utilities for portable use of UNIX programs. PSYCD Psychology and Child Development. Two majors and a department of California Polytechnic State University. Pulse-width modulation. Varying the duration of pulses at a high-frequency to modulate the PWM power delivery rate. Averaged over time, a PWM signal can approximate any analog signal. Random Access Memory. Fast and typically volatile storage for program data at run time. RAM POSIX ROM RTOS SMD Read Only Memory. Typically Flash memory, storing program instructions and initialized variables. Real Time Operating System. A small task-management program that offers priority control, multiple tasks, event-driven processing and more in a small memory footprint. Surface Mount Devices. Small circuit components with small pads which solder directly to the surface of the PCB. Does not waste PCB area with through-holes, but hard to assemble. iv | P a g e Pithos, Open Collective Objective Pithos is the complete design of a microcontroller embedded system to accomplish light-sensing using LEDs. It is created using open-source and free tools wherever possible. The open-source tool selection, hardware selection, RTOS selection, LED as light sensors theory of operation, hardware design and software design are key sections of this report. The Pithos (Greek: jar) project demonstrates the wide scope of knowledge gained during my years of computer engineering studies. This jar contains a full system: electrical schematic, surface mounted device PCB layout, 16-bit microcontroller, a real time operating system, multiple tasks, and the implementation of advanced solid state physics knowledge. Lux Sensus (Latin: light feeling) is a compound name for multi-touch interactive display technology using LEDs. It was developed by the CPE Capstone Winter 2009 – Spring 2010 Smart Playground group from public domain knowledge regarding the use of LEDs as photodetectors. Disciplines Implemented From electrical engineering, Pithos requires circuitry for a relatively simple embedded system. This includes the application-specific power supply for the MCU, current-limiting resistors for each LED in the display, and pull-up resistors for in-circuit programming and debugging control of the MCU. From computer engineering, Pithos is an embedded, microcontroller system with multiple tasks. There are design advantages to understanding the costs of RTOS context switching and using floating point on an integer arithmetic logic unit. Power use is decreased by disconnecting unused peripherals from the clock propagation tree. 1|Page From computer science, Pithos implements an open source real time operating system, FreeRTOS. Thread-safe code is managed by the online software revision control system Google Code and Subversion. Within the RTOS, there is a queue server for inter-process communication and each task is an event-driven finite state machine. A touch processing task judges past and current values to detect touch and sends instructions via the server to update the display data. From solid state physics, Pithos uses LEDs as light sensors. The concept occurred during Semiconductor Device Electronics with Dr. Braun, and was then implemented by the Smart Playground CPE Capstone group1, funded by the CPE and PSYCD departments. LEDs as light sensors are prior art since 20052. Usage as an interactive display fixture is also prior art3. The patent by Jeff Han covers LED matrix displays, but uses an algorithm measuring reflectance off alternating lit rows, where Lux Sensus uses ambient light. “It is not once, nor twice, but times without number that the same ideas make their appearance in the world.” – Aristotle. From mathematics, this report models the current/voltage/time/light relationships necessary for engineering with Lux Sensus. An exponential decay of junction voltage is based on junction volume, temperature, doping, magnitude of the reverse bias, and intensity of the ambient light. 1 Smart Playground, CPE Capstone Winter 2009 to Spring 2010 http://smartplayground.wordpress.com/ 2 Multi-touch sensing light emitting diode display and method for using the same, Jefferson Y. Han and NYU, US Patent 7598949 http://www.google.com/patents/about?id=9AXJAAAAEBAJ 3 Fischtisch Intelligent Surface Lab http://www.fischtisch.de/index.php/Main/Lab 2|Page From philosophy and biology, Pithos demonstrates the low cost and benefits of an open dispersal of information. Open systems allow for the selection of creative solutions and the replacement of invalid answers. They prevent stagnation of progress and monopolies on creative ideas. This project stresses its open instruments of design, open medium of transmission and storage, and opened the implementation to future modification by releasing information under GPL. Preface and Gratitude I chose computer engineering for the talents needed in solving future challenges. As computers become smaller, smarter and cheaper; more solutions will become possible. Perhaps every local area or object may soon communicate on networks of many levels - per user, per room, per building, per campus, per town, per state, per country, per continent, per planet, per system, etc. If I followed love, I would have studied aeronautical engineering. If I followed natural ability, it would be physics. I do not see either study having a future comparable to computing. Physical limits for computing are decades away, but other disciplines hit hard limits decades ago. Physics leads to a sharp concentration on modeling a subset of reality, but the opportunity to implement future change is strongest in computing. In Winter of 2007, I enrolled in digital design under Professor Bryan Mealy. He introduced the fundamental circuitry behind useful peripherals – astable multivibrator clocks, bistable flip-flops and more. One day, he discussed the use of embedded systems in art and the gizmo variety of hobbyist communities. The creativity necessary for designing a system from end to end feeds an insatiable thirst for new knowledge and progress. I now see computing machines as high-powered and purposeful artistic instruments, and embedded systems as paving the path up to and beyond a trillion interconnected machines. Nicholas J. Utschig 3|Page Introduction Open Pithos is free as in freedom, so that mistakes, missteps or poorly implemented pieces may be reviewed and corrected. This design process requires complete transparency and creation instruments free of cost and licenses of use. CadSoft EAGLE was used in hardware design. It is frequently used by hobbyists to produce schematics, component packages and lay out PCBs. A plethora of component libraries, scripts and tutorials exist to bring new users up to speed. Microchip MPLAB compiled, programmed, and debugged the PIC24 MCU code. MPLAB is provided for free and works with many in-circuit programmers and debuggers. The latest beta is Javabased and runs on Linux, OS X, and Windows. Google Code held Pithos’ software revisions and development website. It is a portable, cloudbased and free service to organize group work on open source code. Hosting, version control, wiki page, collaborative group aliases and issue tracking are included. Objectives Complete Hardware Design and Fabrication In history, every significant computer system implemented new instructions or peripherals that increased productivity and changed how software could be written. Stack machines trumped register machines, and wire-wrapped transistors fell to integrated circuits. As a tribute to the past, Pithos was designed with its own hardware from the components up. It is more interesting than using a development board and offers more opportunities for artistic merit. 4|Page Real Time Operating System (RTOS) MCUs offer low power processing at low costs. Many MCUs process hundreds of MIPS, interface with external memory using DMA or inter-chip protocols like SPI and I2C. This great power would be squandered on polling loops and blocking calls without a simple operating system. Embedded systems are largely event driven. Events with critical response times, such as a display refresh or user prompts, cannot be reliably polled. Typical processing includes long waits punctuated by short interrupt service routines. A real time operating system provides embedded systems with the ability to context switch threads of processing to best utilize available resources by priority. A sufficiently simple real time operating system would allow multiple priority tasks, semaphores and mutexes, message queues, events and timers. Pithos implements the widely-ported FreeRTOS, released under GNU’s Not Unix General Public License4. The associated FreeRTOS website5 and eBook documentation6 covers the OS design from an introductory level to a high level, and introduces proper use of embedded RTOS in MCUs. FreeRTOS has footprints of ~4 KiB code and ~1 KiB memory which can fit on the tiniest 8-bit MCU ROMs and RAMs. Constant-time light sensing for multi-touch Smart Playground, a Computer Engineering Department Senior Capstone project, used LEDs as light sensors under my technical guidance. The implementation was only a proof of concept, with just enough technology to get it working. The worst issue with the simple implementation was a non-constant 4 The GNU General Public License http://www.gnu.org/licenses/gpl.html, also found in the Appendix. 5 The FreeRTOS Project http://www.freertos.org/ 6 FreeRTOS Documentation http://www.freertos.org/Documentation/FreeRTOS-documentation-and- book.html 5|Page duration of light sensing. In low light, longer measurement periods occur and cause noticeably slower refresh rates. Pithos implements a great improvement for Lux Sensus. Constant-time sensing is achieved by using eight ADC channels on the PIC24 to measure the junction voltage decay by photon-stimulated recombination. (See the detailed theory of operation in the Lux Sensus section on page 7.) 64 RGB LED Display The RGB display engages all visible spectrum sensors in humans. Although it is low resolution, the sixty-four pixel display is bright, packaged small, and inexpensive. The prices are as low as $10 from an Asian distributor. The display is common-cathode, where all twenty-four LEDs (R,G,B x 8) in a row are shared. Each color’s anode is shared by column. This design reduces the number of package pins from 384 to 32, but requires multiplexing by quickly cycling among rows to sustain the persistence of vision. Pithos is designed to provide each LED a maximum of 20 mA for the best tradeoff between brightness and total lifetime. When every color of every LED in one row is enabled at 20 mA and 3.3 VDD, the total display power usage is 1.58 W. When all LEDs are on 12.64 W is lost to entropy. Pulse-width-modulation on the PIC24 allows the variation of average power delivered to the LED and resistor circuit. Varying the intensities of the red, green, and blue channels allows emulation of the visible spectrum between the peak wavelengths of the red and blue LEDs. 6|Page Figure 1 - Demonstration photo of the 8x8 RGB LED matrix capabilities with the common cathode electrical schematic. The display is illuminated one row at a time, with the color assigned by column. 7|Page Lux Sensus LEDs may be used as photodiodes, allowing the single component to serve two purposes. This ability has been implemented in bi-directional half-duplex communication between devices7, proximity detectors, and matrix displays. The following paragraphs describe the theory and application of Lux Sensus in detail. Theory of Operation Light Emitting Diodes are made from solid semiconducting material, which by their nature require a threshold of energy for charge carriers to freely travel amongst the atomic lattice. This section is heavy with analogy that qualitatively relates the solid-state physics of semiconductors. The periodic positions of atoms in the lattice and the distances between fellow atoms follow quantum rules and limit the available energy states for electrons into bands, separated by a gap of impossible states. The electrons must receive or emit this amount of energy to cross the gap and be freed or captured. When an electron is freed, it leaves a hole in its prior atomic bond. These holes are opposite in charge but otherwise perform the same as electrons, traveling amongst the lattice by replacing the hole’s missing electron with one from a neighbor atom’s bond. Extra electrons may be introduced by donor impurity atoms which have more than enough electrons to bond with neighbor atoms, and extra holes from acceptor impurities with too few electrons to share. Thus, we have the charge carriers: holes and electrons, the dopants: donors and acceptors, the energy band gap, and the atomic lattice. 7 Dietz, Paul, William Yerazunis, Darren Leigh (2003). "Very Low-Cost Sensing and Communication Using Bidirectional LEDs". Mitsubishi electric research laboratories. http://www.merl.com/papers/docs/TR2003-35.pdf 8|Page When emitting light, the junction operates with forward voltage bias, driving negative electrons from the n-doped cathode to the p-doped anode and positive holes from the anode to cathode. These holes and electrons may recombine at the junction and release their energy as photons and phonons – light and heat. When the junction is reverse-biased, the depletion region expands on both sides of the junction. In the depletion region, it is energetically preferable (to counteract the reverse bias) for the majority charge carrier to diffuse away and leave the ionized impurities behind, stuck in the lattice. This separation of charge creates a capacitor. The expansion of the depletion region expands the cross-section of the junction as a photon target. The terminals of the LED are then disconnected from the circuit using the high-impedance mode of the microcontroller pin. The trap is armed. When a photon with sufficient energy to free a charge carrier is collected in the depletion region, the charge carrier accelerates to join the other side of the junction. Red LEDs have the smallest energy band gap and thus capture more photons than higher energy green or blue junctions. Photons cause the capacitor to leak charge, a measure of voltage across the LED. A higher intensity of photons causes a higher recombination current and faster voltage drop. A low intensity of photons causes a lower current and slower voltage drop. This is measurable using a MCU’s ADC or an I/O pin with a timer. Lux Sensus uses the energetic properties of semiconductors: temperature, light, heat, and chargecarrier potential with the knowledgeable application of microcontrollers to measure the intensity of photons that intercept the semiconductor junction. Embedded Implementation The following algorithm describes the constant-time Lux Sensus theory of operation. It is executes faster than 10 Hz to decrease response delay. 1. Hold the common cathode at VDD. 9|Page 2. Hold each red LED anode at VSS for at least a microsecond, so that the junction fully depletes of charge carriers in reverse bias. 3. Set the output pin on the red LED anode to high-impedance mode. 4. Make a measurement of the voltage using the ADC. 5. After an adjustable time period – long enough to capture the decay in voltage that can be measured by the ADC, short enough to capture the voltage still decaying – measure the voltage again. 6. Calculate the photo-current. This capacitance is small, but so is the photo current. 7. Store measurement and yield. Every pixel may have a different capacitance / sensitivity, so per-pixel calibration in software is a necessary filtering step. When used for multi-touch, the shadows of hands/arms must be filtered to use only the most shadowed pixels. Mathematical Model The junction voltage measurement is performed by the ADC as a function of time, t. To save power, only two measurements need to be made. The first measures the full VDD voltage before step 3, when the reverse bias has saturated. The second measures the junction voltage at a later time, typically 110 microseconds, to establish the decay rate of the voltage. The model is equivalent to an RC circuit in exponential decay, where the capacitor is the LED junction capacitance C and the resistor to ground is the equivalent of the inverse of light intensity L. See the equation in Figure 1 for the junction potential as a function of time and light intensity. −ππ³⁄ πͺ π(π) = π½π«π« π Figure 2 - Lux Sensus equation, relating LED junction voltage as the exponential decay from VDD at a time constant determined by the quantity of incident photons. 10 | P a g e The voltage threshold of digital input pins, VIL, will trigger after a variable amount of time. This the horizontal line in Figure 2, intersecting the covered and uncovered decay voltages at two times. A constant-time measurement uses the MCU’s ADC to measure the junction voltage after a specified time. This is the vertical line at the sample time in Figure 2. Figure 3 - The constant time light sensing by ADC is more reliable and accurate than the variable time digital input, measured against an incrementing counter. Development Process Technology review Components, manufacturers and hobbyist software all cater to projects on the scale of Pithos. The “Makers” community has a knowledge base of many tutorials8 on creating embedded system projects. 8 SparkFun Tutorials – Lecture 8- Eagle: Schematics http://www.sparkfun.com/tutorials/108 11 | P a g e Microcontroller Selection Multiple companies offer thousands of MCU varieties. The selection-space of all MCUs is vast and dense. The careful selection of the Pithos MCU is critical to achieving all objectives. Peripherals Multiple MCU peripherals are necessary for Lux Sensus and FreeRTOS implementation. These requirements constrained the search space when selecting the MCU. Table 2 - MCU Peripheral Requirements Peripheral Quantity Reason PWM 24 outputs Variable control of light output on each column’s RGB. ADC 16 inputs Constant-time measurement of photonic absorptive recombination. Timers >0 RC Clock > 1 MHz LDO Regulator 5V Code Space >10 KiB FreeRTOS requires a Tick timer to moderate tasks. Internal and inexpensive, fast enough to handle the RTOS overhead and interactive calculations of Lux Sensus. Low drop out regulator for power input regulation. On-chip, supports wide range of common logic voltages. RTOS overhead is ~4 KiB, and display/graphics memory. Alternative MCU Sources Atmel is a well known MCU manufacturer, with many inexpensive and low-power 8, 16 and 32bit MCUs. Their AVR processor was the first with on-chip flash memory, which eases development by using a boot loader that starts code from the flash instead of a programmer and ROM. The widespread Italian Arduino project uses the 8-bit AVR as a simple hobbyist development board. Atmel offers startup board kits and consumer-supported internal software development environments. STMicroelectronics is a European company with a wide range of MCUs, from 8-bit to the ARM Cortex M3. Many devices matched the necessary requirements of this project but their cost was twice that of Microchip’s PICs. The STM32 line of ARM Cortex M3s has superfluous processing power for the 12 | P a g e design of Pithos, and the 8-bit line does not have enough of the required peripherals. The STM32F103 has sixteen ADC channels and is the best choice from STM. Atmel and STM’s offerings require an independent programmer/debugger interface like OpenOCD9 with JTAG-supporting hardware. These are interesting projects worthy of consideration, and in a fully open-source design, they should have been implemented. The added time-costs of producing the JTAG hardware and assembling the chain of software to program/debug is prohibitive compared to Microchip’s MPLAB and PICKit integrative suite. Microchip PIC24FJ256GB210 Microchip is a semiconductor company based in Arizona, known for their PIC series of MCUs. They are known in the hobbyist community for creating intermediate to advanced MCUs. Microchip offers MPLAB, a full development environment including compiling, revision control, device programming and debugging via Microchip PICKit in-circuit serial programmers. MPLAB X is now in public beta, written entirely in portable Java. Selection of a chip which meets all my design requirements was completed in three minutes with a flash tool on Microchip’s website. 10 Other manufacturers had me searching through multiple branches of MCU lines and manuals, taking almost an hour to conclude that the perfect MCU was not offered. I recommend Microchip’s MPLAB software, documentation and design. Their weakest points are the cost of MCU development boards at over one hundred dollars each, and their lack of a portfolio of example projects. Microchip would be a contender for the embedded MCU market if they produced 9 10 Open On-Chip Debugger http://openocd.berlios.de/web/ Microcontroller Product Selector (MPS) http://www.microchip.com/productselector/MCUProductSelector.html 13 | P a g e development boards at a competitive cost to development boards offered by Texas Instruments ($5), and were better integrated with a RTOS. Real Time Operating System Selection The selection of the RTOS was not as difficult as selecting the PIC24. Any RTOS that could run on the PIC24 could achieve the Lux Sensus objectives. There are a surprising number of embedded, open sourced RTOS available. All are roughly POSIX-compliant in regard to multiple tasks, the lifecycle of a task, and inter-task communication and cooperation. All use a ‘tick’ timer for system events and blockallocated memory to minimize the time spend for dynamic allocation. The search began with the Wikipedia list of RTOSs11, where I found each of the three I had prior knowledge of. I narrowed the list to the most promising candidates: OSD TNKernel, SDPOS, Real Time Linux, ERIKA Enterprise and FreeRTOS. TNKernel TNKernel (Tiomkin Kernel) is released under a simple and open-source license by the author, Yuri Tiomkin. It offers the full array of message queues, threaded tasks and priorities. A task is a function with a continuous loop that yields to the task scheduler at least once on every iteration. The collective objective of this project is to forever be an open design; therefore I am timid to integrate an OS with a copyright which may be recalled in the future. This factor weighed against the well-developed TNKernel. Small Devices Portable OS Small Devices Portable OS12 (SDPOS) is non-POSIX, but this is only a mental stumbling block on learning the architecture. It uses inter-task signals to block/wake other tasks, and tasks can recursively 11 List of real-time operating systems, Wikipedia, http://en.wikipedia.org/wiki/List_of_real- time_operating_systems 14 | P a g e call themselves. Community support is small and sedentary. There is no forum, and only a help email address. The non-POSIX design may create difficult questions and require technical support. SDPOS is not a highly active project, and I fear long response times for my questions will delay code development in an RTOS environment. Real-Time Linux Real-Time Linux13 is a modified preemptable version 2.6 of the eponymous kernel. Comfort with this POSIX system is high, as the terminology and OS objects are familiar. This may be the most memory bloated of all the reviewed RTOS, as the style of high-power multi-core multi-user programming does not suit low-power embedded systems. Many system calls like fopen and fork will break the system. Kernel and user spaces still exist in the code priority, all of which make RTLinux too large of a port to comfortably load on the PIC24. ERIKA Enterprise ERIKA Enterprise14 is a well-supported and well-ported RTOS. It is based on the OSEK API, a European open-standard on RTOS for the automotive industry. The most significant advantage of ERIKA is the Eclipse IDE extension. Eclipse is Java based, like Microchip’s MPLAB, allowing portable development. It also handles multi-threaded multi-cores, which boggles my mind. This allows critical tasks to be partitioned onto their own processor! All 16-bit PICs are supported, as well as the Atmel AVR5 and a handful of ARM-based microcontrollers. ERIKA also supports MPLAB, Microchip’s IDE. 12 Small Devices Portable Operating System http://www.sdpos.org 13 Real-Time Linux https://rt.wiki.kernel.org/index.php/Main_Page 14 ERIKA Enterprise http://erika.tuxfamily.org/ 15 | P a g e ERIKA came in a close second place. It lost only due to the quality of FreeRTOS’s documentation and tutorials. FreeRTOS Both FreeRTOS and ERIKA were optimal RTOS solutions, and left the other operating systems far behind. There were many small advantages to selecting FreeRTOS. Most important was the documentation and introduction to RTOS design and theory of operation. Multi-threaded embedded systems cannot be picked up after hello world – ticks, queues and events must be well understood to be implemented properly. FreeRTOS has been ported to the most MCUs of any comparative RTOS. The community rallies around creating example programs and ports for development boards, and a full example program exists for every IDE/MCU combination. The whole of the kernel is only three source files. The documentation is excellent at every level of detail. A full searchable API exists online, as well as an RTOS introduction, tutorials to get started, and implementation of advanced tasks. I can reach information on the advanced topics of tracing the MCU performance and supported network stacks in a click that would take minutes to find in other RTOS docs. PDF and eBook manuals are available for a reasonable textbook fee. 16 | P a g e Board design CAD Selection Cal Poly manufacturing courses offer experience with NOVARM DipTrace15, Cadence16 OrCAD and Cadence Allegro. I have used CadSoft Eagle17 briefly on a quick-spin project, loading existing schematics and layout to output Gerber files for fabrication. All PCB CAD programs have large learning curves, but perform the same functions: ο· Build component libraries. ο· Draw electrical schematics. ο· Design board dimensions and holes. ο· Place components. ο· Route circuitry. ο· Output manufacturing files. Most full-featured PCB CAD suites are prohibitively expensive, costing tens of thousands of dollars in whole. As Pithos only requires a six square inch board, more free options are available. DipTrace and EAGLE are the two frequently used hobbyist CAD suites. EAGLE’s free, non-profit version allows two layers and a 4”x3” board. A $125 version allows six layers and a 6”x4” board. DipTrace’s free, academic version allows two layers and 500 pins. The best offer is DipTrace’s full 15 DipTrace http://www.diptrace.com 16 Cadence http://www.cadence.com/products/orcad/Pages/default.aspx 17 CadSoft EAGLE http://www.cadsoftusa.com/ 17 | P a g e featured suite for thirty days. One month is enough time to complete two spins of a board. EAGLE was chosen over DipTrace due to the amount of contemporary component libraries and tutorials available. The gEDA project18 is an electronic design automation suite released under GPL with a twelve year history. The community has collected a library of components19 including the package for this PIC24 but not the schematic connections. I have used the independent applications of gEDA but not the full suite from beginning to end. In the past, installation and building process was difficult for amateurs. gEDA is now commonly included in Linux distribution’s application repositories. I did not select gEDA because of prior difficulty with its tools and the smaller number and quality of community created component libraries. It is a maturing suite which should be considered in the future. EAGLE EAGLE has a simple graphical user interface with command line for lengthy commands. Shortcut keys can be customized. I learned the user interface in less than an hour, but the tricks for proper PCB layout took three complete board revisions from schematic to routing. This section walks through all stages of PCB design with EAGLE. Component Library The most time-intensive stage of fabricating a PCB can be designing components and their solder footprints. The great advantage to EAGLE is a truckload of community-created libraries which include modern components. The PIC24 footprint and schematic drawing by Dodotronic20 is on CadSoft’s library 18 gEDA Project, Electronic Design Automation http://www.gpleda.org/ 19 gEDA Symbols and Footprints and Stuff http://www.gedasymbols.org 20 Dototronic, Italian Hobbyist, http://www.dodotronic.com/ 18 | P a g e archive21, saving an hour of tedious work. I used SparkFun’s library for 0402 capacitors and resistors, and the 0.1” connectors for power and programming/debugging. The connector pins are each slightly offset to lock the connectors in place during assembly. Schematic Layout In this step, all connections are made between the components. Begin with stubbing power lines to all devices by attaching a short wire to a power supply symbol. Naming net lists VDD and VSS and adding a label is preferred over laying power lines across the landscape. Neatness helps errors stand out, such as incorrect or missing connections. The schematic has no relationship to how the parts will be physically arranged. Run electrical rule checks often to keep track of missing net lists, unattached power lines and more. There should be no errors before board layout begins. The MCU has specific power needs. Datasheets contain application notes on circuit design rules with instructions on noise-filtering capacitors placed close to the VDD/VSS pins on the MCU, pull up or down resistors, maximum voltages on pins, brown out voltages, etc. The LEDs vary in turn-on voltages, from red at 1.7V to blue at 3.2V. Current limiting resistors are placed in series with the LEDs to match the 3.3V VDD to the recommended 20 mA current. Three colors per column create many connections to the MCU. Buses connect these sets of lines, because the output/input ports are grouped together on the MCU. When a bus or any disjoint signal is connected to the MCU, it should be labeled with the signal. The ADC inputs connect to the common cathodes of each row. These are used for the voltage measurement across the reverse biased junction. When they are not measuring, they output VSS to drain the LED current. 21 CadSoft EAGLE’s Library Archive http://www.cadsoft.de/download.htm 19 | P a g e The PICKit 3 in-circuit serial programmer is Microchips proprietary programmer. It drives the MCLR pin to reset the MCU, two programming lines, and VDD, VSS to control logic levels between the USB 5 V power and the MCU’s 3.3 V. Figure 4 - CadSoft EAGLE -Schematic with bus lines, power capacitors and labels. 20 | P a g e Board Layout Figure 5 - Top copper pour is VDD, with silkscreen, pads, vias and holes. Board layout combines artistic merit, experience gained from poor judgment, and patience. It begins with placing the bottleneck component – the MCU. It has the most connections and the smallest pad size, so it must be centrally located. Airwires show the direct connections between pads, for the purpose of rotating components to minimize traces crossing over traces. The power stabilizing capacitors must be placed as close as possible to the VSS/VDD chip inputs, but vias are cumbersome and large. 21 | P a g e Auto-routing in EAGLE is poor to bad. Too many vias are created as the algorithm tries to march right to its destination, and then toggles sides as it tries to shorten the trace length. Power capacitors must be hand routed, and the design rules adjusted to match the pitch of fine-leaded SMD. SparkFun has created a decent design rule file, but the drill and trace sizes were too large to start with. These design rules can be saved, shared, and automatically applied during auto-routing. Figure 6 - Bottom layer VSS copper pour. No SMD, just pins and vias. The final step in board design is ground and power plane copper pours. These minimize the cost to the manufacturer by protecting most of the copper on the board. Copper etching chemicals are expensive to recycle. The copper pours also make for a professional appearing board. Islands of copper 22 | P a g e may remain unconnected to their signal, and float. Caution should be exercised if the design may be impacted by these floating planes, such as capacitive touch zones. Figure 7 - All layers visible. EAGLE’s auto-router requires fine tuning for fine surface mount boards. It is recommended to set the minimum width and distance to a few mils above the manufacturer’s limits, for the best manufacturability. Using a 1 mil routing grid allows the trace to flexibly flow around components and vias but increases the processing time. Using moderately sized vias far apart from each other improves drill hit accuracy and decreases expensive broken drill bits. Vias made too large will block traces during 23 | P a g e auto-routing. The EAGLE smash tool will move the silkscreen name and value of components to locations free from vias and solder for visible printing. Gerber-fication EAGLE comes with automated scripts to produce every type of manufacturing file with a few clicks. Generally, Excellon drill tables and gerber formats are the most widely accepted. I had no errors or trouble outputting my board for fabrication on either of my board revisions. Panelization PCB manufacturers will take all of your money if given the opportunity. If you mention that school or work is paying for your boards, they may charge you hundreds of dollars for just a few dozen square inches. The best way to save money on fabrication is to find deals like www.4pcb.com, who offer $33 a board for four boards, with the fifth board “free”. When the board use area is maximized by panelizing 3 x 3 on an 8”x8” board, then the divided total cost per board is $3.50. See Figure 8 for the panelized Pithos Gerber files. Use GerbMerge22 to panelize PCB layouts, released under GPL. GerbMerge is a python program that automatically tries to fit your requested number of boards in the requested area, and it is made to work with EAGLE output. The free version of EAGLE has a tiny allowable board area, otherwise it is possible to copy and paste the boards in place. GerbMerge requires ten minutes to install the necessary build environments on a UNIX system, ten minutes manually editing a configuration file, and ten minutes to fine tune the process to create perfect Gerber files. It takes seconds to run a pre-written layout, or never halts while it tries random configurations to maximize the placement efficiency. 22 GerbMerge, a gerber combination tool. http://claymore.engineer.gvsu.edu/~steriana/Python/gerbmerge/ 24 | P a g e Figure 8 - Panelized view of all layers on 7.65" x 7.65". Manufacturing Print out the board designs at 1:1 scale and confirm each component matches its footprint. On my first spin of the Pithos board, I accidentally used a 14mm x 14mm TQFP100 instead of a 12mm x 12mm. Fortunately, I only made a sample and it lives on as an intricate beer coaster. There are many recommended PCB manufacturers available at a moderate cost. I have compiled this list from my own experiences and the recommendations of colleagues: ο· Advanced Circuits, Colorado, www.4pcb.com ο· Silver Circuits, Malaysia, www.custompcb.com ο· Pad2Pad, New Jersey, www.pad2pad.com 25 | P a g e ο· PCB-POOL, Ireland, www.pcb-pool.com Software Design Software Tools Selection Software development occurs in the IDE. An ideal IDE will assist code development, organization, and ease of use. Microchip offers the complete IDE suite for their MCU line, MPLAB. The latest beta is a Java application, which is portable code and it has been tested on an OS X 10.6 laptop, Ubuntu 10.10 desktop, and Windows XP in a virtual machine on OS X. There is no problem compiling or programming on different platforms. MPLAB ties in with the software version control system Subversion, all part of the Google Code package. All added source files can be committed and updated directly from the IDE. I also used terminal SVN in Ubuntu and OS X and TortoiseSVN in Windows. Google Code allowed me a constant and remote backup location for my code, and is ideal for peer development with a wiki and email aliases for the project. Tasks This RTOS multi-threaded software design flow is layered and flexible for future additions. The scheduler is cooperative which allows a task to run until it blocks, yields, or the system responds to an interrupt. When the execution returns to the scheduler, it switches to the highest priority task that is ready to run. The highest priority tasks are operating system fundamentals: the scheduler and timer manager/delegate. System service tasks are in the middle of all priorities: communication server, display driver and light measurement. The lowest priority tasks consume processing power for long intervals, and should run last. They are applications like games. Every task communicates via the server task, which easily expands to send common data to multiple tasks. 26 | P a g e Scheduler Task The OS scheduler has the first priority, and always preempts other tasks to choose the next task that is ready to run. Timer Task The second priority task is the timer, which manages all OS timers and callbacks. Callbacks are as brief as possible, posting events or messages to queues for the consuming tasks to handle. The callback functions may neither call subfunctions that block, nor block themselves. If the high priority timer task blocks, high latency or deadlock may occur as no other timer callback may execute until the block is resolved. Display Task The display task is a medium priority service task, driven by a timer. The rows must be cycled fast enough to maintain the persistence of vision (>120 Hz) and a high PWM switching frequency (>1 kHz) for creating videos of Pithos without strobe-light effects. The display task does not churn and burn while refreshing the screen. Instead, a display refresh occurs using a finite state machine which changes states (illuminating the next row with the current data) by an event posted to the display message queue by a timer. As the LEDs are used to display and detect light, a shared mutex is acquired before a row is illuminated and released afterwards. The display task maintains an 8x8 array of pixel colors as unsigned 32 bit integers. Each R,G,B color gets 8-bits of intensity for pulse-width-modulation. 255 is 100% and 0 is 0% duty cycle. This pixel color data type displays approximately16 million colors. The display subscribes to the server task for updates of pixel color data, and processes the change via its message queue. LuxSensusTask Touch interpretation is a medium priority service task that is event driven by two timers and blocks on a mutex. The display LEDs can either sense light or display, so a mutex is shared by the display 27 | P a g e task and Lux Sensus task. These tasks acquire the mutex before starting their timers and release after light measurement or after drawing one row of lights. A 10Hz timer posts a SENSE_LIGHT event to the LuxSensus’s queue. This wakes up the task, and it attempts to acquire the shared mutex. When successful, the output pins are configured to reverse bias the LED junctions and the first timer is started. This operation charges the LED junction. The first timer callback triggers an ADC measurement and posts the value to the server task as a VDD reference. The callback then configures the outputs for high impedance, starts the second timer, and exits. This operation stores a known voltage because VDD changes with the battery charge, and then begins the junction’s exponential decay by incident photos. The second timer callback captures the decayed voltage and posts it to the server task, then releases the shared display mutex so that the display task may continue drawing. The body of the task is subscribed to the light measurement values from the server, and blocks while waiting on that queue. When values are available, it processes the zones to find the points of multi touch and returns these touch points to the server for distribution. Server Task The server task handles producer/consumer tasks, allowing tasks to subscribe and/or publish data. All data types and their block sizes are defined for the server. Each consumer task allocates a block memory pool with blocks the size of a message. The consumer then subscribes this block pool address and the requested data type to the server. When the server obtains the data, it passes it to the queues of all subscribers. This expandable inter-task communication method is responsible for setting new pixel colors and returning the current light intensities of each pixel for processing. If the server task was not implemented, every new broadcasted data would require adding its API to each related task. Instead, we subscribe producers/consumers with a single call. 28 | P a g e Application Task Pithos is a platform for using light-sensing LEDs. This cumulates in applications which process touch data to apply a game or display transition. Applications may be graphically intensive, or use floating point arithmetic which drains processing cycles. Most applications will likely execute once on a touch event or full screen-refresh event. An application may use multiple tasks, and all tasks are to be sorted by their relative priority at the lowest overall priority, due to the rarity of their execution and probable high processing costs. Idle Task The lowest priority idle task is always running and never blocks. Pithos is very power intensive, using up to 1.6 W by the LED display alone. Power savings on the MCU will not be a significant benefit, but power saving modes are easy to implement. When there are no other tasks ready to run, the idle task returns to execution. Its task loop repeatedly sets the MCU into Idle Mode. The CPU will stop executing, but all peripherals and clocks will continue running unless the “Stop in idle” bit is set. There is no delay in responding to any interrupt from Idle Mode. Integration Assembly Digi-Key and Mouser stocks all resistors, capacitors and PIC24 MCUs. Futurlec stocks all 8x8 RGB LED matrices. Advanced Circuits at 4pcb.com has approved and manufactured the designed boards. Capacitors and resistors were chosen in 0402 packages for their small footprint and cheapness. All SMD are installed under a microscope with SMD soldering tips and tweezers. 29 | P a g e Conclusion The open-source design and development of an MCU-based RTOS system which characterizes and achieves constant-time multi-touch is documented. Critical software components such as CadSoft EAGLE and Microchip MPLAB are not licensed under GPL or similar copy-left licenses. They are free as in beer but not free as in freedom, but were selected for their wide use in the community of hobbyist embedded systems. Alternatives such as gEDA and Eclipse\OpenOCD are explored. The scope of this project is large. Many tasks should be delegated among localized experts. The most valuable knowledge I have learned from designing this device is insight in program management. Once a solution is designed, it can be subdivided into independent tasks. The design process lays down the trunk, roots and branches of the product tree. The branches naturally subdivide the project into independent domains. A full project incorporates all the work from cradle to shipping box. Members are selected for the team to best complete this project, then their efforts are directed and tasks completion dates projected to keep the work flow at the same pace. Costs must be managed and the group needs to make a net profit before funds run out. Without project control, there is nothing to show at the end of a great deal of hard work. To demonstrate hypothetical delegation in this project, two hardware engineers select the necessary components to meet project requirements, then design and peer-review the schematic and PCB layout. They order the boards and schedule delivery of components as production managers. Three software engineers design the data types, data flow and algorithms to achieve the defined application. They become local experts in constructing independant tasks, and defining APIs between tasks. Two computer engineers write drivers to wrap each peripheral and tune the light-sensing algorithm timing. A marketing and sales representative uses funds to advertise and build sales contracts. A chief technology officer maintains the product vision and smoothes out design irregularities while managing the development team. This is only the innermost layer of development in an onion of complexities that companies construct as they grow. 30 | P a g e Appendix GNU General Public License This project is released under GPL, from http://www.gnu.org/licenses/gpl.html. The license is a great read for legal, philosophical and computer science reasons. I am compelled to include it in my written report. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area 31 | P a g e of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. 32 | P a g e A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or generalpurpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. 33 | P a g e When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: 34 | P a g e a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party 35 | P a g e retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it 36 | P a g e is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the 37 | P a g e previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which 38 | P a g e the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 39 | P a g e HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS 40 | P a g e