├── release ├── port.txt └── update.bat ├── src ├── version.h ├── README.md ├── EecIv.h ├── Cart.h ├── Cart.cpp ├── EecIv.cpp └── EecIvReader.cpp ├── pcb ├── Zeug.dcm ├── schematic.pdf ├── EEC-IV-Reader.png ├── fp-lib-table ├── .gitignore ├── Zeug.lib ├── EEC-IV-Reader.kicad_prl ├── report.txt ├── EEC-IV-Reader.pro ├── remove │ ├── EEC-IV-Reader.kicad_pro │ └── EEC-IV-Reader.sch ├── EEC-IV-Reader-cache.lib ├── EEC-IV-Reader.kicad_pro ├── EEC-IV-Reader.xml └── mondeo.kicad_mod ├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── test ├── README └── test_fault_code_util.c ├── platformio.ini ├── lib └── README ├── include └── README └── LICENSE.md /release/port.txt: -------------------------------------------------------------------------------- 1 | COMX 2 | -------------------------------------------------------------------------------- /src/version.h: -------------------------------------------------------------------------------- 1 | static const char* VERSION = "0.3.7"; -------------------------------------------------------------------------------- /pcb/Zeug.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /pcb/schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flxkrmr/eec-iv-reader-arduino/HEAD/pcb/schematic.pdf -------------------------------------------------------------------------------- /pcb/EEC-IV-Reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flxkrmr/eec-iv-reader-arduino/HEAD/pcb/EEC-IV-Reader.png -------------------------------------------------------------------------------- /pcb/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "Library")(type "KiCad")(uri "${KIPRJMOD}/Library.pretty")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | 7 | docs 8 | 9 | release/avrdude* 10 | release/firmware* 11 | 12 | *~ 13 | 14 | TODO.txt 15 | Memory Usage.txt 16 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "platformio.platformio-ide" 6 | ], 7 | "unwantedRecommendations": [ 8 | "ms-vscode.cpptools-extension-pack" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino EEC IV Reader 2 | 3 | Arduino implementation of the DCL-Protocol to communicate with Ford EEC-IV ECUs. 4 | 5 | Please check out the Wiki for more information. 6 | 7 | This is currently a work in progress and not completely working. Use at your own risk! 8 | 9 | ![Finished Board](https://user-images.githubusercontent.com/8393480/210100160-ee154aea-d29f-4821-9a3f-92269876bf8c.jpg) 10 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | # Arduino EEC IV Reader 2 | 3 | Arduino implementation of the DCL-Protocol to communicate with Ford EEC-IV ECUs. 4 | 5 | Mostly based on findings of this implementation https://github.com/babroval/ford-eec-iv-diagnostic 6 | 7 | This is currently a work in progress and not completely working. Use at your own risk! 8 | 9 | ## TODO 10 | * Move UI code to class 11 | * Refactor EecIv class 12 | * Timeout for reading 13 | * Read live values 14 | * How to read multiple fault codes? 15 | -------------------------------------------------------------------------------- /release/update.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set /p port= THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /pcb/EEC-IV-Reader.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_nets": [], 7 | "high_contrast_mode": 0, 8 | "net_color_mode": 1, 9 | "opacity": { 10 | "pads": 1.0, 11 | "tracks": 1.0, 12 | "vias": 1.0, 13 | "zones": 0.6 14 | }, 15 | "ratsnest_display_mode": 0, 16 | "selection_filter": { 17 | "dimensions": true, 18 | "footprints": true, 19 | "graphics": true, 20 | "keepouts": true, 21 | "lockedItems": true, 22 | "otherItems": true, 23 | "pads": true, 24 | "text": true, 25 | "tracks": true, 26 | "vias": true, 27 | "zones": true 28 | }, 29 | "visible_items": [ 30 | 0, 31 | 1, 32 | 2, 33 | 3, 34 | 4, 35 | 5, 36 | 6, 37 | 7, 38 | 8, 39 | 9, 40 | 10, 41 | 11, 42 | 12, 43 | 13, 44 | 14, 45 | 15, 46 | 16, 47 | 17, 48 | 18, 49 | 19, 50 | 20, 51 | 21, 52 | 22, 53 | 23, 54 | 24, 55 | 25, 56 | 26, 57 | 27, 58 | 28, 59 | 29, 60 | 30, 61 | 32, 62 | 33, 63 | 34, 64 | 35, 65 | 36 66 | ], 67 | "visible_layers": "fffffff_ffffffff", 68 | "zone_display_mode": 1 69 | }, 70 | "meta": { 71 | "filename": "EEC-IV-Reader.kicad_prl", 72 | "version": 3 73 | }, 74 | "project": { 75 | "files": [] 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /src/EecIv.h: -------------------------------------------------------------------------------- 1 | #ifndef EEC_IV_H 2 | #define EEC_IV_H 3 | 4 | #include 5 | #include 6 | #include "Cart.h" 7 | 8 | 9 | class EecIv { 10 | public: 11 | typedef void (*callback_int_t)(const uint8_t []); 12 | typedef void (*callback_t)(const char []); 13 | typedef void (*callback_empty_t)(void); 14 | 15 | callback_t debugPrint; 16 | callback_int_t onFaultCodeRead; 17 | callback_empty_t onFaultCodeFinished; 18 | callback_empty_t onStartMessageTimeout; 19 | 20 | callback_int_t onLiveData; 21 | 22 | enum OperationMode { 23 | READ_FAULTS, 24 | KOEO, 25 | LIVE_DATA 26 | } mode = READ_FAULTS; 27 | 28 | EecIv(int di, int ro, int re); 29 | 30 | void setMode(EecIv::OperationMode mode); 31 | void restartReading(); 32 | 33 | void mainLoop(); 34 | 35 | private: 36 | 37 | Cart* cart; 38 | 39 | enum State { 40 | IDLE, 41 | CHECK_IF_IN_DIAG_MODE, 42 | SEND_START_MESSAGE, 43 | CHANGE_BAUD_RATE_9600, 44 | WAIT_FOR_SYNC_9600, 45 | 46 | REQUEST_BAUD_RATE_CHANGE, 47 | WAIT_REQUEST_BAUD_RATE_CHANGE_DONE, 48 | CHANGE_BAUD_RATE_2400, 49 | WAIT_FOR_SYNC_2400, 50 | 51 | REQUEST_CLEAR_DCL_ERRORS, 52 | WAIT_REQUEST_CLEAR_DCL_ERRORS, 53 | 54 | REQUEST_CONT_SELF_TEST_CODES, 55 | WAIT_REQUEST_CONT_SELF_TEST_CODES, 56 | READ_CONT_SELF_TEST_CODES, 57 | 58 | REQUEST_KOEO, 59 | WAIT_REQUEST_KOEO, 60 | READ_KOEO, 61 | 62 | REQUEST_PID_MODE, 63 | WAIT_PID_MODE, 64 | TRANSMIT_PID_MAP, 65 | WAIT_TRANSMIT_PID_MAP, 66 | WAIT_PID_DATA, 67 | 68 | } currentState = IDLE; 69 | 70 | uint8_t syncPointer = 0; 71 | uint8_t errorCodePointer = 0; 72 | uint8_t loopCounter = 0; 73 | uint8_t koeoCounter = 0; 74 | unsigned long timeoutTimer = 0L; 75 | const unsigned long timeoutMax = 3000UL; 76 | uint8_t startMessageCounter = 0; 77 | const uint8_t startMessageCounterMax = 5; 78 | 79 | int exceededTimeout(); 80 | void initTimeoutTimer(); 81 | 82 | unsigned char errorCodeBuffer[2]; 83 | 84 | char printBuffer[90]; 85 | 86 | const static uint8_t pidMap[12][4]; 87 | 88 | uint8_t liveDataBuf[8]; 89 | uint8_t liveDataOffset = 0; 90 | uint8_t liveDataLastFrame = 0; 91 | }; 92 | 93 | #endif /* EEC_IV_H */ 94 | -------------------------------------------------------------------------------- /src/Cart.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #define RE_READ 0x0 7 | #define RE_WRITE 0x1 8 | 9 | 10 | #define PID_CHECKSUM(pid) ((((pid & 0xF) ^ ((pid >> 4) & 0xF) ^ 0x8 ^ 0xA) << 4 ) | 0x8) 11 | 12 | class Cart { 13 | 14 | public: 15 | 16 | struct IdSlot { 17 | unsigned int rpm : 8; 18 | unsigned int frameNumber : 4; 19 | unsigned int parity : 4; 20 | } idSlot; 21 | 22 | struct DclErrorFlagLow { 23 | unsigned int loadAddrPartiy : 1; 24 | unsigned int loadAddrBadValue : 1; 25 | unsigned int dataChecksumPartiy : 1; 26 | unsigned int incorrectChecksum : 1; 27 | unsigned int adValuesParityError : 1; 28 | unsigned int pidMapParityError : 1; 29 | unsigned int dmrMapParityError : 1; 30 | unsigned int unused : 1; 31 | } dclErrorFlagLow; 32 | 33 | struct DclErrorFlagHigh { 34 | unsigned int unused : 2; 35 | unsigned int executeVectorParityError : 1; 36 | unsigned int executeVectorIncorrectChecksum : 1; 37 | unsigned int badDiagParameterSlot : 1; 38 | unsigned int eecInReset : 1; 39 | unsigned int selfTestComplete : 1; 40 | unsigned int background : 1; 41 | } dclErrorFlagHigh; 42 | 43 | bool hasData = false; 44 | void getData(uint8_t* data); 45 | uint8_t dataWordCounter = 0; 46 | 47 | void setDiagnosticParameter(const uint8_t diagnosticParameter[]); 48 | // when false, sending diagnostic parameter is disabled 49 | bool enableDiagnosticParameterSending = false; 50 | // when true, the diagnostic parameter has been send at least one time 51 | bool diagnosticParameterSendingDone = false; 52 | 53 | void setPidMap(const uint8_t pidMap[12][4]); 54 | bool enablePidMapSending = false; 55 | bool pidMapSendingDone = false; 56 | 57 | uint8_t currentDiagnosticMode = 0; 58 | uint8_t nextDiagnosticMode = 0; 59 | 60 | void setBaudrate(long baudrate); 61 | void sendStartMessage(); 62 | 63 | void loop(); 64 | bool isSynced = false; 65 | 66 | // can be set to false, will be set true if current frame ends 67 | bool frameDone = true; 68 | 69 | Cart(SoftwareSerial* softwareSerial, uint8_t pin_re); 70 | void reset(); 71 | 72 | private: 73 | 74 | enum Mode { 75 | WAIT_SYNC, 76 | ID_SLOT, 77 | DIAG_PARAM_SLOT, 78 | STATUS_SLOT, 79 | DATA_SLOT, 80 | } mode = WAIT_SYNC; 81 | 82 | struct delay_s { 83 | uint16_t word; // ns 84 | uint16_t byte; // ns 85 | } delay; 86 | 87 | enum StatusSlotType { 88 | CURRENT_DIAGNOSTIC_MODE = 0x4, 89 | NEXT_DIAGNOSTIC_MODE = 0x5, 90 | DCL_ERROR_FLAG_LOW = 0x6, 91 | DCL_ERROR_FLAG_HIGH = 0x7, 92 | DMR_LOW = 0x8, 93 | DMR_HIGH = 0x9, 94 | ROM_ID_LOG = 0xA, 95 | ROM_ID_HIGH = 0xB, 96 | }; 97 | 98 | const static uint8_t startMessage[11]; 99 | 100 | SoftwareSerial *softwareSerial; 101 | uint8_t pin_re; 102 | 103 | void pushBuffer(uint8_t val); 104 | uint8_t pushAvailableToBuffer(); 105 | 106 | void handleStatusSlot(); 107 | 108 | uint8_t diagnosticParameter[8]; 109 | uint8_t diagnosticParameterPointer = 0; 110 | 111 | uint8_t pidMap[12][4]; 112 | uint8_t pidMapPointer = 0; 113 | 114 | uint8_t frameNumber = 0; 115 | bool isBufferSync(); 116 | 117 | uint8_t wordBufferPointer = 0; 118 | uint8_t wordBuffer[2]; 119 | 120 | uint8_t data[2]; 121 | }; -------------------------------------------------------------------------------- /pcb/report.txt: -------------------------------------------------------------------------------- 1 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R10:/625279EC:". 2 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R1:/624EB2E4:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 3 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R2:/624EBCCF:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 4 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R4:/6251A234:". 5 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R5:/62519AC4:". 6 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R6:/625191FD:". 7 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R7:/62508634:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 8 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R8:/62508E3E:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 9 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R9:/625281E9:". 10 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R3:/624EC154:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 11 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R11:/6252878D:". 12 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "R12:/6250DBD8:Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal". 13 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "SW1:/624FAFBD:Button_Switch_THT:SW_PUSH_6mm_H4.3mm". 14 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "SW2:/624FB811:Button_Switch_THT:SW_PUSH_6mm_H4.3mm". 15 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "SW3:/624FBD3E:Button_Switch_THT:SW_PUSH_6mm_H4.3mm". 16 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "U1:/62512B8B:". 17 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "U2:/62501FCA:Package_TO_SOT_THT:TO-220-3_Vertical". 18 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J7:/625029B9:". 19 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J6:/624F3C78:Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical". 20 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J5:/624E5B3A:Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical". 21 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J4:/624E6F85:Connector_PinHeader_2.54mm:PinHeader_1x10_P2.54mm_Vertical". 22 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "D1:/6250E0F7:LED_THT:LED_D3.0mm". 23 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J3:/62540E2B:". 24 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J1:/624E471C:Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical". 25 | Hinweis: Überprüfe aus der Netzliste den Bauteilfootprint "J2:/624E1CB5:Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical". 26 | Fehler: Es wurde kein Footprint für das Bauteil "U1" definiert. 27 | 28 | Fehler: Es wurde kein Footprint für das Bauteil "R11" definiert. 29 | 30 | Fehler: Neues Bauteil R11 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 31 | Fehler: Es wurde kein Footprint für das Bauteil "R6" definiert. 32 | 33 | Fehler: Es wurde kein Footprint für das Bauteil "R5" definiert. 34 | 35 | Fehler: Es wurde kein Footprint für das Bauteil "R4" definiert. 36 | 37 | Fehler: Es wurde kein Footprint für das Bauteil "R10" definiert. 38 | 39 | Fehler: Es wurde kein Footprint für das Bauteil "R9" definiert. 40 | 41 | Fehler: Neues Bauteil U1 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 42 | Fehler: Neues Bauteil R10 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 43 | Fehler: Es wurde kein Footprint für das Bauteil "J7" definiert. 44 | 45 | Fehler: Neues Bauteil R9 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 46 | Fehler: Neues Bauteil R6 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 47 | Fehler: Neues Bauteil R5 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 48 | Fehler: Neues Bauteil J3 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 49 | Fehler: Neues Bauteil R4 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 50 | Fehler: Es wurde kein Footprint für das Bauteil "J3" definiert. 51 | 52 | Fehler: Neues Bauteil J7 konnte wegen fehlendem Footprint nicht hinzugefügt werden. 53 | -------------------------------------------------------------------------------- /pcb/EEC-IV-Reader.pro: -------------------------------------------------------------------------------- 1 | update=07.04.2022 10:21:14 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [schematic_editor] 16 | version=1 17 | PageLayoutDescrFile= 18 | PlotDirectoryName= 19 | SubpartIdSeparator=0 20 | SubpartFirstId=65 21 | NetFmtName=Pcbnew 22 | SpiceAjustPassiveValues=0 23 | LabSize=50 24 | ERC_TestSimilarLabels=1 25 | [pcbnew] 26 | version=1 27 | PageLayoutDescrFile= 28 | LastNetListRead=EEC-IV-Reader.net 29 | CopperLayerCount=2 30 | BoardThickness=1.6 31 | AllowMicroVias=0 32 | AllowBlindVias=0 33 | RequireCourtyardDefinitions=0 34 | ProhibitOverlappingCourtyards=1 35 | MinTrackWidth=0.2 36 | MinViaDiameter=0.4 37 | MinViaDrill=0.3 38 | MinMicroViaDiameter=0.2 39 | MinMicroViaDrill=0.09999999999999999 40 | MinHoleToHole=0.25 41 | TrackWidth1=0.25 42 | TrackWidth2=0.3 43 | TrackWidth3=0.5 44 | ViaDiameter1=0.8 45 | ViaDrill1=0.4 46 | dPairWidth1=0.2 47 | dPairGap1=0.25 48 | dPairViaGap1=0.25 49 | SilkLineWidth=0.12 50 | SilkTextSizeV=1 51 | SilkTextSizeH=1 52 | SilkTextSizeThickness=0.15 53 | SilkTextItalic=0 54 | SilkTextUpright=1 55 | CopperLineWidth=0.2 56 | CopperTextSizeV=1.5 57 | CopperTextSizeH=1.5 58 | CopperTextThickness=0.3 59 | CopperTextItalic=0 60 | CopperTextUpright=1 61 | EdgeCutLineWidth=0.05 62 | CourtyardLineWidth=0.05 63 | OthersLineWidth=0.15 64 | OthersTextSizeV=1 65 | OthersTextSizeH=1 66 | OthersTextSizeThickness=0.15 67 | OthersTextItalic=0 68 | OthersTextUpright=1 69 | SolderMaskClearance=0 70 | SolderMaskMinWidth=0 71 | SolderPasteClearance=0 72 | SolderPasteRatio=-0 73 | [pcbnew/Layer.F.Cu] 74 | Name=F.Cu 75 | Type=0 76 | Enabled=1 77 | [pcbnew/Layer.In1.Cu] 78 | Name=In1.Cu 79 | Type=0 80 | Enabled=0 81 | [pcbnew/Layer.In2.Cu] 82 | Name=In2.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In3.Cu] 86 | Name=In3.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In4.Cu] 90 | Name=In4.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In5.Cu] 94 | Name=In5.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In6.Cu] 98 | Name=In6.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In7.Cu] 102 | Name=In7.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In8.Cu] 106 | Name=In8.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In9.Cu] 110 | Name=In9.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In10.Cu] 114 | Name=In10.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In11.Cu] 118 | Name=In11.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In12.Cu] 122 | Name=In12.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In13.Cu] 126 | Name=In13.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In14.Cu] 130 | Name=In14.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In15.Cu] 134 | Name=In15.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In16.Cu] 138 | Name=In16.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In17.Cu] 142 | Name=In17.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In18.Cu] 146 | Name=In18.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In19.Cu] 150 | Name=In19.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In20.Cu] 154 | Name=In20.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In21.Cu] 158 | Name=In21.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In22.Cu] 162 | Name=In22.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In23.Cu] 166 | Name=In23.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In24.Cu] 170 | Name=In24.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In25.Cu] 174 | Name=In25.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In26.Cu] 178 | Name=In26.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In27.Cu] 182 | Name=In27.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In28.Cu] 186 | Name=In28.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In29.Cu] 190 | Name=In29.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.In30.Cu] 194 | Name=In30.Cu 195 | Type=0 196 | Enabled=0 197 | [pcbnew/Layer.B.Cu] 198 | Name=B.Cu 199 | Type=0 200 | Enabled=1 201 | [pcbnew/Layer.B.Adhes] 202 | Enabled=1 203 | [pcbnew/Layer.F.Adhes] 204 | Enabled=1 205 | [pcbnew/Layer.B.Paste] 206 | Enabled=1 207 | [pcbnew/Layer.F.Paste] 208 | Enabled=1 209 | [pcbnew/Layer.B.SilkS] 210 | Enabled=1 211 | [pcbnew/Layer.F.SilkS] 212 | Enabled=1 213 | [pcbnew/Layer.B.Mask] 214 | Enabled=1 215 | [pcbnew/Layer.F.Mask] 216 | Enabled=1 217 | [pcbnew/Layer.Dwgs.User] 218 | Enabled=1 219 | [pcbnew/Layer.Cmts.User] 220 | Enabled=1 221 | [pcbnew/Layer.Eco1.User] 222 | Enabled=1 223 | [pcbnew/Layer.Eco2.User] 224 | Enabled=1 225 | [pcbnew/Layer.Edge.Cuts] 226 | Enabled=1 227 | [pcbnew/Layer.Margin] 228 | Enabled=1 229 | [pcbnew/Layer.B.CrtYd] 230 | Enabled=1 231 | [pcbnew/Layer.F.CrtYd] 232 | Enabled=1 233 | [pcbnew/Layer.B.Fab] 234 | Enabled=1 235 | [pcbnew/Layer.F.Fab] 236 | Enabled=1 237 | [pcbnew/Layer.Rescue] 238 | Enabled=0 239 | [pcbnew/Netclasses] 240 | [pcbnew/Netclasses/Default] 241 | Name=Default 242 | Clearance=0.2 243 | TrackWidth=0.25 244 | ViaDiameter=0.8 245 | ViaDrill=0.4 246 | uViaDiameter=0.3 247 | uViaDrill=0.1 248 | dPairWidth=0.2 249 | dPairGap=0.25 250 | dPairViaGap=0.25 251 | -------------------------------------------------------------------------------- /pcb/remove/EEC-IV-Reader.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.049999999999999996, 6 | "copper_line_width": 0.19999999999999998, 7 | "copper_text_italic": false, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "copper_text_upright": false, 12 | "courtyard_line_width": 0.049999999999999996, 13 | "dimension_precision": 4, 14 | "dimension_units": 3, 15 | "dimensions": { 16 | "arrow_length": 1270000, 17 | "extension_offset": 500000, 18 | "keep_text_aligned": true, 19 | "suppress_zeroes": false, 20 | "text_position": 0, 21 | "units_format": 1 22 | }, 23 | "fab_line_width": 0.09999999999999999, 24 | "fab_text_italic": false, 25 | "fab_text_size_h": 1.0, 26 | "fab_text_size_v": 1.0, 27 | "fab_text_thickness": 0.15, 28 | "fab_text_upright": false, 29 | "other_line_width": 0.09999999999999999, 30 | "other_text_italic": false, 31 | "other_text_size_h": 1.0, 32 | "other_text_size_v": 1.0, 33 | "other_text_thickness": 0.15, 34 | "other_text_upright": false, 35 | "pads": { 36 | "drill": 0.762, 37 | "height": 1.524, 38 | "width": 1.524 39 | }, 40 | "silk_line_width": 0.12, 41 | "silk_text_italic": false, 42 | "silk_text_size_h": 1.0, 43 | "silk_text_size_v": 1.0, 44 | "silk_text_thickness": 0.15, 45 | "silk_text_upright": false, 46 | "zones": { 47 | "45_degree_only": false, 48 | "min_clearance": 0.508 49 | } 50 | }, 51 | "diff_pair_dimensions": [], 52 | "drc_exclusions": [], 53 | "meta": { 54 | "filename": "board_design_settings.json", 55 | "version": 2 56 | }, 57 | "rule_severities": { 58 | "annular_width": "error", 59 | "clearance": "error", 60 | "copper_edge_clearance": "error", 61 | "courtyards_overlap": "error", 62 | "diff_pair_gap_out_of_range": "error", 63 | "diff_pair_uncoupled_length_too_long": "error", 64 | "drill_out_of_range": "error", 65 | "duplicate_footprints": "warning", 66 | "extra_footprint": "warning", 67 | "footprint_type_mismatch": "error", 68 | "hole_clearance": "error", 69 | "hole_near_hole": "error", 70 | "invalid_outline": "error", 71 | "item_on_disabled_layer": "error", 72 | "items_not_allowed": "error", 73 | "length_out_of_range": "error", 74 | "malformed_courtyard": "error", 75 | "microvia_drill_out_of_range": "error", 76 | "missing_courtyard": "ignore", 77 | "missing_footprint": "warning", 78 | "net_conflict": "warning", 79 | "npth_inside_courtyard": "ignore", 80 | "padstack": "error", 81 | "pth_inside_courtyard": "ignore", 82 | "shorting_items": "error", 83 | "silk_over_copper": "warning", 84 | "silk_overlap": "warning", 85 | "skew_out_of_range": "error", 86 | "through_hole_pad_without_hole": "error", 87 | "too_many_vias": "error", 88 | "track_dangling": "warning", 89 | "track_width": "error", 90 | "tracks_crossing": "error", 91 | "unconnected_items": "error", 92 | "unresolved_variable": "error", 93 | "via_dangling": "warning", 94 | "zone_has_empty_net": "error", 95 | "zones_intersect": "error" 96 | }, 97 | "rule_severitieslegacy_courtyards_overlap": true, 98 | "rule_severitieslegacy_no_courtyard_defined": false, 99 | "rules": { 100 | "allow_blind_buried_vias": false, 101 | "allow_microvias": false, 102 | "max_error": 0.005, 103 | "min_clearance": 0.0, 104 | "min_copper_edge_clearance": 0.024999999999999998, 105 | "min_hole_clearance": 0.25, 106 | "min_hole_to_hole": 0.25, 107 | "min_microvia_diameter": 0.19999999999999998, 108 | "min_microvia_drill": 0.09999999999999999, 109 | "min_silk_clearance": 0.0, 110 | "min_through_hole_diameter": 0.3, 111 | "min_track_width": 0.19999999999999998, 112 | "min_via_annular_width": 0.049999999999999996, 113 | "min_via_diameter": 0.39999999999999997, 114 | "use_height_for_length_calcs": true 115 | }, 116 | "track_widths": [ 117 | 0.0, 118 | 0.3, 119 | 0.5 120 | ], 121 | "via_dimensions": [], 122 | "zones_allow_external_fillets": false, 123 | "zones_use_no_outline": true 124 | }, 125 | "layer_presets": [] 126 | }, 127 | "boards": [], 128 | "cvpcb": { 129 | "equivalence_files": [] 130 | }, 131 | "libraries": { 132 | "pinned_footprint_libs": [], 133 | "pinned_symbol_libs": [] 134 | }, 135 | "meta": { 136 | "filename": "EEC-IV-Reader.kicad_pro", 137 | "version": 1 138 | }, 139 | "net_settings": { 140 | "classes": [ 141 | { 142 | "bus_width": 12.0, 143 | "clearance": 0.2, 144 | "diff_pair_gap": 0.25, 145 | "diff_pair_via_gap": 0.25, 146 | "diff_pair_width": 0.2, 147 | "line_style": 0, 148 | "microvia_diameter": 0.3, 149 | "microvia_drill": 0.1, 150 | "name": "Default", 151 | "pcb_color": "rgba(0, 0, 0, 0.000)", 152 | "schematic_color": "rgba(0, 0, 0, 0.000)", 153 | "track_width": 0.25, 154 | "via_diameter": 0.8, 155 | "via_drill": 0.4, 156 | "wire_width": 6.0 157 | } 158 | ], 159 | "meta": { 160 | "version": 2 161 | }, 162 | "net_colors": null 163 | }, 164 | "pcbnew": { 165 | "last_paths": { 166 | "gencad": "", 167 | "idf": "", 168 | "netlist": "EEC-IV-Reader.net", 169 | "specctra_dsn": "", 170 | "step": "", 171 | "vrml": "" 172 | }, 173 | "page_layout_descr_file": "" 174 | }, 175 | "schematic": { 176 | "drawing": { 177 | "default_text_size": 50, 178 | "label_size_ratio": 0.25, 179 | "pin_symbol_size": 0, 180 | "text_offset_ratio": 0.08 181 | }, 182 | "legacy_lib_dir": "", 183 | "legacy_lib_list": [], 184 | "net_format_name": "Pcbnew", 185 | "page_layout_descr_file": "", 186 | "plot_directory": "", 187 | "spice_adjust_passive_values": false, 188 | "subpart_first_id": 65, 189 | "subpart_id_separator": 0 190 | }, 191 | "sheets": [], 192 | "text_variables": {} 193 | } 194 | -------------------------------------------------------------------------------- /test/test_fault_code_util.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "fault_code_util.h" 3 | 4 | void setUp(void) { 5 | // set stuff up here 6 | } 7 | 8 | void tearDown(void) { 9 | // clean stuff up here 10 | } 11 | 12 | void test_createReadableMessage_AllOk() { 13 | const char *messageCode = "111"; 14 | char messageReadable[256]; 15 | createReadableMessage(messageCode, messageReadable, sizeof(messageReadable)); 16 | TEST_ASSERT_EQUAL_STRING("[111] All systems work properly", messageReadable); 17 | } 18 | 19 | void test_createReadableMessage_Error() { 20 | const char *messageCode = "511"; 21 | char messageReadable[256]; 22 | createReadableMessage(messageCode, messageReadable, sizeof(messageReadable)); 23 | TEST_ASSERT_EQUAL_STRING("[511] ECM: ROM error", messageReadable); 24 | } 25 | 26 | void test_createReadableMessage_Unknown() { 27 | const char *messageCode = "abc"; 28 | char messageReadable[256]; 29 | createReadableMessage(messageCode, messageReadable, sizeof(messageReadable)); 30 | TEST_ASSERT_EQUAL_STRING("[abc] Unknown", messageReadable); 31 | } 32 | 33 | void test_splitMessage_emptyLine() { 34 | const char *message = ""; 35 | const unsigned short messageLineSize = 15; 36 | char messageLine1[messageLineSize]; 37 | char messageLine2[messageLineSize]; 38 | char messageLine3[messageLineSize]; 39 | 40 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 41 | 42 | TEST_ASSERT_EQUAL_STRING(messageLine1, ""); 43 | TEST_ASSERT_EQUAL_STRING(messageLine2, ""); 44 | TEST_ASSERT_EQUAL_STRING(messageLine3, ""); 45 | } 46 | 47 | void test_splitMessage_singleLine1() { 48 | const char *message = "abc"; 49 | const unsigned short messageLineSize = 15; 50 | char messageLine1[messageLineSize]; 51 | char messageLine2[messageLineSize]; 52 | char messageLine3[messageLineSize]; 53 | 54 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 55 | 56 | TEST_ASSERT_EQUAL_STRING("abc", messageLine1); 57 | TEST_ASSERT_EQUAL_STRING("", messageLine2); 58 | TEST_ASSERT_EQUAL_STRING("", messageLine3); 59 | } 60 | 61 | void test_splitMessage_singleLine2() { 62 | const char *message = "abc"; 63 | const unsigned short messageLineSize = 4; 64 | char messageLine1[messageLineSize]; 65 | char messageLine2[messageLineSize]; 66 | char messageLine3[messageLineSize]; 67 | 68 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 69 | 70 | TEST_ASSERT_EQUAL_STRING("abc", messageLine1); 71 | TEST_ASSERT_EQUAL_STRING("", messageLine2); 72 | TEST_ASSERT_EQUAL_STRING("", messageLine3); 73 | } 74 | 75 | void test_splitMessage_doubleLine1() { 76 | const char *message = "abcdefghij"; 77 | const unsigned short messageLineSize = 6; 78 | char messageLine1[messageLineSize]; 79 | char messageLine2[messageLineSize]; 80 | char messageLine3[messageLineSize]; 81 | 82 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 83 | 84 | TEST_ASSERT_EQUAL_STRING("abcde", messageLine1); 85 | TEST_ASSERT_EQUAL_STRING("fghij", messageLine2); 86 | TEST_ASSERT_EQUAL_STRING("", messageLine3); 87 | } 88 | 89 | void test_splitMessage_doubleLine2() { 90 | const char *message = "abcdefgh"; 91 | const unsigned short messageLineSize = 6; 92 | char messageLine1[messageLineSize]; 93 | char messageLine2[messageLineSize]; 94 | char messageLine3[messageLineSize]; 95 | 96 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 97 | 98 | TEST_ASSERT_EQUAL_STRING("abcde", messageLine1); 99 | TEST_ASSERT_EQUAL_STRING("fgh", messageLine2); 100 | TEST_ASSERT_EQUAL_STRING("", messageLine3); 101 | } 102 | 103 | 104 | void test_splitMessage_tripleLine1() { 105 | const char *message = "abcdefghijkl"; 106 | const unsigned short messageLineSize = 6; 107 | char messageLine1[messageLineSize]; 108 | char messageLine2[messageLineSize]; 109 | char messageLine3[messageLineSize]; 110 | 111 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 112 | 113 | TEST_ASSERT_EQUAL_STRING("abcde", messageLine1); 114 | TEST_ASSERT_EQUAL_STRING("fghij", messageLine2); 115 | TEST_ASSERT_EQUAL_STRING("kl", messageLine3); 116 | } 117 | 118 | void test_splitMessage_tripleLine2() { 119 | const char *message = "abcdefghijklmno"; 120 | const unsigned short messageLineSize = 6; 121 | char messageLine1[messageLineSize]; 122 | char messageLine2[messageLineSize]; 123 | char messageLine3[messageLineSize]; 124 | 125 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 126 | 127 | TEST_ASSERT_EQUAL_STRING("abcde", messageLine1); 128 | TEST_ASSERT_EQUAL_STRING("fghij", messageLine2); 129 | TEST_ASSERT_EQUAL_STRING("klmno", messageLine3); 130 | } 131 | 132 | void test_splitMessage_tripleLine3() { 133 | const char *message = "abcdefghijklmnopqrst"; 134 | const unsigned short messageLineSize = 6; 135 | char messageLine1[messageLineSize]; 136 | char messageLine2[messageLineSize]; 137 | char messageLine3[messageLineSize]; 138 | 139 | splitMessage(message, messageLine1, messageLine2, messageLine3, messageLineSize); 140 | 141 | TEST_ASSERT_EQUAL_STRING("abcde", messageLine1); 142 | TEST_ASSERT_EQUAL_STRING("fghij", messageLine2); 143 | TEST_ASSERT_EQUAL_STRING("klmno", messageLine3); 144 | } 145 | 146 | void test_createReadableSplittedMessage() { 147 | const char *faultCode = "111"; 148 | const unsigned short messageLineSize = 10; 149 | char messageLine1[messageLineSize]; 150 | char messageLine2[messageLineSize]; 151 | char messageLine3[messageLineSize]; 152 | 153 | createReadableSplittedMessage(faultCode, messageLine1, messageLine2, messageLine3, messageLineSize); 154 | 155 | TEST_ASSERT_EQUAL_STRING("[111] All", messageLine1); 156 | TEST_ASSERT_EQUAL_STRING(" systems ", messageLine2); 157 | TEST_ASSERT_EQUAL_STRING("work prop", messageLine3); 158 | } 159 | 160 | int main( int argc, char **argv) { 161 | UNITY_BEGIN(); 162 | 163 | RUN_TEST(test_createReadableMessage_AllOk); 164 | RUN_TEST(test_createReadableMessage_Error); 165 | RUN_TEST(test_createReadableMessage_Unknown); 166 | 167 | RUN_TEST(test_splitMessage_emptyLine); 168 | RUN_TEST(test_splitMessage_singleLine1); 169 | RUN_TEST(test_splitMessage_singleLine2); 170 | RUN_TEST(test_splitMessage_doubleLine1); 171 | RUN_TEST(test_splitMessage_doubleLine2); 172 | RUN_TEST(test_splitMessage_tripleLine1); 173 | RUN_TEST(test_splitMessage_tripleLine2); 174 | RUN_TEST(test_splitMessage_tripleLine3); 175 | 176 | RUN_TEST(test_createReadableSplittedMessage); 177 | 178 | UNITY_END(); 179 | } -------------------------------------------------------------------------------- /src/Cart.cpp: -------------------------------------------------------------------------------- 1 | #include "Cart.h" 2 | 3 | const uint8_t Cart::startMessage[11] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x01, 0x04, 0x00, 0x00, 0x00, 0x05 6 | }; 7 | 8 | Cart::Cart(SoftwareSerial* softwareSerial, uint8_t pin_re) { 9 | this->softwareSerial = softwareSerial; 10 | this->pin_re = pin_re; 11 | pinMode(pin_re, OUTPUT); 12 | 13 | reset(); 14 | } 15 | 16 | void Cart::reset() { 17 | currentDiagnosticMode = 0; 18 | isSynced = false; 19 | frameDone = true; 20 | enableDiagnosticParameterSending = false; 21 | diagnosticParameterSendingDone = false; 22 | hasData = false; 23 | 24 | mode = WAIT_SYNC; 25 | diagnosticParameterPointer = 0; 26 | frameNumber = 0; 27 | wordBufferPointer = 0; 28 | 29 | digitalWrite(pin_re, RE_READ); 30 | } 31 | 32 | void Cart::sendStartMessage() { 33 | digitalWrite(pin_re, RE_WRITE); 34 | 35 | for(uint8_t i = 0; iwrite(startMessage[i]); 37 | delayMicroseconds(420); 38 | } 39 | 40 | digitalWrite(pin_re, RE_READ); 41 | } 42 | 43 | void Cart::setBaudrate(long baudrate) { 44 | softwareSerial->begin(baudrate); 45 | switch (baudrate) { 46 | case 2400: 47 | delay.word = 1700; 48 | delay.byte = 60; 49 | break; 50 | case 9600: 51 | delay.word = 426; 52 | delay.byte = 15; 53 | break; 54 | case 19200: 55 | delay.word = 213; 56 | delay.byte = 7; 57 | break; 58 | } 59 | 60 | isSynced = false; 61 | } 62 | 63 | 64 | void Cart::loop() { 65 | // if in diag param slot, we don't wait for bytes 66 | // just send the parameter and return 67 | if (mode == DIAG_PARAM_SLOT) { 68 | if (enableDiagnosticParameterSending && diagnosticParameterPointer == idSlot.frameNumber*2) { 69 | delayMicroseconds(delay.word); 70 | digitalWrite(pin_re, RE_WRITE); 71 | softwareSerial->write(diagnosticParameter[diagnosticParameterPointer]); 72 | delayMicroseconds(delay.byte); 73 | softwareSerial->write(diagnosticParameter[diagnosticParameterPointer+1]); 74 | 75 | digitalWrite(pin_re, RE_READ); 76 | 77 | diagnosticParameterPointer+=2; 78 | 79 | if (diagnosticParameterPointer > 7) { 80 | diagnosticParameterPointer = 0; 81 | diagnosticParameterSendingDone = true; 82 | } 83 | 84 | } 85 | 86 | mode = DATA_SLOT; 87 | return; 88 | } 89 | 90 | if (mode == DATA_SLOT) { 91 | if (enablePidMapSending && pidMapPointer == idSlot.frameNumber && pidMapPointer < 12) { 92 | digitalWrite(pin_re, RE_WRITE); 93 | for (uint8_t i = 0; i < 4; i++) { 94 | uint8_t pid = pidMap[pidMapPointer][i]; 95 | delayMicroseconds(delay.word); 96 | softwareSerial->write(pid); 97 | delayMicroseconds(delay.byte); 98 | softwareSerial->write(PID_CHECKSUM(pid)); 99 | } 100 | pidMapPointer++; 101 | 102 | if (pidMapPointer >= 12) { 103 | pidMapSendingDone = true; 104 | enablePidMapSending = false; 105 | pidMapPointer = 0; 106 | } 107 | digitalWrite(pin_re, RE_READ); 108 | 109 | mode = WAIT_SYNC; 110 | } 111 | } 112 | 113 | // read next byte and check if we have a full word already 114 | if (pushAvailableToBuffer()) { 115 | 116 | wordBufferPointer++; 117 | if (wordBufferPointer < 2) { 118 | // buffer not full, wait for next byte 119 | return; 120 | } 121 | 122 | // always look out for sync word and stop everything else if 123 | // we find one 124 | if (isBufferSync()) { 125 | // look for ID slot 126 | mode = ID_SLOT; 127 | 128 | //Serial.print('.'); 129 | 130 | // reset for next word 131 | wordBufferPointer = 0; 132 | return; 133 | } 134 | 135 | /* 136 | char debugBuf[24]; 137 | sprintf(debugBuf, "0x%02X 0x%02X", wordBuffer[0], wordBuffer[1]); 138 | Serial.println(debugBuf); 139 | */ 140 | 141 | switch(mode) { 142 | case WAIT_SYNC: 143 | // do nothing as we wait for next sync. 144 | // return not break because the current word might contain part of a 145 | // sync word. 146 | return; 147 | case ID_SLOT: 148 | 149 | if (frameNumber > 15) { 150 | frameNumber = 0; 151 | isSynced = true; 152 | frameDone = true; 153 | } 154 | 155 | memcpy(&idSlot, wordBuffer, 2); 156 | 157 | // parity check 158 | if (((idSlot.rpm & 0xF) ^ ((idSlot.rpm >> 4) & 0xF) ^ idSlot.frameNumber ^ 0xA) != idSlot.parity) { 159 | Serial.println("ID-Slot parity error"); 160 | frameNumber = 0; 161 | mode = WAIT_SYNC; 162 | // only return and not reset buffer and buffer pointer. If there was a 0x00 in the buffer 163 | // we would miss this for syncing 164 | return; 165 | } 166 | 167 | // if the we find the wrong frame number, we start again 168 | if (frameNumber != idSlot.frameNumber) { 169 | //Serial.println("Frame number error"); 170 | frameNumber = 0; 171 | mode = WAIT_SYNC; 172 | return; 173 | } 174 | 175 | frameNumber++; 176 | dataWordCounter = 0; 177 | 178 | if (idSlot.frameNumber < 4) { 179 | mode = DIAG_PARAM_SLOT; 180 | } else { 181 | mode = STATUS_SLOT; 182 | } 183 | break; 184 | case DIAG_PARAM_SLOT: 185 | // this cannot be reached, as we don't care about word 186 | // reading in this mode 187 | break; 188 | case STATUS_SLOT: 189 | handleStatusSlot(); 190 | mode = DATA_SLOT; 191 | break; 192 | case DATA_SLOT: 193 | dataWordCounter++; 194 | // prevent beeing stuck in capturing live data 195 | // there is only space for 5 words 196 | if (dataWordCounter > 5) { 197 | mode = WAIT_SYNC; 198 | break; 199 | } 200 | memcpy(data, wordBuffer, 2); 201 | hasData = true; 202 | break; 203 | } 204 | 205 | // reset for next word 206 | wordBufferPointer = 0; 207 | } 208 | 209 | } 210 | 211 | void Cart::handleStatusSlot() { 212 | // TODO check parity 213 | switch (idSlot.frameNumber) { 214 | case CURRENT_DIAGNOSTIC_MODE: 215 | currentDiagnosticMode = wordBuffer[0]; 216 | break; 217 | case NEXT_DIAGNOSTIC_MODE: 218 | nextDiagnosticMode = wordBuffer[0]; 219 | break; 220 | case DCL_ERROR_FLAG_LOW: 221 | memcpy(&dclErrorFlagLow, wordBuffer, 1); 222 | break; 223 | case DCL_ERROR_FLAG_HIGH: 224 | memcpy(&dclErrorFlagHigh, wordBuffer, 1); 225 | break; 226 | } 227 | } 228 | 229 | void Cart::getData(uint8_t *data) { 230 | memcpy(data, this->data, 2); 231 | hasData = false; 232 | } 233 | 234 | void Cart::setDiagnosticParameter(const uint8_t diagnosticParameter[]) { 235 | memcpy(this->diagnosticParameter, diagnosticParameter, 8); 236 | enableDiagnosticParameterSending = true; 237 | diagnosticParameterSendingDone = false; 238 | } 239 | 240 | void Cart::setPidMap(const uint8_t pidMap[12][4]) { 241 | memcpy(this->pidMap, pidMap, sizeof(this->pidMap)); 242 | enablePidMapSending = true; 243 | pidMapSendingDone = false; 244 | } 245 | 246 | bool Cart::isBufferSync() { 247 | return !(wordBuffer[0] | wordBuffer[1]); 248 | } 249 | 250 | uint8_t Cart::pushAvailableToBuffer() { 251 | if (softwareSerial->available()) { 252 | pushBuffer(softwareSerial->read()); 253 | return 1; 254 | } else { 255 | return 0; 256 | } 257 | } 258 | 259 | void Cart::pushBuffer(uint8_t val) { 260 | wordBuffer[0] = wordBuffer[1]; 261 | wordBuffer[1] = val; 262 | } -------------------------------------------------------------------------------- /src/EecIv.cpp: -------------------------------------------------------------------------------- 1 | #include "EecIv.h" 2 | 3 | EecIv::EecIv(int di, int ro, int re) { 4 | cart = new Cart(new SoftwareSerial(di, ro), re); 5 | } 6 | 7 | const uint8_t EecIv::pidMap[12][4] = { 8 | { 9 | 0x01, // Engine Revolution 10 | 0x02, // Manifold Absolute Pressure 11 | 0x03, // Barometric Pressure 12 | 0x04, // Total spark advance 13 | }, { 14 | 0x05, // ACT Sensor 15 | 0x06, // ECT Sensor 16 | 0x07, // EVP or EPT sensor 17 | 0x08, // Lambda (IEGO1) 18 | }, { 19 | 0x09, // Throttle Position 20 | 0x0A, // Not Used? 21 | 0x0B, // Calibration input voltage 22 | 0x0C, // Fuel Pulsewidth 23 | }, { 24 | 0x0D, // LAMBDA equivalence ratio 25 | 0x0E, // throttle mode 26 | 0x0F, // air temp (c) 27 | 0x10, // ECT Fahrenheit 28 | }, { 29 | 0x11, // Supply Voltage 30 | 0x12, // SCAP sensor 31 | 0x13, // EGR Duty Cycle 32 | 0x14, // Not Used 33 | }, { 34 | 0x15, // idle speed duty 35 | 0x16, // airflow meter 36 | 0x17, // speed 37 | 0x18, // Speed?? 38 | }, { 39 | 0x19, 40 | 0x1A, // bitmap 0 41 | 0x1B, // bitmap 1 42 | 0x1C, // Not Used 43 | }, { 44 | 0x1D, // Not used 45 | 0x26, // Not used 46 | 0x27, // Normalized air charge value 47 | 0x28, // Adaptive fuel correction. 48 | }, { 49 | 0x29, // Not used 50 | 0x2A, // Desired rpm. 51 | 0x2B, // Ratch 52 | 0x2C, // Not used 53 | }, { 54 | 0x2D, // Time since startup 55 | 0x2E, // OCC A/D input level. 56 | 0x2F, // Neutral / drive input. 57 | 0x30, // Converter clutch commanded state 58 | }, { 59 | 0x31, // Not used 60 | 0x32, // Commanded gear for shift solenoids. 61 | 0x33, // Not used 62 | 0x34, // Not used 63 | }, { 64 | 0x35, // Actual ETV monitor voltage, counts 65 | 0x36, // EPC pressure, psi. 66 | 0x37, // Transmission Oil temperature, counts. 67 | 0x38 // Current PRNDL position. 68 | } 69 | }; 70 | 71 | void EecIv::restartReading() { 72 | debugPrint("Check if ECU is in diag mode"); 73 | currentState = CHECK_IF_IN_DIAG_MODE; 74 | } 75 | 76 | void EecIv::setMode(EecIv::OperationMode mode) { 77 | this->mode = mode; 78 | } 79 | 80 | void EecIv::mainLoop() { 81 | switch(currentState) { 82 | case IDLE: 83 | startMessageCounter = 0; 84 | break; 85 | 86 | case CHECK_IF_IN_DIAG_MODE: 87 | cart->reset(); 88 | cart->setBaudrate(2400); 89 | initTimeoutTimer(); 90 | currentState = WAIT_FOR_SYNC_2400; 91 | break; 92 | 93 | case SEND_START_MESSAGE: 94 | if(startMessageCounter >= startMessageCounterMax) { 95 | onStartMessageTimeout(); 96 | currentState = IDLE; 97 | break; 98 | } 99 | cart->setBaudrate(2400); 100 | cart->sendStartMessage(); 101 | 102 | startMessageCounter++; 103 | debugPrint("Send start message"); 104 | currentState = CHANGE_BAUD_RATE_9600; 105 | break; 106 | 107 | case CHANGE_BAUD_RATE_9600: 108 | cart->setBaudrate(9600); 109 | //cart->setBaudrate(19200); 110 | initTimeoutTimer(); 111 | currentState = WAIT_FOR_SYNC_9600; 112 | break; 113 | case WAIT_FOR_SYNC_9600: 114 | if (cart->isSynced) { 115 | debugPrint("Synced with default baud"); 116 | startMessageCounter = 0; 117 | currentState = REQUEST_BAUD_RATE_CHANGE; 118 | } else { 119 | if(exceededTimeout()) { 120 | debugPrint("Exceeded waiting for sync in default baud"); 121 | currentState = SEND_START_MESSAGE; 122 | } 123 | } 124 | break; 125 | 126 | case REQUEST_BAUD_RATE_CHANGE: 127 | { 128 | const uint8_t baudMessage[8] = { 129 | 0x01, 0xb0, 0xff, 0x5f, 0x81, 0x74, 0x00, 0xa0 130 | }; 131 | cart->setDiagnosticParameter(baudMessage); 132 | currentState = WAIT_REQUEST_BAUD_RATE_CHANGE_DONE; 133 | break; 134 | } 135 | case WAIT_REQUEST_BAUD_RATE_CHANGE_DONE: 136 | if (cart->diagnosticParameterSendingDone) { 137 | currentState = CHANGE_BAUD_RATE_2400; 138 | } 139 | break; 140 | case CHANGE_BAUD_RATE_2400: 141 | cart->setBaudrate(2400); 142 | initTimeoutTimer(); 143 | currentState = WAIT_FOR_SYNC_2400; 144 | break; 145 | case WAIT_FOR_SYNC_2400: 146 | if (cart->isSynced) { 147 | debugPrint("Synced with 2400"); 148 | currentState = REQUEST_CLEAR_DCL_ERRORS; 149 | } else { 150 | if(exceededTimeout()) { 151 | debugPrint("Exceeded waiting for sync 2400"); 152 | currentState = SEND_START_MESSAGE; 153 | } 154 | } 155 | break; 156 | case REQUEST_CLEAR_DCL_ERRORS: 157 | { 158 | const uint8_t clearDclMessage[8] = { 159 | 0x01, 0xb0, 0xff, 0x5f, 0x01, 0xf4, 0x00, 0xa0 160 | }; 161 | cart->setDiagnosticParameter(clearDclMessage); 162 | currentState = WAIT_REQUEST_CLEAR_DCL_ERRORS; 163 | break; 164 | } 165 | case WAIT_REQUEST_CLEAR_DCL_ERRORS: 166 | if (cart->currentDiagnosticMode == 0x01) { 167 | debugPrint("DCL Errors cleared"); 168 | if (mode == READ_FAULTS) { 169 | currentState = REQUEST_CONT_SELF_TEST_CODES; 170 | } else if (mode == KOEO) { 171 | currentState = REQUEST_KOEO; 172 | } else if (mode == LIVE_DATA) { 173 | currentState = REQUEST_PID_MODE; 174 | } else { 175 | currentState = IDLE; 176 | } 177 | } 178 | break; 179 | 180 | case REQUEST_CONT_SELF_TEST_CODES: 181 | { 182 | const uint8_t contSelfTestCodesMessage[8] = { 183 | 0x01, 0xb0, 0xff, 0x5f, 0x26, 0xa4, 0x00, 0xa0 184 | }; 185 | cart->setDiagnosticParameter(contSelfTestCodesMessage); 186 | currentState = WAIT_REQUEST_CONT_SELF_TEST_CODES; 187 | break; 188 | } 189 | case WAIT_REQUEST_CONT_SELF_TEST_CODES: 190 | if (cart->nextDiagnosticMode == 0x26) { 191 | currentState = READ_CONT_SELF_TEST_CODES; 192 | cart->hasData = false; 193 | } 194 | break; 195 | case READ_CONT_SELF_TEST_CODES: 196 | if (cart->hasData) { 197 | uint8_t data[2]; 198 | cart->getData(data); 199 | onFaultCodeRead(data); 200 | } 201 | if (cart->dclErrorFlagHigh.selfTestComplete) { 202 | Serial.println("Self Test complete"); 203 | 204 | onFaultCodeFinished(); 205 | cart->enableDiagnosticParameterSending = false; 206 | currentState = IDLE; 207 | } 208 | break; 209 | 210 | case REQUEST_KOEO: 211 | { 212 | const uint8_t koeoMessage[8] = { 213 | 0x01, 0xb0, 0xff, 0x5f, 0x25, 0x94, 0x00, 0xa0 214 | }; 215 | cart->setDiagnosticParameter(koeoMessage); 216 | currentState = WAIT_REQUEST_KOEO; 217 | break; 218 | } 219 | case WAIT_REQUEST_KOEO: 220 | if (cart->currentDiagnosticMode == 0x25) { 221 | currentState = READ_KOEO; 222 | cart->hasData = false; 223 | } 224 | break; 225 | case READ_KOEO: 226 | if (cart->hasData) { 227 | koeoCounter++; 228 | 229 | // set flag to know when current frame ends 230 | if (koeoCounter == 1) { 231 | cart->frameDone = false; 232 | } 233 | 234 | uint8_t data[2]; 235 | cart->getData(data); 236 | onFaultCodeRead(data); 237 | } 238 | 239 | if (koeoCounter > 0 && cart->frameDone) { 240 | koeoCounter = 0; 241 | onFaultCodeFinished(); 242 | currentState = IDLE; 243 | cart->enableDiagnosticParameterSending = false; 244 | } 245 | break; 246 | case REQUEST_PID_MODE: 247 | { 248 | const uint8_t pidMessage[8] = { 249 | 0x01, 0xb0, 0xff, 0x5f, 0x41, 0x96, 0x00, 0xa0 250 | }; 251 | cart->setDiagnosticParameter(pidMessage); 252 | currentState = WAIT_PID_MODE; 253 | break; 254 | } 255 | case WAIT_PID_MODE: 256 | if (cart->nextDiagnosticMode == 0x41) { 257 | currentState = TRANSMIT_PID_MAP; 258 | } 259 | break; 260 | case TRANSMIT_PID_MAP: 261 | { 262 | const uint8_t pidMessage[8] = { 263 | 0x01, 0xb0, 0xff, 0x5f, 0x21, 0xF6, 0x00, 0xa0 264 | }; 265 | 266 | cart->setDiagnosticParameter(pidMessage); 267 | cart->setPidMap(pidMap); 268 | currentState = WAIT_TRANSMIT_PID_MAP; 269 | break; 270 | } 271 | case WAIT_TRANSMIT_PID_MAP: 272 | if (cart->pidMapSendingDone) { 273 | Serial.println("PID done"); 274 | currentState = WAIT_PID_DATA; 275 | } 276 | break; 277 | case WAIT_PID_DATA: 278 | if (cart->hasData) { 279 | // frame changed so this will be the first data bit 280 | if (liveDataLastFrame != cart->idSlot.frameNumber) { 281 | liveDataLastFrame = cart->idSlot.frameNumber; 282 | liveDataOffset = 0; 283 | } 284 | cart->getData(liveDataBuf+liveDataOffset); 285 | 286 | liveDataOffset += 2; 287 | 288 | if (liveDataOffset >= 8) { 289 | uint8_t liveDataWithName[12]; 290 | for (uint8_t i = 0; i < 4; i++) { 291 | liveDataWithName[i*3 + 0] = pidMap[liveDataLastFrame][i]; 292 | liveDataWithName[i*3 + 1] = liveDataBuf[i*2 + 0]; 293 | liveDataWithName[i*3 + 2] = liveDataBuf[i*2 + 1]; 294 | } 295 | Serial.write("\x01\x23\x03", 3); 296 | Serial.write(liveDataWithName, 12); 297 | Serial.println(); 298 | liveDataOffset = 0; 299 | } 300 | } 301 | break; 302 | } 303 | 304 | cart->loop(); 305 | } 306 | 307 | int EecIv::exceededTimeout() { 308 | if (millis() > timeoutTimer + timeoutMax) { 309 | return 1; 310 | } 311 | return 0; 312 | } 313 | 314 | void EecIv::initTimeoutTimer() { 315 | timeoutTimer = millis(); 316 | } 317 | 318 | -------------------------------------------------------------------------------- /src/EecIvReader.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "EecIv.h" 6 | 7 | extern "C" { 8 | #include "version.h" 9 | } 10 | 11 | // Pins RS485 12 | #define DI 2 13 | #define RE 3 14 | #define RO 4 15 | // first board 16 | //#define DI 3 17 | //#define RE 6 18 | //#define RO 2 19 | 20 | // Pins Buttons 21 | #define BTN_1 7 22 | #define BTN_2 8 23 | #define BTN_3 9 24 | 25 | 26 | OneButton button1(BTN_1, false, false); 27 | OneButton button2(BTN_2, false, false); 28 | OneButton button3(BTN_3, false, false); 29 | 30 | #define UP_SIGN '\x8c' 31 | #define DOWN_SIGN '\x8e' 32 | #define SELECT_SIGN '\xbb' 33 | #define BACK_SIGN '\xab' 34 | #define NO_SIGN ' ' 35 | #define NUM_COLUMN 16 36 | #define NUM_ROW 8 37 | #define HEADING_SELECT "Select Mode" 38 | 39 | 40 | U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); 41 | 42 | void serialPrint(const char message[]) { 43 | Serial.println(message); 44 | } 45 | 46 | void onFaultCodeRead(const uint8_t message[]); 47 | void onFaultCodeFinished(); 48 | void onStartMessageTimeout(); 49 | 50 | 51 | char liveDataBuf[32]; 52 | void onLiveData(const uint8_t data[]); 53 | 54 | void onButtonUp(); 55 | void onButtonDown(); 56 | void onButtonSelect(); 57 | 58 | void selectMode(); 59 | void showMainMenu(); 60 | void switchFaultCode(bool down); 61 | void switchMainMenuMode(bool down); 62 | 63 | void drawWelcomeScreen(); 64 | void drawMenuScreen(const char selectSign, const char upSign, const char downSign, const char heading[], const char bodyLine1[], const char bodyLine2[], const char bodyLine3[]); 65 | 66 | 67 | EecIv eecIv (DI, RO, RE); 68 | 69 | #define NUM_MAIN_MENU_MODES 3 70 | enum MAIN_MENU_MODE { 71 | FAULT_CODE, 72 | KOEO, 73 | LIVE_DATA 74 | }; 75 | 76 | MAIN_MENU_MODE mainMenuMode = FAULT_CODE; 77 | 78 | enum SCREEN_MODE { 79 | MAIN_MENU, 80 | START_MESSAGE_TIMEOUT, 81 | READING_FAULT_CODE, 82 | RESULT_FAULT_CODE, 83 | RUNNING_KOEO, 84 | RESULT_KOEO 85 | }; 86 | SCREEN_MODE screenMode = MAIN_MENU; 87 | 88 | 89 | uint8_t fault_codes[12][2]; 90 | uint8_t fault_code_pointer = 0; 91 | bool fault_codes_done = false; 92 | uint8_t fault_code_display_pointer = 0; // index for showing koeo 93 | char koeo_i_max = -1; // maximum index of koeos, -1 if none found 94 | 95 | void setup() { 96 | Serial.begin(19200); 97 | 98 | u8x8.begin(); 99 | 100 | button1.attachClick(onButtonUp); 101 | button2.attachClick(onButtonSelect); 102 | button3.attachClick(onButtonDown); 103 | 104 | eecIv.debugPrint = &serialPrint; 105 | eecIv.onFaultCodeRead = &onFaultCodeRead; 106 | eecIv.onFaultCodeFinished = &onFaultCodeFinished; 107 | eecIv.onStartMessageTimeout = &onStartMessageTimeout; 108 | 109 | eecIv.onLiveData = &onLiveData; 110 | 111 | drawWelcomeScreen(); 112 | delay(2000); 113 | showMainMenu(); 114 | Serial.println(); 115 | Serial.write("\x01\x23\x00", 3); 116 | Serial.println(); 117 | } 118 | 119 | void drawWelcomeScreen() { 120 | u8x8.clear(); 121 | u8x8.setFont(u8x8_font_8x13_1x2_f); 122 | u8x8.drawString(1, 3, "EEC IV Reader"); 123 | u8x8.drawString(1, 5, VERSION); 124 | } 125 | 126 | void drawWaitingScreen() { 127 | u8x8.clear(); 128 | 129 | u8x8.setFont(u8x8_font_8x13_1x2_f); 130 | u8x8.drawString(1, 3, "Reading..."); 131 | } 132 | 133 | void drawLiveDataWaitingScreen() { 134 | u8x8.clear(); 135 | 136 | u8x8.setFont(u8x8_font_8x13_1x2_f); 137 | u8x8.drawString(1, 1, "Reading..."); 138 | u8x8.drawString(1, 3, "Use GUI to"); 139 | u8x8.drawString(1, 5, "display!"); 140 | } 141 | 142 | void drawMenuScreen(const char selectSign, const char upSign, const char downSign, const char heading[], const char bodyLine1[], const char bodyLine2[], const char bodyLine3[]) { 143 | u8x8.clear(); 144 | 145 | u8x8.setFont(u8x8_font_8x13B_1x2_f); 146 | u8x8.drawString(1, 0, heading); // 15 147 | u8x8.setFont(u8x8_font_8x13_1x2_f); 148 | u8x8.drawString(0, 2, bodyLine1); // 15 149 | u8x8.drawString(0, 4, bodyLine2); // 15 150 | u8x8.drawString(0, 6, bodyLine3); // 14 151 | 152 | u8x8.setFont(u8x8_font_amstrad_cpc_extended_f); 153 | u8x8.drawGlyph(NUM_COLUMN - 1, NUM_ROW/2 - 1, selectSign); 154 | u8x8.drawGlyph(NUM_COLUMN - 2, NUM_ROW - 1, upSign); 155 | u8x8.drawGlyph(NUM_COLUMN - 1, NUM_ROW - 1, downSign); 156 | } 157 | 158 | void loop() { 159 | button1.tick(); 160 | button2.tick(); 161 | button3.tick(); 162 | 163 | eecIv.mainLoop(); 164 | } 165 | 166 | void onButtonUp() { 167 | switch(screenMode) { 168 | case MAIN_MENU: 169 | switchMainMenuMode(false); 170 | break; 171 | case RESULT_KOEO: 172 | switchFaultCode(true); 173 | break; 174 | case START_MESSAGE_TIMEOUT: 175 | case RESULT_FAULT_CODE: 176 | showMainMenu(); 177 | break; 178 | case READING_FAULT_CODE: 179 | case RUNNING_KOEO: 180 | break; 181 | } 182 | } 183 | 184 | void onButtonDown() { 185 | switch(screenMode) { 186 | case MAIN_MENU: 187 | switchMainMenuMode(true); 188 | break; 189 | case RESULT_KOEO: 190 | switchFaultCode(false); 191 | break; 192 | case START_MESSAGE_TIMEOUT: 193 | case RESULT_FAULT_CODE: 194 | showMainMenu(); 195 | break; 196 | case READING_FAULT_CODE: 197 | case RUNNING_KOEO: 198 | break; 199 | } 200 | } 201 | 202 | void onButtonSelect() { 203 | switch(screenMode) { 204 | case MAIN_MENU: 205 | selectMode(); 206 | break; 207 | case START_MESSAGE_TIMEOUT: 208 | case RESULT_KOEO: 209 | case RESULT_FAULT_CODE: 210 | showMainMenu(); 211 | break; 212 | case READING_FAULT_CODE: 213 | case RUNNING_KOEO: 214 | break; 215 | } 216 | } 217 | 218 | void showMainMenu() { 219 | eecIv.setMode(EecIv::OperationMode::READ_FAULTS); 220 | screenMode = MAIN_MENU; 221 | mainMenuMode = FAULT_CODE; 222 | drawMenuScreen(SELECT_SIGN, UP_SIGN, DOWN_SIGN, HEADING_SELECT, "[1] Read Fault ", "Code Memory", ""); 223 | } 224 | 225 | void switchMainMenuMode(bool down) { 226 | mainMenuMode = down ? (MAIN_MENU_MODE)((mainMenuMode+1)%NUM_MAIN_MENU_MODES) : (MAIN_MENU_MODE)((mainMenuMode+NUM_MAIN_MENU_MODES-1)%NUM_MAIN_MENU_MODES); 227 | switch (mainMenuMode) { 228 | case FAULT_CODE: 229 | drawMenuScreen(SELECT_SIGN, UP_SIGN, DOWN_SIGN, HEADING_SELECT, "[1] Read Fault ", "Code Memory", ""); 230 | break; 231 | case KOEO: 232 | drawMenuScreen(SELECT_SIGN, UP_SIGN, DOWN_SIGN, HEADING_SELECT, "[2] Run System ", "Test", ""); 233 | break; 234 | #if true 235 | case LIVE_DATA: 236 | drawMenuScreen(SELECT_SIGN, UP_SIGN, DOWN_SIGN, HEADING_SELECT, "[3] Live Data", "(GUI needed)", ""); 237 | break; 238 | #endif 239 | } 240 | } 241 | 242 | void selectMode() { 243 | switch (mainMenuMode) { 244 | case FAULT_CODE: 245 | Serial.write("\x01\x23\x02\x01", 4); 246 | Serial.println(); 247 | 248 | eecIv.setMode(EecIv::OperationMode::READ_FAULTS); 249 | eecIv.restartReading(); 250 | screenMode = READING_FAULT_CODE; 251 | drawWaitingScreen(); 252 | fault_codes_done = false; 253 | fault_code_pointer = 0; 254 | break; 255 | case KOEO: 256 | Serial.write("\x01\x23\x02\x02", 4); 257 | Serial.println(); 258 | 259 | eecIv.setMode(EecIv::OperationMode::KOEO); 260 | eecIv.restartReading(); 261 | screenMode = RUNNING_KOEO; 262 | drawWaitingScreen(); 263 | fault_codes_done = false; 264 | fault_code_pointer = 0; 265 | break; 266 | #if true 267 | case LIVE_DATA: 268 | Serial.write("\x01\x23\x02\x03", 4); 269 | Serial.println(); 270 | 271 | eecIv.setMode(EecIv::OperationMode::LIVE_DATA); 272 | eecIv.restartReading(); 273 | screenMode = READING_FAULT_CODE; 274 | drawLiveDataWaitingScreen(); 275 | break; 276 | #endif 277 | } 278 | } 279 | 280 | void onStartMessageTimeout() { 281 | Serial.write("\x01\x23\x01", 3); 282 | Serial.println(); 283 | 284 | screenMode = RESULT_FAULT_CODE; 285 | drawMenuScreen(BACK_SIGN, NO_SIGN, NO_SIGN, "Timeout Error", "Is the igni-", "tion on?", ""); 286 | } 287 | 288 | void switchFaultCode(bool down) { 289 | fault_code_display_pointer = down ? 290 | (fault_code_display_pointer+koeo_i_max)%(koeo_i_max+1) : 291 | (fault_code_display_pointer+1)%(koeo_i_max+1); 292 | 293 | char code_buf[16]; 294 | 295 | sprintf(code_buf, "[%0d] %01X%02X", 296 | fault_code_display_pointer+1, 297 | fault_codes[fault_code_display_pointer][1] & 0xF, 298 | fault_codes[fault_code_display_pointer][0]); 299 | drawMenuScreen(BACK_SIGN, UP_SIGN, DOWN_SIGN, "Fault Code", code_buf, "", ""); 300 | } 301 | 302 | void onFaultCodeRead(const uint8_t data[]) { 303 | if (fault_codes_done) { 304 | return; 305 | } 306 | 307 | Serial.println("onfaultcode"); 308 | 309 | // just to be save here... 310 | if (fault_code_pointer >= 12) { 311 | fault_code_pointer = 0; 312 | } 313 | 314 | memcpy(fault_codes[fault_code_pointer], data, 2); 315 | fault_code_pointer++; 316 | } 317 | 318 | void onFaultCodeFinished() { 319 | char code_buf[16]; 320 | 321 | fault_codes_done = true; 322 | koeo_i_max = fault_code_pointer-1; 323 | 324 | sprintf(code_buf, "Fault codes\n%d", fault_code_pointer); 325 | Serial.println(code_buf); 326 | 327 | uint8_t fault_code_serial[24] = {0}; 328 | for(uint8_t i = 0; i 2 | 3 | 4 | C:\Users\Fernando\Documents\KiCad\EEC-IV-Reader\EEC-IV-Reader.sch 5 | 04/07/22 15:32:48 6 | Eeschema (5.1.10)-1 7 | 8 | 9 | 10 | <company/> 11 | <rev/> 12 | <date/> 13 | <source>EEC-IV-Reader.sch</source> 14 | <comment number="1" value=""/> 15 | <comment number="2" value=""/> 16 | <comment number="3" value=""/> 17 | <comment number="4" value=""/> 18 | </title_block> 19 | </sheet> 20 | </design> 21 | <components> 22 | <comp ref="J2"> 23 | <value>ARDUINO_2</value> 24 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical</footprint> 25 | <datasheet>~</datasheet> 26 | <libsource lib="Connector" part="Conn_01x06_Female" description="Generic connector, single row, 01x06, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 27 | <sheetpath names="/" tstamps="/"/> 28 | <tstamp>624E1CB5</tstamp> 29 | </comp> 30 | <comp ref="J1"> 31 | <value>ARDUINO_1</value> 32 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical</footprint> 33 | <datasheet>~</datasheet> 34 | <libsource lib="Connector" part="Conn_01x08_Female" description="Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 35 | <sheetpath names="/" tstamps="/"/> 36 | <tstamp>624E471C</tstamp> 37 | </comp> 38 | <comp ref="J5"> 39 | <value>ARDUINO_4</value> 40 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical</footprint> 41 | <datasheet>~</datasheet> 42 | <libsource lib="Connector" part="Conn_01x08_Female" description="Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 43 | <sheetpath names="/" tstamps="/"/> 44 | <tstamp>624E5B3A</tstamp> 45 | </comp> 46 | <comp ref="J4"> 47 | <value>ARDUINO_3</value> 48 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x10_P2.54mm_Vertical</footprint> 49 | <datasheet>~</datasheet> 50 | <libsource lib="Connector" part="Conn_01x10_Female" description="Generic connector, single row, 01x10, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 51 | <sheetpath names="/" tstamps="/"/> 52 | <tstamp>624E6F85</tstamp> 53 | </comp> 54 | <comp ref="R1"> 55 | <value>10k</value> 56 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 57 | <datasheet>~</datasheet> 58 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 59 | <sheetpath names="/" tstamps="/"/> 60 | <tstamp>624EB2E4</tstamp> 61 | </comp> 62 | <comp ref="R2"> 63 | <value>10k</value> 64 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 65 | <datasheet>~</datasheet> 66 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 67 | <sheetpath names="/" tstamps="/"/> 68 | <tstamp>624EBCCF</tstamp> 69 | </comp> 70 | <comp ref="R3"> 71 | <value>10k</value> 72 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 73 | <datasheet>~</datasheet> 74 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 75 | <sheetpath names="/" tstamps="/"/> 76 | <tstamp>624EC154</tstamp> 77 | </comp> 78 | <comp ref="J6"> 79 | <value>DISPLAY</value> 80 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical</footprint> 81 | <datasheet>~</datasheet> 82 | <libsource lib="Connector" part="Conn_01x04_Female" description="Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 83 | <sheetpath names="/" tstamps="/"/> 84 | <tstamp>624F3C78</tstamp> 85 | </comp> 86 | <comp ref="SW1"> 87 | <value>BTN_UP</value> 88 | <footprint>Button_Switch_THT:SW_PUSH_6mm_H4.3mm</footprint> 89 | <datasheet>~</datasheet> 90 | <libsource lib="Switch" part="SW_Push" description="Push button switch, generic, two pins"/> 91 | <sheetpath names="/" tstamps="/"/> 92 | <tstamp>624FAFBD</tstamp> 93 | </comp> 94 | <comp ref="SW2"> 95 | <value>BTN_SEL</value> 96 | <footprint>Button_Switch_THT:SW_PUSH_6mm_H4.3mm</footprint> 97 | <datasheet>~</datasheet> 98 | <libsource lib="Switch" part="SW_Push" description="Push button switch, generic, two pins"/> 99 | <sheetpath names="/" tstamps="/"/> 100 | <tstamp>624FB811</tstamp> 101 | </comp> 102 | <comp ref="SW3"> 103 | <value>BTN_DOWN</value> 104 | <footprint>Button_Switch_THT:SW_PUSH_6mm_H4.3mm</footprint> 105 | <datasheet>~</datasheet> 106 | <libsource lib="Switch" part="SW_Push" description="Push button switch, generic, two pins"/> 107 | <sheetpath names="/" tstamps="/"/> 108 | <tstamp>624FBD3E</tstamp> 109 | </comp> 110 | <comp ref="U2"> 111 | <value>LM317_TO-220</value> 112 | <footprint>Package_TO_SOT_THT:TO-220-3_Horizontal_TabDown</footprint> 113 | <datasheet>http://www.ti.com/lit/ds/symlink/lm317.pdf</datasheet> 114 | <libsource lib="Regulator_Linear" part="LM317_TO-220" description="1.5A 35V Adjustable Linear Regulator, TO-220"/> 115 | <sheetpath names="/" tstamps="/"/> 116 | <tstamp>62501FCA</tstamp> 117 | </comp> 118 | <comp ref="J7"> 119 | <value>OBD</value> 120 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical</footprint> 121 | <datasheet>~</datasheet> 122 | <libsource lib="Connector" part="Conn_01x04_Female" description="Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 123 | <sheetpath names="/" tstamps="/"/> 124 | <tstamp>625029B9</tstamp> 125 | </comp> 126 | <comp ref="R7"> 127 | <value>240</value> 128 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 129 | <datasheet>~</datasheet> 130 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 131 | <sheetpath names="/" tstamps="/"/> 132 | <tstamp>62508634</tstamp> 133 | </comp> 134 | <comp ref="R8"> 135 | <value>1k3</value> 136 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 137 | <datasheet>~</datasheet> 138 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 139 | <sheetpath names="/" tstamps="/"/> 140 | <tstamp>62508E3E</tstamp> 141 | </comp> 142 | <comp ref="R12"> 143 | <value>300</value> 144 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 145 | <datasheet>~</datasheet> 146 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 147 | <sheetpath names="/" tstamps="/"/> 148 | <tstamp>6250DBD8</tstamp> 149 | </comp> 150 | <comp ref="D1"> 151 | <value>LED</value> 152 | <footprint>LED_THT:LED_D3.0mm</footprint> 153 | <datasheet>~</datasheet> 154 | <libsource lib="Device" part="LED" description="Light emitting diode"/> 155 | <sheetpath names="/" tstamps="/"/> 156 | <tstamp>6250E0F7</tstamp> 157 | </comp> 158 | <comp ref="U1"> 159 | <value>MAX485E</value> 160 | <footprint>Package_DIP:DIP-8_W7.62mm</footprint> 161 | <datasheet>https://datasheets.maximintegrated.com/en/ds/MAX1487E-MAX491E.pdf</datasheet> 162 | <libsource lib="Interface_UART" part="MAX485E" description="Half duplex RS-485/RS-422, 2.5 Mbps, ±15kV electro-static discharge (ESD) protection, no slew-rate, no low-power shutdown, with receiver/driver enable, 32 receiver drive kapacitity, DIP-8 and SOIC-8"/> 163 | <sheetpath names="/" tstamps="/"/> 164 | <tstamp>62512B8B</tstamp> 165 | </comp> 166 | <comp ref="R6"> 167 | <value>10k</value> 168 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 169 | <datasheet>~</datasheet> 170 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 171 | <sheetpath names="/" tstamps="/"/> 172 | <tstamp>625191FD</tstamp> 173 | </comp> 174 | <comp ref="R5"> 175 | <value>10k</value> 176 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 177 | <datasheet>~</datasheet> 178 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 179 | <sheetpath names="/" tstamps="/"/> 180 | <tstamp>62519AC4</tstamp> 181 | </comp> 182 | <comp ref="R4"> 183 | <value>10k</value> 184 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 185 | <datasheet>~</datasheet> 186 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 187 | <sheetpath names="/" tstamps="/"/> 188 | <tstamp>6251A234</tstamp> 189 | </comp> 190 | <comp ref="R10"> 191 | <value>120</value> 192 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 193 | <datasheet>~</datasheet> 194 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 195 | <sheetpath names="/" tstamps="/"/> 196 | <tstamp>625279EC</tstamp> 197 | </comp> 198 | <comp ref="R9"> 199 | <value>20k</value> 200 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 201 | <datasheet>~</datasheet> 202 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 203 | <sheetpath names="/" tstamps="/"/> 204 | <tstamp>625281E9</tstamp> 205 | </comp> 206 | <comp ref="R11"> 207 | <value>20k</value> 208 | <footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint> 209 | <datasheet>~</datasheet> 210 | <libsource lib="Device" part="R_Small" description="Resistor, small symbol"/> 211 | <sheetpath names="/" tstamps="/"/> 212 | <tstamp>6252878D</tstamp> 213 | </comp> 214 | <comp ref="J3"> 215 | <value>RS_485_DEBUG</value> 216 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical</footprint> 217 | <datasheet>~</datasheet> 218 | <libsource lib="Connector" part="Conn_01x04_Female" description="Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 219 | <sheetpath names="/" tstamps="/"/> 220 | <tstamp>62540E2B</tstamp> 221 | </comp> 222 | <comp ref="J8"> 223 | <value>I2C_DEBUG</value> 224 | <footprint>Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical</footprint> 225 | <datasheet>~</datasheet> 226 | <libsource lib="Connector" part="Conn_01x02_Female" description="Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)"/> 227 | <sheetpath names="/" tstamps="/"/> 228 | <tstamp>6260588C</tstamp> 229 | </comp> 230 | </components> 231 | <libparts> 232 | <libpart lib="Connector" part="Conn_01x02_Female"> 233 | <description>Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)</description> 234 | <docs>~</docs> 235 | <footprints> 236 | <fp>Connector*:*_1x??_*</fp> 237 | </footprints> 238 | <fields> 239 | <field name="Reference">J</field> 240 | <field name="Value">Conn_01x02_Female</field> 241 | </fields> 242 | <pins> 243 | <pin num="1" name="Pin_1" type="passive"/> 244 | <pin num="2" name="Pin_2" type="passive"/> 245 | </pins> 246 | </libpart> 247 | <libpart lib="Connector" part="Conn_01x04_Female"> 248 | <description>Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)</description> 249 | <docs>~</docs> 250 | <footprints> 251 | <fp>Connector*:*_1x??_*</fp> 252 | </footprints> 253 | <fields> 254 | <field name="Reference">J</field> 255 | <field name="Value">Conn_01x04_Female</field> 256 | </fields> 257 | <pins> 258 | <pin num="1" name="Pin_1" type="passive"/> 259 | <pin num="2" name="Pin_2" type="passive"/> 260 | <pin num="3" name="Pin_3" type="passive"/> 261 | <pin num="4" name="Pin_4" type="passive"/> 262 | </pins> 263 | </libpart> 264 | <libpart lib="Connector" part="Conn_01x06_Female"> 265 | <description>Generic connector, single row, 01x06, script generated (kicad-library-utils/schlib/autogen/connector/)</description> 266 | <docs>~</docs> 267 | <footprints> 268 | <fp>Connector*:*_1x??_*</fp> 269 | </footprints> 270 | <fields> 271 | <field name="Reference">J</field> 272 | <field name="Value">Conn_01x06_Female</field> 273 | </fields> 274 | <pins> 275 | <pin num="1" name="Pin_1" type="passive"/> 276 | <pin num="2" name="Pin_2" type="passive"/> 277 | <pin num="3" name="Pin_3" type="passive"/> 278 | <pin num="4" name="Pin_4" type="passive"/> 279 | <pin num="5" name="Pin_5" type="passive"/> 280 | <pin num="6" name="Pin_6" type="passive"/> 281 | </pins> 282 | </libpart> 283 | <libpart lib="Connector" part="Conn_01x08_Female"> 284 | <description>Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)</description> 285 | <docs>~</docs> 286 | <footprints> 287 | <fp>Connector*:*_1x??_*</fp> 288 | </footprints> 289 | <fields> 290 | <field name="Reference">J</field> 291 | <field name="Value">Conn_01x08_Female</field> 292 | </fields> 293 | <pins> 294 | <pin num="1" name="Pin_1" type="passive"/> 295 | <pin num="2" name="Pin_2" type="passive"/> 296 | <pin num="3" name="Pin_3" type="passive"/> 297 | <pin num="4" name="Pin_4" type="passive"/> 298 | <pin num="5" name="Pin_5" type="passive"/> 299 | <pin num="6" name="Pin_6" type="passive"/> 300 | <pin num="7" name="Pin_7" type="passive"/> 301 | <pin num="8" name="Pin_8" type="passive"/> 302 | </pins> 303 | </libpart> 304 | <libpart lib="Connector" part="Conn_01x10_Female"> 305 | <description>Generic connector, single row, 01x10, script generated (kicad-library-utils/schlib/autogen/connector/)</description> 306 | <docs>~</docs> 307 | <footprints> 308 | <fp>Connector*:*_1x??_*</fp> 309 | </footprints> 310 | <fields> 311 | <field name="Reference">J</field> 312 | <field name="Value">Conn_01x10_Female</field> 313 | </fields> 314 | <pins> 315 | <pin num="1" name="Pin_1" type="passive"/> 316 | <pin num="2" name="Pin_2" type="passive"/> 317 | <pin num="3" name="Pin_3" type="passive"/> 318 | <pin num="4" name="Pin_4" type="passive"/> 319 | <pin num="5" name="Pin_5" type="passive"/> 320 | <pin num="6" name="Pin_6" type="passive"/> 321 | <pin num="7" name="Pin_7" type="passive"/> 322 | <pin num="8" name="Pin_8" type="passive"/> 323 | <pin num="9" name="Pin_9" type="passive"/> 324 | <pin num="10" name="Pin_10" type="passive"/> 325 | </pins> 326 | </libpart> 327 | <libpart lib="Device" part="LED"> 328 | <description>Light emitting diode</description> 329 | <docs>~</docs> 330 | <footprints> 331 | <fp>LED*</fp> 332 | <fp>LED_SMD:*</fp> 333 | <fp>LED_THT:*</fp> 334 | </footprints> 335 | <fields> 336 | <field name="Reference">D</field> 337 | <field name="Value">LED</field> 338 | </fields> 339 | <pins> 340 | <pin num="1" name="K" type="passive"/> 341 | <pin num="2" name="A" type="passive"/> 342 | </pins> 343 | </libpart> 344 | <libpart lib="Device" part="R_Small"> 345 | <description>Resistor, small symbol</description> 346 | <docs>~</docs> 347 | <footprints> 348 | <fp>R_*</fp> 349 | </footprints> 350 | <fields> 351 | <field name="Reference">R</field> 352 | <field name="Value">R_Small</field> 353 | </fields> 354 | <pins> 355 | <pin num="1" name="~" type="passive"/> 356 | <pin num="2" name="~" type="passive"/> 357 | </pins> 358 | </libpart> 359 | <libpart lib="Interface_UART" part="MAX481E"> 360 | <aliases> 361 | <alias>MAX483E</alias> 362 | <alias>MAX485E</alias> 363 | <alias>MAX487E</alias> 364 | <alias>MAX1487E</alias> 365 | <alias>MAX3485</alias> 366 | <alias>MAX3483</alias> 367 | <alias>MAX3486</alias> 368 | </aliases> 369 | <description>Half duplex RS-485/RS-422, 2.5 Mbps, ±15kV electro-static discharge (ESD) protection, no slew-rate, with low-power shutdown, with receiver/driver enable, 32 receiver drive kapacitity, DIP-8 and SOIC-8</description> 370 | <docs>https://datasheets.maximintegrated.com/en/ds/MAX1487E-MAX491E.pdf</docs> 371 | <footprints> 372 | <fp>DIP*W7.62mm*</fp> 373 | <fp>SOIC*3.9x4.9mm*P1.27mm*</fp> 374 | </footprints> 375 | <fields> 376 | <field name="Reference">U</field> 377 | <field name="Value">MAX481E</field> 378 | </fields> 379 | <pins> 380 | <pin num="1" name="RO" type="output"/> 381 | <pin num="2" name="~RE" type="input"/> 382 | <pin num="3" name="DE" type="input"/> 383 | <pin num="4" name="DI" type="input"/> 384 | <pin num="5" name="GND" type="power_in"/> 385 | <pin num="6" name="A" type="BiDi"/> 386 | <pin num="7" name="B" type="BiDi"/> 387 | <pin num="8" name="VCC" type="power_in"/> 388 | </pins> 389 | </libpart> 390 | <libpart lib="Regulator_Linear" part="LM317_TO-220"> 391 | <aliases> 392 | <alias>AZ1117T-ADJ</alias> 393 | </aliases> 394 | <description>1.5A 35V Adjustable Linear Regulator, TO-220</description> 395 | <docs>http://www.ti.com/lit/ds/symlink/lm317.pdf</docs> 396 | <footprints> 397 | <fp>TO?220*</fp> 398 | </footprints> 399 | <fields> 400 | <field name="Reference">U</field> 401 | <field name="Value">LM317_TO-220</field> 402 | <field name="Footprint">Package_TO_SOT_THT:TO-220-3_Vertical</field> 403 | </fields> 404 | <pins> 405 | <pin num="1" name="ADJ" type="input"/> 406 | <pin num="2" name="VO" type="power_out"/> 407 | <pin num="3" name="VI" type="power_in"/> 408 | </pins> 409 | </libpart> 410 | <libpart lib="Switch" part="SW_Push"> 411 | <description>Push button switch, generic, two pins</description> 412 | <docs>~</docs> 413 | <fields> 414 | <field name="Reference">SW</field> 415 | <field name="Value">SW_Push</field> 416 | </fields> 417 | <pins> 418 | <pin num="1" name="1" type="passive"/> 419 | <pin num="2" name="2" type="passive"/> 420 | </pins> 421 | </libpart> 422 | </libparts> 423 | <libraries> 424 | <library logical="Connector"> 425 | <uri>C:\Program Files\KiCad\share\kicad\library/Connector.lib</uri> 426 | </library> 427 | <library logical="Device"> 428 | <uri>C:\Program Files\KiCad\share\kicad\library/Device.lib</uri> 429 | </library> 430 | <library logical="Interface_UART"> 431 | <uri>C:\Program Files\KiCad\share\kicad\library/Interface_UART.lib</uri> 432 | </library> 433 | <library logical="Regulator_Linear"> 434 | <uri>C:\Program Files\KiCad\share\kicad\library/Regulator_Linear.lib</uri> 435 | </library> 436 | <library logical="Switch"> 437 | <uri>C:\Program Files\KiCad\share\kicad\library/Switch.lib</uri> 438 | </library> 439 | </libraries> 440 | <nets> 441 | <net code="1" name="+5V"> 442 | <node ref="R11" pin="2"/> 443 | <node ref="J6" pin="4"/> 444 | <node ref="SW1" pin="1"/> 445 | <node ref="SW2" pin="1"/> 446 | <node ref="SW3" pin="1"/> 447 | <node ref="J1" pin="5"/> 448 | <node ref="R6" pin="1"/> 449 | <node ref="U1" pin="8"/> 450 | <node ref="R5" pin="1"/> 451 | <node ref="R4" pin="1"/> 452 | </net> 453 | <net code="2" name="GND"> 454 | <node ref="R9" pin="1"/> 455 | <node ref="J4" pin="4"/> 456 | <node ref="J3" pin="4"/> 457 | <node ref="R1" pin="2"/> 458 | <node ref="J1" pin="6"/> 459 | <node ref="J1" pin="7"/> 460 | <node ref="R2" pin="2"/> 461 | <node ref="R3" pin="2"/> 462 | <node ref="R8" pin="2"/> 463 | <node ref="U1" pin="5"/> 464 | <node ref="J7" pin="4"/> 465 | <node ref="J6" pin="3"/> 466 | <node ref="D1" pin="1"/> 467 | </net> 468 | <net code="3" name="Net-(R7-Pad2)"> 469 | <node ref="R8" pin="1"/> 470 | <node ref="R7" pin="2"/> 471 | <node ref="U2" pin="1"/> 472 | </net> 473 | <net code="4" name="VIN"> 474 | <node ref="J1" pin="8"/> 475 | <node ref="R12" pin="1"/> 476 | <node ref="U2" pin="2"/> 477 | <node ref="R7" pin="1"/> 478 | </net> 479 | <net code="5" name="Net-(D1-Pad2)"> 480 | <node ref="D1" pin="2"/> 481 | <node ref="R12" pin="2"/> 482 | </net> 483 | <net code="6" name="3"> 484 | <node ref="U1" pin="3"/> 485 | <node ref="U1" pin="2"/> 486 | <node ref="J3" pin="2"/> 487 | <node ref="R5" pin="2"/> 488 | <node ref="J5" pin="5"/> 489 | </net> 490 | <net code="7" name="+12V"> 491 | <node ref="U2" pin="3"/> 492 | <node ref="J7" pin="1"/> 493 | </net> 494 | <net code="8" name="2"> 495 | <node ref="R6" pin="2"/> 496 | <node ref="U1" pin="1"/> 497 | <node ref="J3" pin="1"/> 498 | <node ref="J5" pin="6"/> 499 | </net> 500 | <net code="9" name="SDA"> 501 | <node ref="J6" pin="1"/> 502 | <node ref="J8" pin="2"/> 503 | <node ref="J4" pin="2"/> 504 | </net> 505 | <net code="10" name="SCL"> 506 | <node ref="J8" pin="1"/> 507 | <node ref="J4" pin="1"/> 508 | <node ref="J6" pin="2"/> 509 | </net> 510 | <net code="11" name="4"> 511 | <node ref="J3" pin="3"/> 512 | <node ref="R4" pin="2"/> 513 | <node ref="U1" pin="4"/> 514 | <node ref="J5" pin="4"/> 515 | </net> 516 | <net code="12" name="D+"> 517 | <node ref="R11" pin="1"/> 518 | <node ref="R10" pin="2"/> 519 | <node ref="J7" pin="3"/> 520 | <node ref="U1" pin="6"/> 521 | </net> 522 | <net code="13" name="D-"> 523 | <node ref="J7" pin="2"/> 524 | <node ref="R10" pin="1"/> 525 | <node ref="U1" pin="7"/> 526 | <node ref="R9" pin="2"/> 527 | </net> 528 | <net code="14" name="8"> 529 | <node ref="R2" pin="1"/> 530 | <node ref="J4" pin="10"/> 531 | <node ref="SW2" pin="2"/> 532 | </net> 533 | <net code="15" name="9"> 534 | <node ref="R3" pin="1"/> 535 | <node ref="SW3" pin="2"/> 536 | <node ref="J4" pin="9"/> 537 | </net> 538 | <net code="16" name="7"> 539 | <node ref="SW1" pin="2"/> 540 | <node ref="R1" pin="1"/> 541 | <node ref="J5" pin="1"/> 542 | </net> 543 | <net code="17" name="Net-(J1-Pad3)"> 544 | <node ref="J1" pin="3"/> 545 | </net> 546 | <net code="18" name="Net-(J5-Pad3)"> 547 | <node ref="J5" pin="3"/> 548 | </net> 549 | <net code="19" name="Net-(J5-Pad2)"> 550 | <node ref="J5" pin="2"/> 551 | </net> 552 | <net code="20" name="Net-(J1-Pad4)"> 553 | <node ref="J1" pin="4"/> 554 | </net> 555 | <net code="21" name="Net-(J1-Pad2)"> 556 | <node ref="J1" pin="2"/> 557 | </net> 558 | <net code="22" name="Net-(J1-Pad1)"> 559 | <node ref="J1" pin="1"/> 560 | </net> 561 | <net code="23" name="Net-(J2-Pad6)"> 562 | <node ref="J2" pin="6"/> 563 | </net> 564 | <net code="24" name="Net-(J2-Pad5)"> 565 | <node ref="J2" pin="5"/> 566 | </net> 567 | <net code="25" name="Net-(J2-Pad4)"> 568 | <node ref="J2" pin="4"/> 569 | </net> 570 | <net code="26" name="Net-(J2-Pad3)"> 571 | <node ref="J2" pin="3"/> 572 | </net> 573 | <net code="27" name="Net-(J2-Pad2)"> 574 | <node ref="J2" pin="2"/> 575 | </net> 576 | <net code="28" name="Net-(J4-Pad3)"> 577 | <node ref="J4" pin="3"/> 578 | </net> 579 | <net code="29" name="Net-(J4-Pad8)"> 580 | <node ref="J4" pin="8"/> 581 | </net> 582 | <net code="30" name="Net-(J4-Pad7)"> 583 | <node ref="J4" pin="7"/> 584 | </net> 585 | <net code="31" name="Net-(J4-Pad6)"> 586 | <node ref="J4" pin="6"/> 587 | </net> 588 | <net code="32" name="Net-(J4-Pad5)"> 589 | <node ref="J4" pin="5"/> 590 | </net> 591 | <net code="33" name="Net-(J5-Pad8)"> 592 | <node ref="J5" pin="8"/> 593 | </net> 594 | <net code="34" name="Net-(J5-Pad7)"> 595 | <node ref="J5" pin="7"/> 596 | </net> 597 | <net code="35" name="Net-(J2-Pad1)"> 598 | <node ref="J2" pin="1"/> 599 | </net> 600 | </nets> 601 | </export> 602 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | <one line to give the program's name and a brief idea of what it does.> 635 | Copyright (C) <year> <name of author> 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see <https://www.gnu.org/licenses/>. 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | <program> Copyright (C) <year> <name of author> 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | <https://www.gnu.org/licenses/>. 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | <https://www.gnu.org/licenses/why-not-lgpl.html>. 675 | -------------------------------------------------------------------------------- /pcb/mondeo.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "LOGO" (version 20210606) (generator bitmap2component) (layer "F.Cu") 2 | (at 0 0) 3 | (attr board_only exclude_from_pos_files exclude_from_bom) 4 | (fp_text reference "G***" (at 0 0) (layer F.SilkS) 5 | (effects (font (thickness 0.3))) 6 | ) 7 | (fp_text value "LOGO" (at 0.75 0) (layer F.SilkS) hide 8 | (effects (font (thickness 0.3))) 9 | ) 10 | (fp_poly (pts (xy -3.921615 0.404111) (xy -3.835784 0.413202) (xy -3.751841 0.430193) (xy -3.670284 0.454784) (xy -3.591611 0.486670) (xy -3.516317 0.525551) (xy -3.444900 0.571123) (xy -3.377856 0.623086) 11 | (xy -3.315684 0.681135) (xy -3.258879 0.744970) (xy -3.207938 0.814288) (xy -3.163359 0.888786) (xy -3.142583 0.930051) (xy -3.110644 1.005558) (xy -3.086283 1.081234) (xy -3.069199 1.158456) 12 | (xy -3.059088 1.238601) (xy -3.055648 1.323048) (xy -3.055645 1.325590) (xy -3.058141 1.401668) (xy -3.065943 1.472887) (xy -3.079464 1.541406) (xy -3.099117 1.609381) (xy -3.121708 1.670205) 13 | (xy -3.158538 1.749628) (xy -3.202327 1.824504) (xy -3.252600 1.894473) (xy -3.308882 1.959176) (xy -3.370699 2.018254) (xy -3.437576 2.071347) (xy -3.509038 2.118097) (xy -3.584610 2.158143) 14 | (xy -3.663818 2.191127) (xy -3.746187 2.216689) (xy -3.831242 2.234470) (xy -3.875042 2.240376) (xy -3.900413 2.242388) (xy -3.931674 2.243674) (xy -3.966266 2.244235) (xy -4.001627 2.244074) 15 | (xy -4.035196 2.243192) (xy -4.064412 2.241592) (xy -4.079394 2.240220) (xy -4.163475 2.226552) (xy -4.246175 2.204907) (xy -4.326718 2.175697) (xy -4.404331 2.139336) (xy -4.478240 2.096236) 16 | (xy -4.547670 2.046811) (xy -4.611848 1.991474) (xy -4.669999 1.930637) (xy -4.678571 1.920565) (xy -4.732757 1.849448) (xy -4.779688 1.774346) (xy -4.819123 1.695801) (xy -4.850823 1.614352) 17 | (xy -4.874545 1.530539) (xy -4.889840 1.446499) (xy -4.895220 1.388782) (xy -4.896893 1.326948) (xy -4.896721 1.321314) (xy -4.718437 1.321314) (xy -4.718424 1.354139) (xy -4.718128 1.380128) 18 | (xy -4.717433 1.400997) (xy -4.716219 1.418458) (xy -4.714371 1.434228) (xy -4.711769 1.450020) (xy -4.708474 1.466701) (xy -4.687943 1.545596) (xy -4.660014 1.620578) (xy -4.624976 1.691271) 19 | (xy -4.583112 1.757300) (xy -4.534710 1.818288) (xy -4.480056 1.873860) (xy -4.419435 1.923639) (xy -4.353134 1.967250) (xy -4.309745 1.990803) (xy -4.239617 2.021387) (xy -4.166044 2.044691) 20 | (xy -4.090249 2.060498) (xy -4.013454 2.068589) (xy -3.936882 2.068745) (xy -3.893557 2.065171) (xy -3.814888 2.051945) (xy -3.738683 2.030720) (xy -3.665512 2.001787) (xy -3.595944 1.965432) 21 | (xy -3.530549 1.921944) (xy -3.469895 1.871611) (xy -3.427594 1.829255) (xy -3.385235 1.779147) (xy -3.348579 1.726503) (xy -3.315801 1.668653) (xy -3.309927 1.656987) (xy -3.284055 1.600376) 22 | (xy -3.264059 1.546267) (xy -3.249188 1.491961) (xy -3.238688 1.434755) (xy -3.232357 1.378589) (xy -3.230296 1.308237) (xy -3.235673 1.235878) (xy -3.248185 1.163145) (xy -3.267531 1.091670) 23 | (xy -3.293410 1.023088) (xy -3.301075 1.006139) (xy -3.337448 0.938343) (xy -3.380944 0.874462) (xy -3.430842 0.815238) (xy -3.486423 0.761413) (xy -3.546966 0.713727) (xy -3.611750 0.672924) 24 | (xy -3.638298 0.658892) (xy -3.711571 0.626808) (xy -3.786411 0.602903) (xy -3.862256 0.587072) (xy -3.938542 0.579211) (xy -4.014708 0.579216) (xy -4.090189 0.586982) (xy -4.164424 0.602406) 25 | (xy -4.236850 0.625383) (xy -4.306903 0.655809) (xy -4.374021 0.693580) (xy -4.437641 0.738592) (xy -4.497201 0.790740) (xy -4.529336 0.823858) (xy -4.577725 0.883049) (xy -4.619916 0.947833) 26 | (xy -4.655606 1.017610) (xy -4.684492 1.091778) (xy -4.706273 1.169734) (xy -4.708585 1.180202) (xy -4.711863 1.196565) (xy -4.714324 1.211989) (xy -4.716085 1.228145) (xy -4.717263 1.246701) 27 | (xy -4.717973 1.269326) (xy -4.718333 1.297689) (xy -4.718437 1.321314) (xy -4.896721 1.321314) (xy -4.894963 1.263851) (xy -4.889535 1.202346) (xy -4.880712 1.145290) (xy -4.878439 1.134145) 28 | (xy -4.855958 1.048746) (xy -4.826041 0.967097) (xy -4.789095 0.889539) (xy -4.745529 0.816416) (xy -4.695751 0.748072) (xy -4.640170 0.684849) (xy -4.579193 0.627091) (xy -4.513229 0.575140) 29 | (xy -4.442685 0.529341) (xy -4.367971 0.490034) (xy -4.289495 0.457565) (xy -4.207663 0.432276) (xy -4.122886 0.414511) (xy -4.035571 0.404611) (xy -4.008839 0.403223) )(layer F.SilkS) (width 0.000000) 30 | ) 31 | (fp_poly (pts (xy 4.214489 0.301573) (xy 4.255217 0.305110) (xy 4.258175 0.305477) (xy 4.346241 0.320858) (xy 4.431454 0.344117) (xy 4.513388 0.375048) (xy 4.591617 0.413444) (xy 4.665716 0.459098) 32 | (xy 4.735260 0.511804) (xy 4.794801 0.566292) (xy 4.855713 0.633010) (xy 4.909119 0.703746) (xy 4.954918 0.778267) (xy 4.993007 0.856340) (xy 5.023287 0.937733) (xy 5.045655 1.022213) 33 | (xy 5.060009 1.109547) (xy 5.065940 1.188793) (xy 5.064825 1.278083) (xy 5.055412 1.365664) (xy 5.037854 1.451134) (xy 5.012305 1.534094) (xy 4.978919 1.614143) (xy 4.937848 1.690883) 34 | (xy 4.889247 1.763912) (xy 4.833268 1.832830) (xy 4.808878 1.859124) (xy 4.754680 1.911470) (xy 4.698730 1.957344) (xy 4.639006 1.998223) (xy 4.573484 2.035587) (xy 4.553407 2.045828) 35 | (xy 4.473324 2.080985) (xy 4.390279 2.108293) (xy 4.305000 2.127620) (xy 4.218210 2.138834) (xy 4.130636 2.141801) (xy 4.051599 2.137297) (xy 4.004832 2.130961) (xy 3.954036 2.121231) 36 | (xy 3.902667 2.108855) (xy 3.854178 2.094580) (xy 3.854177 2.094580) (xy 3.820909 2.082443) (xy 3.783238 2.066569) (xy 3.743657 2.048171) (xy 3.704659 2.028460) (xy 3.668737 2.008649) 37 | (xy 3.638384 1.989950) (xy 3.636818 1.988906) (xy 3.566168 1.936577) (xy 3.500983 1.878155) (xy 3.441710 1.814220) (xy 3.388796 1.745355) (xy 3.342688 1.672142) (xy 3.303835 1.595162) 38 | (xy 3.272977 1.515876) (xy 3.251376 1.442790) (xy 3.236378 1.371686) (xy 3.227627 1.300090) (xy 3.225809 1.252716) (xy 3.401118 1.252716) (xy 3.408239 1.329588) (xy 3.423284 1.405449) 39 | (xy 3.440843 1.464170) (xy 3.470459 1.536986) (xy 3.507186 1.605495) (xy 3.550529 1.669304) (xy 3.599995 1.728021) (xy 3.655089 1.781251) (xy 3.715318 1.828602) (xy 3.780187 1.869681) 40 | (xy 3.849204 1.904094) (xy 3.921873 1.931449) (xy 3.997702 1.951352) (xy 4.066797 1.962407) (xy 4.092320 1.964273) (xy 4.123671 1.965009) (xy 4.158211 1.964690) (xy 4.193301 1.963390) 41 | (xy 4.226303 1.961185) (xy 4.254576 1.958149) (xy 4.263266 1.956837) (xy 4.341530 1.939562) (xy 4.416585 1.914612) (xy 4.487954 1.882338) (xy 4.555161 1.843091) (xy 4.617727 1.797221) 42 | (xy 4.675177 1.745079) (xy 4.727034 1.687015) (xy 4.772820 1.623381) (xy 4.812059 1.554527) (xy 4.813102 1.552441) (xy 4.844567 1.479934) (xy 4.867947 1.405510) (xy 4.883310 1.329788) 43 | (xy 4.890726 1.253388) (xy 4.890262 1.176928) (xy 4.881986 1.101027) (xy 4.865966 1.026304) (xy 4.842271 0.953377) (xy 4.810967 0.882866) (xy 4.772124 0.815389) (xy 4.725809 0.751565) 44 | (xy 4.724908 0.750455) (xy 4.671823 0.691811) (xy 4.613201 0.639418) (xy 4.549656 0.593619) (xy 4.481800 0.554755) (xy 4.410244 0.523170) (xy 4.335603 0.499207) (xy 4.258486 0.483207) 45 | (xy 4.243332 0.481060) (xy 4.164424 0.474919) (xy 4.086318 0.477071) (xy 4.009570 0.487259) (xy 3.934737 0.505226) (xy 3.862376 0.530717) (xy 3.793042 0.563475) (xy 3.727293 0.603243) 46 | (xy 3.665683 0.649766) (xy 3.608770 0.702787) (xy 3.557110 0.762050) (xy 3.519404 0.814596) (xy 3.481000 0.880905) (xy 3.449944 0.950954) (xy 3.426332 1.023952) (xy 3.410260 1.099106) 47 | (xy 3.401823 1.175625) (xy 3.401118 1.252716) (xy 3.225809 1.252716) (xy 3.224766 1.225526) (xy 3.225421 1.186692) (xy 3.232457 1.097870) (xy 3.247568 1.011856) (xy 3.270783 0.928558) 48 | (xy 3.302130 0.847882) (xy 3.341639 0.769737) (xy 3.373063 0.718180) (xy 3.425328 0.645795) (xy 3.483490 0.579469) (xy 3.547166 0.519454) (xy 3.615975 0.466002) (xy 3.689536 0.419364) 49 | (xy 3.767467 0.379792) (xy 3.849387 0.347539) (xy 3.934913 0.322854) (xy 3.989596 0.311460) (xy 4.028486 0.306005) (xy 4.073097 0.302229) (xy 4.120753 0.300192) (xy 4.168776 0.299953) 50 | )(layer F.SilkS) (width 0.000000) 51 | ) 52 | (fp_poly (pts (xy 1.692047 -1.833154) (xy 1.796275 -1.831877) (xy 1.894912 -1.829834) (xy 1.988379 -1.827008) (xy 2.077094 -1.823379) (xy 2.161478 -1.818930) (xy 2.241951 -1.813642) (xy 2.318931 -1.807496) 53 | (xy 2.392840 -1.800473) (xy 2.464095 -1.792556) (xy 2.533118 -1.783726) (xy 2.600328 -1.773964) (xy 2.666145 -1.763252) (xy 2.730988 -1.751572) (xy 2.766633 -1.744679) (xy 2.831210 -1.731269) 54 | (xy 2.894225 -1.716838) (xy 2.956232 -1.701158) (xy 3.017784 -1.684003) (xy 3.079435 -1.665143) (xy 3.141738 -1.644352) (xy 3.205248 -1.621402) (xy 3.270516 -1.596064) (xy 3.338098 -1.568112) 55 | (xy 3.408546 -1.537317) (xy 3.482414 -1.503452) (xy 3.560255 -1.466290) (xy 3.642623 -1.425601) (xy 3.730072 -1.381160) (xy 3.823154 -1.332737) (xy 3.922424 -1.280106) (xy 4.008838 -1.233644) 56 | (xy 4.090832 -1.189597) (xy 4.169165 -1.148074) (xy 4.243353 -1.109321) (xy 4.312909 -1.073585) (xy 4.377346 -1.041111) (xy 4.436178 -1.012145) (xy 4.488920 -0.986934) (xy 4.535084 -0.965724) 57 | (xy 4.558316 -0.955498) (xy 4.587006 -0.943378) (xy 4.619631 -0.930031) (xy 4.654386 -0.916161) (xy 4.689462 -0.902468) (xy 4.723052 -0.889654) (xy 4.753349 -0.878420) (xy 4.778546 -0.869468) 58 | (xy 4.789225 -0.865884) (xy 4.802321 -0.861274) (xy 4.811751 -0.857302) (xy 4.814882 -0.855362) (xy 4.819721 -0.853642) (xy 4.831271 -0.851119) (xy 4.847770 -0.848141) (xy 4.866195 -0.845241) 59 | (xy 4.943664 -0.835467) (xy 5.028613 -0.827826) (xy 5.120231 -0.822351) (xy 5.217707 -0.819075) (xy 5.320231 -0.818032) (xy 5.426993 -0.819253) (xy 5.475169 -0.820518) (xy 5.514946 -0.821804) 60 | (xy 5.554845 -0.823214) (xy 5.593383 -0.824686) (xy 5.629079 -0.826159) (xy 5.660451 -0.827572) (xy 5.686017 -0.828866) (xy 5.702095 -0.829827) (xy 5.766160 -0.834133) (xy 5.847482 -0.867960) 61 | (xy 5.912235 -0.894472) (xy 5.970603 -0.917376) (xy 6.023784 -0.937017) (xy 6.072978 -0.953736) (xy 6.119384 -0.967878) (xy 6.164203 -0.979785) (xy 6.208632 -0.989800) (xy 6.253872 -0.998268) 62 | (xy 6.301122 -1.005530) (xy 6.350000 -1.011747) (xy 6.373564 -1.014011) (xy 6.401593 -1.015930) (xy 6.432552 -1.017474) (xy 6.464908 -1.018616) (xy 6.497129 -1.019325) (xy 6.527680 -1.019573) 63 | (xy 6.555029 -1.019332) (xy 6.577641 -1.018572) (xy 6.593985 -1.017264) (xy 6.599115 -1.016441) (xy 6.614957 -1.010147) (xy 6.623628 -0.999689) (xy 6.625282 -0.985317) (xy 6.620075 -0.967279) 64 | (xy 6.608162 -0.945822) (xy 6.589698 -0.921196) (xy 6.564838 -0.893648) (xy 6.533738 -0.863426) (xy 6.496553 -0.830779) (xy 6.468856 -0.808107) (xy 6.451765 -0.794521) (xy 6.436155 -0.782211) 65 | (xy 6.423761 -0.772542) (xy 6.416373 -0.766914) (xy 6.405590 -0.759006) (xy 6.414344 -0.714107) (xy 6.419452 -0.686696) (xy 6.424812 -0.655825) (xy 6.430139 -0.623353) (xy 6.435147 -0.591140) 66 | (xy 6.439549 -0.561046) (xy 6.443059 -0.534931) (xy 6.445392 -0.514654) (xy 6.445911 -0.508855) (xy 6.447024 -0.494647) (xy 6.448625 -0.474222) (xy 6.450534 -0.449888) (xy 6.452568 -0.423956) 67 | (xy 6.453455 -0.412643) (xy 6.454957 -0.387912) (xy 6.456219 -0.355796) (xy 6.457237 -0.317460) (xy 6.458006 -0.274069) (xy 6.458524 -0.226786) (xy 6.458785 -0.176776) (xy 6.458785 -0.125203) 68 | (xy 6.458521 -0.073231) (xy 6.457988 -0.022026) (xy 6.457182 0.027249) (xy 6.456099 0.073430) (xy 6.455271 0.100489) (xy 6.451501 0.211667) (xy 6.470641 0.225353) (xy 6.501356 0.249405) 69 | (xy 6.531559 0.276898) (xy 6.559662 0.306132) (xy 6.584078 0.335410) (xy 6.603219 0.363032) (xy 6.609273 0.373672) (xy 6.618066 0.392366) (xy 6.623846 0.410281) (xy 6.626718 0.429146) 70 | (xy 6.626784 0.450694) (xy 6.624147 0.476656) (xy 6.618911 0.508763) (xy 6.617712 0.515270) (xy 6.614043 0.535560) (xy 6.611298 0.552966) (xy 6.609365 0.569272) (xy 6.608129 0.586261) 71 | (xy 6.607477 0.605714) (xy 6.607294 0.629417) (xy 6.607469 0.659150) (xy 6.607618 0.673596) (xy 6.608704 0.772057) (xy 6.592902 0.804017) (xy 6.569798 0.842023) (xy 6.538500 0.879430) 72 | (xy 6.499361 0.915934) (xy 6.452735 0.951234) (xy 6.398975 0.985029) (xy 6.350273 1.011177) (xy 6.325079 1.024486) (xy 6.304063 1.037450) (xy 6.284104 1.052212) (xy 6.262080 1.070912) 73 | (xy 6.258337 1.074251) (xy 6.241623 1.089354) (xy 6.226563 1.103188) (xy 6.214657 1.114362) (xy 6.207402 1.121484) (xy 6.206751 1.122179) (xy 6.197419 1.130639) (xy 6.181922 1.142662) 74 | (xy 6.161443 1.157433) (xy 6.137167 1.174141) (xy 6.110275 1.191972) (xy 6.081953 1.210112) (xy 6.053383 1.227751) (xy 6.050673 1.229386) (xy 6.000070 1.259003) (xy 5.952091 1.285126) 75 | (xy 5.905294 1.308332) (xy 5.858240 1.329192) (xy 5.809489 1.348281) (xy 5.757600 1.366173) (xy 5.701133 1.383442) (xy 5.638649 1.400662) (xy 5.588855 1.413419) (xy 5.564142 1.419352) 76 | (xy 5.535064 1.425937) (xy 5.502598 1.432987) (xy 5.467724 1.440315) (xy 5.431423 1.447731) (xy 5.394672 1.455050) (xy 5.358452 1.462082) (xy 5.323742 1.468641) (xy 5.291522 1.474538) 77 | (xy 5.262770 1.479587) (xy 5.238466 1.483599) (xy 5.219590 1.486386) (xy 5.207121 1.487762) (xy 5.202040 1.487540) (xy 5.201492 1.482968) (xy 5.200826 1.470919) (xy 5.200080 1.452469) 78 | (xy 5.199291 1.428691) (xy 5.198498 1.400662) (xy 5.197739 1.369455) (xy 5.197525 1.359688) (xy 5.196500 1.317477) (xy 5.195252 1.282072) (xy 5.193553 1.251723) (xy 5.191176 1.224684) 79 | (xy 5.187892 1.199208) (xy 5.183475 1.173546) (xy 5.177695 1.145952) (xy 5.170327 1.114677) (xy 5.161142 1.077975) (xy 5.160497 1.075438) (xy 5.142413 1.010032) (xy 5.121463 0.944039) 80 | (xy 5.098327 0.879250) (xy 5.073684 0.817455) (xy 5.048212 0.760444) (xy 5.022592 0.710008) (xy 5.020234 0.705732) (xy 4.983618 0.644301) (xy 4.945202 0.589256) (xy 4.903693 0.539194) 81 | (xy 4.857800 0.492711) (xy 4.806230 0.448401) (xy 4.747690 0.404860) (xy 4.735774 0.396628) (xy 4.653620 0.345458) (xy 4.568762 0.302368) (xy 4.481357 0.267408) (xy 4.391559 0.240625) 82 | (xy 4.299524 0.222067) (xy 4.205405 0.211784) (xy 4.134983 0.209529) (xy 4.040186 0.213711) (xy 3.947224 0.226217) (xy 3.856245 0.246987) (xy 3.767395 0.275961) (xy 3.680824 0.313079) 83 | (xy 3.596679 0.358281) (xy 3.515108 0.411507) (xy 3.436258 0.472696) (xy 3.392246 0.511428) (xy 3.338500 0.566573) (xy 3.289486 0.628737) (xy 3.245261 0.697777) (xy 3.205881 0.773552) 84 | (xy 3.171403 0.855919) (xy 3.141884 0.944736) (xy 3.117379 1.039861) (xy 3.097946 1.141152) (xy 3.083640 1.248467) (xy 3.078787 1.299933) (xy 3.077320 1.322104) (xy 3.076103 1.349129) 85 | (xy 3.075150 1.379464) (xy 3.074474 1.411565) (xy 3.074089 1.443891) (xy 3.074008 1.474896) (xy 3.074246 1.503039) (xy 3.074815 1.526776) (xy 3.075730 1.544564) (xy 3.076559 1.552489) 86 | (xy 3.077339 1.576678) (xy 3.073334 1.603020) (xy 3.065310 1.629997) (xy 3.054036 1.656092) (xy 3.040278 1.679786) (xy 3.024804 1.699561) (xy 3.008381 1.713899) (xy 2.991778 1.721283) 87 | (xy 2.991158 1.721405) (xy 2.984229 1.721829) (xy 2.969610 1.722055) (xy 2.948158 1.722093) (xy 2.920734 1.721947) (xy 2.888196 1.721627) (xy 2.851402 1.721139) (xy 2.811213 1.720491) 88 | (xy 2.768487 1.719690) (xy 2.753158 1.719376) (xy 2.595408 1.716167) (xy 2.438605 1.713161) (xy 2.283163 1.710361) (xy 2.129494 1.707771) (xy 1.978012 1.705394) (xy 1.829128 1.703234) 89 | (xy 1.683255 1.701295) (xy 1.540808 1.699580) (xy 1.402197 1.698094) (xy 1.267838 1.696840) (xy 1.138141 1.695821) (xy 1.013520 1.695042) (xy 0.894388 1.694507) (xy 0.781158 1.694218) 90 | (xy 0.674243 1.694180) (xy 0.574054 1.694396) (xy 0.481007 1.694871) (xy 0.395512 1.695607) (xy 0.317983 1.696609) (xy 0.288636 1.697097) (xy 0.132333 1.700139) (xy -0.032360 1.703841) 91 | (xy -0.205307 1.708199) (xy -0.386372 1.713208) (xy -0.575419 1.718864) (xy -0.772311 1.725161) (xy -0.976913 1.732095) (xy -1.189089 1.739662) (xy -1.408702 1.747857) (xy -1.635617 1.756675) 92 | (xy -1.869697 1.766111) (xy -2.110805 1.776162) (xy -2.358807 1.786822) (xy -2.381785 1.787825) (xy -2.432862 1.790007) (xy -2.482253 1.792018) (xy -2.529162 1.793831) (xy -2.572796 1.795421) 93 | (xy -2.612359 1.796761) (xy -2.647057 1.797826) (xy -2.676096 1.798589) (xy -2.698681 1.799023) (xy -2.714017 1.799103) (xy -2.719596 1.798960) (xy -2.757368 1.794060) (xy -2.788754 1.783794) 94 | (xy -2.814259 1.767864) (xy -2.834384 1.745972) (xy -2.847123 1.723587) (xy -2.851271 1.713782) (xy -2.854314 1.704124) (xy -2.856367 1.693194) (xy -2.857547 1.679572) (xy -2.857969 1.661840) 95 | (xy -2.857749 1.638577) (xy -2.857004 1.608364) (xy -2.856883 1.604123) (xy -2.857507 1.567427) (xy -2.861105 1.524084) (xy -2.867405 1.475361) (xy -2.876137 1.422523) (xy -2.887030 1.366837) 96 | (xy -2.899811 1.309569) (xy -2.914210 1.251984) (xy -2.929956 1.195349) (xy -2.946777 1.140930) (xy -2.964402 1.089993) (xy -2.970497 1.073778) (xy -3.011006 0.977442) (xy -3.055785 0.888368) 97 | (xy -3.105089 0.806264) (xy -3.159172 0.730840) (xy -3.218289 0.661805) (xy -3.282696 0.598871) (xy -3.352647 0.541745) (xy -3.428397 0.490138) (xy -3.510201 0.443760) (xy -3.534192 0.431688) 98 | (xy -3.552857 0.423007) (xy -2.873535 0.423007) (xy -2.871349 0.440857) (xy -2.864131 0.455028) (xy -2.850893 0.466520) (xy -2.830647 0.476335) (xy -2.815808 0.481494) (xy -2.798560 0.484975) 99 | (xy -2.775483 0.486926) (xy -2.749153 0.487390) (xy -2.722146 0.486414) (xy -2.697039 0.484040) (xy -2.676409 0.480313) (xy -2.671694 0.479005) (xy -2.647444 0.468509) (xy -2.630343 0.454864) 100 | (xy -2.620528 0.439100) (xy -2.618142 0.422246) (xy -2.623322 0.405329) (xy -2.636208 0.389380) (xy -2.656941 0.375426) (xy -2.657593 0.375095) (xy -2.683367 0.365309) (xy -2.713847 0.359848) 101 | (xy -2.746662 0.358389) (xy -2.785773 0.360478) (xy -2.817939 0.366424) (xy -2.842974 0.376133) (xy -2.860689 0.389509) (xy -2.870898 0.406456) (xy -2.873535 0.423007) (xy -3.552857 0.423007) 102 | (xy -3.592905 0.404381) (xy -3.647819 0.382164) (xy -3.701369 0.364274) (xy -3.755990 0.349945) (xy -3.814117 0.338413) (xy -3.848485 0.332982) (xy -3.871293 0.329845) (xy -3.891536 0.327599) 103 | (xy -3.911240 0.326157) (xy -3.932431 0.325430) (xy -3.957135 0.325328) (xy -3.987377 0.325764) (xy -4.004562 0.326140) (xy -4.078495 0.329865) (xy -4.147480 0.337741) (xy -4.213389 0.350236) 104 | (xy -4.278096 0.367817) (xy -4.343470 0.390953) (xy -4.411387 0.420111) (xy -4.445000 0.436167) (xy -4.513500 0.472860) (xy -4.580660 0.514675) (xy -4.645347 0.560681) (xy -4.706429 0.609944) 105 | (xy -4.762775 0.661533) (xy -4.813254 0.714514) (xy -4.856732 0.767956) (xy -4.869687 0.786020) (xy -4.912884 0.855152) (xy -4.951400 0.930970) (xy -4.985267 1.013574) (xy -5.014519 1.103064) 106 | (xy -5.039188 1.199541) (xy -5.059308 1.303104) (xy -5.074082 1.406835) (xy -5.076751 1.435353) (xy -5.078891 1.471054) (xy -5.080486 1.512587) (xy -5.081521 1.558599) (xy -5.081978 1.607738) 107 | (xy -5.081843 1.658650) (xy -5.081100 1.709984) (xy -5.079732 1.760386) (xy -5.078585 1.790077) (xy -5.075032 1.871855) (xy -5.093551 1.874464) (xy -5.122577 1.877872) (xy -5.158966 1.881045) 108 | (xy -5.201536 1.883950) (xy -5.249100 1.886553) (xy -5.300474 1.888823) (xy -5.354472 1.890726) (xy -5.409910 1.892228) (xy -5.465602 1.893298) (xy -5.520364 1.893902) (xy -5.573010 1.894008) 109 | (xy -5.622355 1.893582) (xy -5.667215 1.892591) (xy -5.700034 1.891323) (xy -5.770680 1.886689) (xy -5.839316 1.879780) (xy -5.905043 1.870780) (xy -5.966964 1.859870) (xy -6.024181 1.847233) 110 | (xy -6.075798 1.833050) (xy -6.120917 1.817503) (xy -6.158640 1.800774) (xy -6.166128 1.796804) (xy -6.200562 1.775056) (xy -6.228991 1.751225) (xy -6.250842 1.726013) (xy -6.265542 1.700127) 111 | (xy -6.272519 1.674269) (xy -6.273030 1.665400) (xy -6.272388 1.652361) (xy -6.269761 1.641454) (xy -6.264096 1.630722) (xy -6.254342 1.618210) (xy -6.239448 1.601960) (xy -6.238249 1.600699) 112 | (xy -6.226736 1.587704) (xy -6.218007 1.576141) (xy -6.213489 1.567965) (xy -6.213165 1.566345) (xy -6.215101 1.562356) (xy -6.221446 1.557011) (xy -6.233004 1.549818) (xy -6.250579 1.540290) 113 | (xy -6.274976 1.527939) (xy -6.282377 1.524283) (xy -6.333698 1.498285) (xy -6.378174 1.474029) (xy -6.417105 1.450653) (xy -6.451794 1.427294) (xy -6.483540 1.403091) (xy -6.513645 1.377181) 114 | (xy -6.535552 1.356478) (xy -6.580081 1.307771) (xy -6.616719 1.256587) (xy -6.645298 1.203193) (xy -6.664158 1.152912) (xy -6.677739 1.096011) (xy -6.683220 1.041808) (xy -6.680552 0.990117) 115 | (xy -6.669686 0.940750) (xy -6.650573 0.893520) (xy -6.623164 0.848242) (xy -6.587410 0.804727) (xy -6.567531 0.784661) (xy -6.553493 0.771807) (xy -6.541490 0.761853) (xy -6.532937 0.755907) 116 | (xy -6.529456 0.754818) (xy -6.525120 0.753332) (xy -6.521348 0.746978) (xy -6.515247 0.738162) (xy -6.504934 0.729041) (xy -6.501626 0.726828) (xy -6.493327 0.720767) (xy -6.484407 0.712189) 117 | (xy -6.474364 0.700384) (xy -6.462697 0.684641) (xy -6.462073 0.683719) (xy -6.362088 0.683719) (xy -6.360728 0.687299) (xy -6.356508 0.687687) (xy -6.353207 0.687006) (xy -6.346018 0.685690) 118 | (xy -6.331886 0.683474) (xy -6.312348 0.680584) (xy -6.288937 0.677250) (xy -6.264478 0.673872) (xy -6.221333 0.668183) (xy -6.178082 0.662865) (xy -6.133966 0.657858) (xy -6.088226 0.653097) 119 | (xy -6.040105 0.648521) (xy -5.988844 0.644066) (xy -5.933684 0.639670) (xy -5.873866 0.635269) (xy -5.808633 0.630802) (xy -5.737225 0.626205) (xy -5.658884 0.621416) (xy -5.572851 0.616372) 120 | (xy -5.561386 0.615713) (xy -5.526556 0.613674) (xy -5.494519 0.611721) (xy -5.466254 0.609920) (xy -5.442743 0.608336) (xy -5.424965 0.607036) (xy -5.413900 0.606084) (xy -5.410498 0.605594) 121 | (xy -5.408962 0.600897) (xy -5.406522 0.590237) (xy -5.404133 0.578154) (xy -5.402352 0.545997) (xy -5.408419 0.514026) (xy -5.421713 0.483598) (xy -5.441611 0.456070) (xy -5.467490 0.432800) 122 | (xy -5.472331 0.429438) (xy -5.504099 0.411921) (xy -5.543577 0.396462) (xy -5.590146 0.383176) (xy -5.643188 0.372176) (xy -5.702082 0.363577) (xy -5.766212 0.357491) (xy -5.834958 0.354034) 123 | (xy -5.886044 0.353237) (xy -5.948115 0.354081) (xy -6.002609 0.356940) (xy -6.050289 0.361933) (xy -6.091917 0.369180) (xy -6.128256 0.378799) (xy -6.160069 0.390912) (xy -6.175853 0.398647) 124 | (xy -6.201342 0.416014) (xy -6.227649 0.441061) (xy -6.254234 0.473025) (xy -6.280560 0.511140) (xy -6.306087 0.554644) (xy -6.330278 0.602772) (xy -6.347548 0.642242) (xy -6.355645 0.662349) 125 | (xy -6.360442 0.675789) (xy -6.362088 0.683719) (xy -6.462073 0.683719) (xy -6.448905 0.664248) (xy -6.432488 0.638495) (xy -6.412944 0.606670) (xy -6.389865 0.568219) (xy -6.354024 0.509605) 126 | (xy -6.320330 0.458186) (xy -6.287896 0.413162) (xy -6.255834 0.373732) (xy -6.223257 0.339096) (xy -6.189278 0.308453) (xy -6.153010 0.281002) (xy -6.113565 0.255944) (xy -6.070056 0.232477) 127 | (xy -6.021595 0.209801) (xy -5.967608 0.187240) (xy -5.917212 0.167931) (xy -5.859595 0.147300) (xy -5.795919 0.125701) (xy -5.727348 0.103493) (xy -5.655046 0.081031) (xy -5.580176 0.058673) 128 | (xy -5.503903 0.036773) (xy -5.427390 0.015690) (xy -5.351800 -0.004221) (xy -5.300219 -0.017231) (xy -5.263763 -0.026175) (xy -5.228088 -0.034763) (xy -5.192736 -0.043083) (xy -5.157249 -0.051219) 129 | (xy -5.121171 -0.059259) (xy -5.084042 -0.067288) (xy -5.045406 -0.075391) (xy -5.004806 -0.083656) (xy -4.961782 -0.092166) (xy -4.915879 -0.101010) (xy -4.866637 -0.110272) (xy -4.813601 -0.120039) 130 | (xy -4.756311 -0.130396) (xy -4.694310 -0.141429) (xy -4.627142 -0.153225) (xy -4.554347 -0.165869) (xy -4.475469 -0.179447) (xy -4.390050 -0.194045) (xy -4.297632 -0.209749) (xy -4.197758 -0.226645) 131 | (xy -4.173252 -0.230777) (xy 6.035707 -0.230777) (xy 6.035857 -0.210188) (xy 6.036684 -0.195430) (xy 6.038753 -0.183785) (xy 6.042629 -0.172531) (xy 6.048879 -0.158950) (xy 6.051927 -0.152747) 132 | (xy 6.073939 -0.117476) (xy 6.104238 -0.083873) (xy 6.142702 -0.052028) (xy 6.189214 -0.022030) (xy 6.243653 0.006032) (xy 6.293117 0.027140) (xy 6.310169 0.033544) (xy 6.330789 0.040830) 133 | (xy 6.353281 0.048452) (xy 6.375950 0.055863) (xy 6.397100 0.062519) (xy 6.415035 0.067872) (xy 6.428060 0.071378) (xy 6.434031 0.072498) (xy 6.436752 0.068359) (xy 6.439278 0.055814) 134 | (xy 6.441584 0.035010) (xy 6.442583 0.022450) (xy 6.443993 -0.002841) (xy 6.445000 -0.033286) (xy 6.445628 -0.067980) (xy 6.445900 -0.106020) (xy 6.445838 -0.146503) (xy 6.445466 -0.188525) 135 | (xy 6.444807 -0.231181) (xy 6.443884 -0.273569) (xy 6.442720 -0.314784) (xy 6.441337 -0.353923) (xy 6.439760 -0.390082) (xy 6.438011 -0.422357) (xy 6.436113 -0.449845) (xy 6.434088 -0.471643) 136 | (xy 6.431962 -0.486845) (xy 6.429755 -0.494549) (xy 6.429383 -0.495038) (xy 6.424450 -0.495212) (xy 6.413002 -0.493781) (xy 6.396869 -0.491013) (xy 6.382087 -0.488075) (xy 6.311777 -0.471130) 137 | (xy 6.249163 -0.451435) (xy 6.194323 -0.429031) (xy 6.147334 -0.403964) (xy 6.108277 -0.376275) (xy 6.077230 -0.346008) (xy 6.054270 -0.313206) (xy 6.050209 -0.305445) (xy 6.043656 -0.291595) 138 | (xy 6.039444 -0.280353) (xy 6.037060 -0.269069) (xy 6.035987 -0.255094) (xy 6.035712 -0.235776) (xy 6.035707 -0.230777) (xy -4.173252 -0.230777) (xy -4.089970 -0.244819) (xy -4.072980 -0.247679) 139 | (xy -3.972151 -0.264668) (xy -3.879335 -0.280348) (xy -3.794104 -0.294798) (xy -3.716031 -0.308099) (xy -3.644692 -0.320332) (xy -3.579658 -0.331574) (xy -3.520503 -0.341908) (xy -3.466802 -0.351412) 140 | (xy -3.418126 -0.360167) (xy -3.374050 -0.368252) (xy -3.334148 -0.375748) (xy -3.297992 -0.382734) (xy -3.265156 -0.389291) (xy -3.235213 -0.395498) (xy -3.207737 -0.401435) (xy -3.182302 -0.407183) 141 | (xy -3.158480 -0.412821) (xy -3.135846 -0.418429) (xy -3.113972 -0.424087) (xy -3.092433 -0.429876) (xy -3.074512 -0.434834) (xy -3.050775 -0.441333) (xy -3.029530 -0.446884) (xy -3.013944 -0.450706) 142 | (xy -2.975603 -0.450706) (xy -2.893567 -0.433154) (xy -2.867782 -0.427698) (xy -2.844519 -0.422891) (xy -2.825202 -0.419017) (xy -2.811258 -0.416363) (xy -2.804110 -0.415212) (xy -2.803838 -0.415192) 143 | (xy -2.798315 -0.417138) (xy -2.786360 -0.422844) (xy -2.768948 -0.431796) (xy -2.747054 -0.443477) (xy -2.721654 -0.457373) (xy -2.693721 -0.472968) (xy -2.681970 -0.479616) (xy -2.658679 -0.492860) 144 | (xy -2.633616 -0.507149) (xy -2.606354 -0.522728) (xy -2.576469 -0.539842) (xy -2.543534 -0.558736) (xy -2.507125 -0.579654) (xy -2.466816 -0.602842) (xy -2.422182 -0.628545) (xy -2.372796 -0.657008) 145 | (xy -2.318235 -0.688474) (xy -2.258071 -0.723190) (xy -2.191880 -0.761400) (xy -2.119236 -0.803350) (xy -2.119085 -0.803437) (xy -1.643684 -0.803437) (xy -1.643539 -0.790971) (xy -1.642914 -0.771495) 146 | (xy -1.641845 -0.745771) (xy -1.640367 -0.714560) (xy -1.638517 -0.678626) (xy -1.636330 -0.638729) (xy -1.633841 -0.595632) (xy -1.631549 -0.557592) (xy -1.628762 -0.511906) (xy -1.626141 -0.468395) 147 | (xy -1.623731 -0.427876) (xy -1.621581 -0.391166) (xy -1.619738 -0.359082) (xy -1.618248 -0.332441) (xy -1.617159 -0.312060) (xy -1.616518 -0.298756) (xy -1.616359 -0.293803) (xy -1.616364 -0.277589) 148 | (xy -1.585362 -0.280081) (xy -1.577004 -0.280657) (xy -1.560695 -0.281689) (xy -1.537022 -0.283142) (xy -1.506573 -0.284981) (xy -1.469934 -0.287172) (xy -1.427693 -0.289680) (xy -1.380437 -0.292470) 149 | (xy -1.328753 -0.295508) (xy -1.273229 -0.298758) (xy -1.214450 -0.302186) (xy -1.153005 -0.305758) (xy -1.089481 -0.309437) (xy -1.075438 -0.310249) (xy -0.941634 -0.317986) (xy -0.811638 -0.325513) 150 | (xy -0.685673 -0.332815) (xy -0.563959 -0.339880) (xy -0.446718 -0.346696) (xy -0.334171 -0.353248) (xy -0.226541 -0.359524) (xy -0.124048 -0.365512) (xy -0.026913 -0.371197) (xy 0.064641 -0.376566) 151 | (xy 0.150394 -0.381608) (xy 0.230123 -0.386308) (xy 0.303608 -0.390654) (xy 0.370626 -0.394633) (xy 0.430957 -0.398231) (xy 0.484380 -0.401435) (xy 0.530672 -0.404233) (xy 0.569611 -0.406612) 152 | (xy 0.600978 -0.408558) (xy 0.624550 -0.410058) (xy 0.640106 -0.411100) (xy 0.647424 -0.411670) (xy 0.647999 -0.411757) (xy 0.648725 -0.416092) (xy 0.650254 -0.427024) (xy 0.651732 -0.438171) 153 | (xy 1.064746 -0.438171) (xy 1.064747 -0.416663) (xy 1.311692 -0.430444) (xy 1.364554 -0.433410) (xy 1.421042 -0.436608) (xy 1.479434 -0.439939) (xy 1.538012 -0.443304) (xy 1.595055 -0.446603) 154 | (xy 1.648842 -0.449737) (xy 1.697655 -0.452608) (xy 1.739772 -0.455116) (xy 1.742508 -0.455280) (xy 1.805002 -0.459077) (xy 1.870568 -0.463135) (xy 1.938710 -0.467419) (xy 2.008931 -0.471895) 155 | (xy 2.080734 -0.476529) (xy 2.153622 -0.481285) (xy 2.227098 -0.486130) (xy 2.300666 -0.491028) (xy 2.373829 -0.495945) (xy 2.446090 -0.500847) (xy 2.516953 -0.505699) (xy 2.585920 -0.510466) 156 | (xy 2.652494 -0.515113) (xy 2.716180 -0.519607) (xy 2.776480 -0.523913) (xy 2.832897 -0.527996) (xy 2.884935 -0.531821) (xy 2.932096 -0.535354) (xy 2.973885 -0.538560) (xy 3.009804 -0.541406) 157 | (xy 3.039356 -0.543855) (xy 3.062046 -0.545874) (xy 3.077375 -0.547429) (xy 3.084847 -0.548483) (xy 3.085519 -0.548737) (xy 3.085347 -0.552983) (xy 3.084751 -0.564982) (xy 3.083773 -0.583947) 158 | (xy 3.082455 -0.609092) (xy 3.080841 -0.639629) (xy 3.078972 -0.674771) (xy 3.076891 -0.713733) (xy 3.074641 -0.755726) (xy 3.072264 -0.799966) (xy 3.069803 -0.845664) (xy 3.067300 -0.892034) 159 | (xy 3.064797 -0.938289) (xy 3.062338 -0.983643) (xy 3.059964 -1.027309) (xy 3.057719 -1.068500) (xy 3.055644 -1.106429) (xy 3.053782 -1.140309) (xy 3.052176 -1.169355) (xy 3.050868 -1.192779) 160 | (xy 3.049901 -1.209794) (xy 3.049317 -1.219613) (xy 3.049159 -1.221783) (xy 3.045711 -1.224397) (xy 3.036623 -1.230715) (xy 3.023386 -1.239712) (xy 3.011439 -1.247731) (xy 2.936767 -1.293494) 161 | (xy 2.854492 -1.336218) (xy 2.765059 -1.375755) (xy 2.668915 -1.411956) (xy 2.566506 -1.444670) (xy 2.458277 -1.473748) (xy 2.344674 -1.499042) (xy 2.226144 -1.520403) (xy 2.172256 -1.528558) 162 | (xy 2.045357 -1.544414) (xy 1.912155 -1.556769) (xy 1.774177 -1.565562) (xy 1.632948 -1.570735) (xy 1.489994 -1.572228) (xy 1.346841 -1.569982) (xy 1.229267 -1.565251) (xy 1.196748 -1.562991) 163 | (xy 1.171561 -1.559757) (xy 1.152511 -1.555191) (xy 1.138401 -1.548936) (xy 1.128035 -1.540634) (xy 1.122249 -1.533236) (xy 1.119713 -1.528895) (xy 1.117383 -1.523661) (xy 1.115229 -1.517080) 164 | (xy 1.113222 -1.508698) (xy 1.111330 -1.498063) (xy 1.109524 -1.484722) (xy 1.107773 -1.468221) (xy 1.106048 -1.448108) (xy 1.104318 -1.423929) (xy 1.102553 -1.395232) (xy 1.100723 -1.361564) 165 | (xy 1.098797 -1.322470) (xy 1.096746 -1.277499) (xy 1.094539 -1.226197) (xy 1.092146 -1.168112) (xy 1.089536 -1.102789) (xy 1.086680 -1.029777) (xy 1.083902 -0.957845) (xy 1.081411 -0.892876) 166 | (xy 1.079014 -0.830012) (xy 1.076732 -0.769815) (xy 1.074586 -0.712845) (xy 1.072596 -0.659663) (xy 1.070783 -0.610829) (xy 1.069168 -0.566905) (xy 1.067772 -0.528450) (xy 1.066615 -0.496026) 167 | (xy 1.065717 -0.470194) (xy 1.065100 -0.451514) (xy 1.064784 -0.440547) (xy 1.064746 -0.438171) (xy 0.651732 -0.438171) (xy 0.652327 -0.442663) (xy 0.653691 -0.453266) (xy 0.655215 -0.464506) 168 | (xy 0.657883 -0.483376) (xy 0.661576 -0.509048) (xy 0.666171 -0.540693) (xy 0.671547 -0.577483) (xy 0.677584 -0.618590) (xy 0.684160 -0.663185) (xy 0.691155 -0.710441) (xy 0.698446 -0.759529) 169 | (xy 0.701233 -0.778249) (xy 0.714936 -0.870517) (xy 0.727342 -0.954715) (xy 0.738494 -1.031219) (xy 0.748436 -1.100404) (xy 0.757212 -1.162648) (xy 0.764865 -1.218325) (xy 0.771441 -1.267812) 170 | (xy 0.776983 -1.311485) (xy 0.781534 -1.349720) (xy 0.785139 -1.382893) (xy 0.787841 -1.411380) (xy 0.789686 -1.435557) (xy 0.790715 -1.455800) (xy 0.790974 -1.472485) (xy 0.790507 -1.485989) 171 | (xy 0.789357 -1.496686) (xy 0.787568 -1.504954) (xy 0.786516 -1.508113) (xy 0.774563 -1.527818) (xy 0.755491 -1.543505) (xy 0.746178 -1.548416) (xy 0.737924 -1.551362) (xy 0.726953 -1.553620) 172 | (xy 0.712557 -1.555196) (xy 0.694025 -1.556093) (xy 0.670651 -1.556316) (xy 0.641724 -1.555870) (xy 0.606536 -1.554759) (xy 0.564378 -1.552989) (xy 0.514542 -1.550564) (xy 0.503713 -1.550007) 173 | (xy 0.362971 -1.541685) (xy 0.229445 -1.531686) (xy 0.103269 -1.520028) (xy -0.015419 -1.506732) (xy -0.126485 -1.491817) (xy -0.229793 -1.475304) (xy -0.325207 -1.457210) (xy -0.412592 -1.437558) 174 | (xy -0.491812 -1.416365) (xy -0.554311 -1.396578) (xy -0.617870 -1.373111) (xy -0.687767 -1.344210) (xy -0.763815 -1.309972) (xy -0.845829 -1.270491) (xy -0.933621 -1.225863) (xy -1.027004 -1.176183) 175 | (xy -1.125792 -1.121546) (xy -1.229799 -1.062048) (xy -1.338836 -0.997784) (xy -1.356991 -0.986914) (xy -1.382137 -0.971734) (xy -1.410138 -0.954677) (xy -1.440068 -0.936321) (xy -1.471000 -0.917243) 176 | (xy -1.502008 -0.898022) (xy -1.532166 -0.879236) (xy -1.560548 -0.861465) (xy -1.586228 -0.845285) (xy -1.608280 -0.831276) (xy -1.625777 -0.820015) (xy -1.637793 -0.812081) (xy -1.643314 -0.808130) 177 | (xy -1.643684 -0.803437) (xy -2.119085 -0.803437) (xy -2.039715 -0.849283) (xy -2.020455 -0.860409) (xy -1.891531 -0.934608) (xy -1.767627 -1.005348) (xy -1.648955 -1.072514) (xy -1.535728 -1.135987) 178 | (xy -1.428162 -1.195652) (xy -1.326468 -1.251390) (xy -1.230861 -1.303086) (xy -1.141554 -1.350622) (xy -1.058761 -1.393882) (xy -0.982696 -1.432747) (xy -0.913572 -1.467101) (xy -0.905186 -1.471191) 179 | (xy -0.854665 -1.495775) (xy -0.868839 -1.506289) (xy -0.888426 -1.520299) (xy -0.904767 -1.530963) (xy -0.916678 -1.537549) (xy -0.922395 -1.539394) (xy -0.928347 -1.537528) (xy -0.941044 -1.532214) 180 | (xy -0.959605 -1.523879) (xy -0.983150 -1.512948) (xy -1.010800 -1.499848) (xy -1.041675 -1.485004) (xy -1.074893 -1.468843) (xy -1.109576 -1.451791) (xy -1.144844 -1.434273) (xy -1.179815 -1.416716) 181 | (xy -1.213611 -1.399546) (xy -1.245351 -1.383189) (xy -1.249499 -1.381031) (xy -1.284252 -1.362859) (xy -1.318870 -1.344617) (xy -1.353941 -1.325982) (xy -1.390055 -1.306629) (xy -1.427799 -1.286236) 182 | (xy -1.467762 -1.264480) (xy -1.510534 -1.241035) (xy -1.556701 -1.215580) (xy -1.606854 -1.187791) (xy -1.661581 -1.157343) (xy -1.721469 -1.123915) (xy -1.787108 -1.087181) (xy -1.859087 -1.046820) 183 | (xy -1.926381 -1.009031) (xy -2.009660 -0.962274) (xy -2.086084 -0.919441) (xy -2.156229 -0.880223) (xy -2.220668 -0.844311) (xy -2.279978 -0.811393) (xy -2.334732 -0.781160) (xy -2.385506 -0.753302) 184 | (xy -2.432876 -0.727508) (xy -2.477415 -0.703470) (xy -2.519699 -0.680877) (xy -2.560304 -0.659418) (xy -2.599803 -0.638784) (xy -2.638772 -0.618665) (xy -2.677787 -0.598750) (xy -2.717421 -0.578731) 185 | (xy -2.758250 -0.558296) (xy -2.800849 -0.537135) (xy -2.810184 -0.532516) (xy -2.975603 -0.450706) (xy -3.013944 -0.450706) (xy -3.012301 -0.451109) (xy -3.000612 -0.453632) (xy -2.996381 -0.454178) 186 | (xy -2.990998 -0.455300) (xy -2.990831 -0.457061) (xy -2.987723 -0.459728) (xy -2.977902 -0.465420) (xy -2.962424 -0.473588) (xy -2.942346 -0.483682) (xy -2.918724 -0.495155) (xy -2.904332 -0.501981) 187 | (xy -2.858954 -0.523592) (xy -2.811499 -0.546726) (xy -2.761560 -0.571601) (xy -2.708730 -0.598434) (xy -2.652603 -0.627443) (xy -2.592770 -0.658847) (xy -2.528826 -0.692863) (xy -2.460362 -0.729708) 188 | (xy -2.386972 -0.769602) (xy -2.308249 -0.812761) (xy -2.223785 -0.859404) (xy -2.133173 -0.909748) (xy -2.036007 -0.964011) (xy -1.933589 -1.021450) (xy -1.864503 -1.060257) (xy -1.802261 -1.095193) 189 | (xy -1.746260 -1.126593) (xy -1.695896 -1.154792) (xy -1.650565 -1.180124) (xy -1.609666 -1.202923) (xy -1.572594 -1.223523) (xy -1.538745 -1.242260) (xy -1.507518 -1.259467) (xy -1.478308 -1.275479) 190 | (xy -1.450511 -1.290630) (xy -1.423526 -1.305255) (xy -1.396748 -1.319687) (xy -1.369574 -1.334261) (xy -1.357695 -1.340614) (xy -1.330977 -1.354734) (xy -1.299282 -1.371225) (xy -1.263785 -1.389497) 191 | (xy -1.225661 -1.408959) (xy -1.186089 -1.429019) (xy -1.146242 -1.449087) (xy -1.107298 -1.468572) (xy -1.070431 -1.486883) (xy -1.036819 -1.503428) (xy -1.007638 -1.517617) (xy -0.984062 -1.528860) 192 | (xy -0.971743 -1.534560) (xy -0.957250 -1.541556) (xy -0.946379 -1.547613) (xy -0.941006 -1.551660) (xy -0.940741 -1.552256) (xy -0.936843 -1.555594) (xy -0.925907 -1.561033) (xy -0.909067 -1.568157) 193 | (xy -0.887459 -1.576549) (xy -0.862217 -1.585794) (xy -0.834476 -1.595476) (xy -0.816714 -1.601397) (xy 2.998581 -1.601397) (xy 3.001692 -1.597853) (xy 3.010905 -1.592673) (xy 3.024225 -1.586976) 194 | (xy 3.024238 -1.586971) (xy 3.038308 -1.581064) (xy 3.059138 -1.571522) (xy 3.085942 -1.558739) (xy 3.117938 -1.543111) (xy 3.154341 -1.525034) (xy 3.194368 -1.504904) (xy 3.237235 -1.483116) 195 | (xy 3.282159 -1.460066) (xy 3.328356 -1.436149) (xy 3.375043 -1.411762) (xy 3.421435 -1.387300) (xy 3.453922 -1.370019) (xy 3.509014 -1.340558) (xy 3.563401 -1.311384) (xy 3.617726 -1.282146) 196 | (xy 3.672634 -1.252492) (xy 3.728770 -1.222070) (xy 3.786778 -1.190527) (xy 3.847303 -1.157513) (xy 3.910989 -1.122675) (xy 3.978480 -1.085661) (xy 4.050422 -1.046120) (xy 4.127458 -1.003699) 197 | (xy 4.210233 -0.958047) (xy 4.299392 -0.908811) (xy 4.363754 -0.873238) (xy 4.398202 -0.854387) (xy 4.430214 -0.837246) (xy 4.458885 -0.822276) (xy 4.483307 -0.809941) (xy 4.502574 -0.800701) 198 | (xy 4.515781 -0.795019) (xy 4.519832 -0.793657) (xy 4.554095 -0.788086) (xy 4.593979 -0.788045) (xy 4.637401 -0.793331) (xy 4.656845 -0.797488) (xy 4.681745 -0.803915) (xy 4.709560 -0.811848) 199 | (xy 4.737751 -0.820524) (xy 4.763777 -0.829180) (xy 4.785098 -0.837052) (xy 4.791083 -0.839526) (xy 4.796497 -0.842073) (xy 4.798340 -0.844282) (xy 4.795602 -0.846868) (xy 4.787271 -0.850550) 200 | (xy 4.772338 -0.856045) (xy 4.763288 -0.859267) (xy 4.705917 -0.880247) (xy 4.648737 -0.902406) (xy 4.590950 -0.926118) (xy 4.531758 -0.951755) (xy 4.470363 -0.979691) (xy 4.405968 -1.010299) 201 | (xy 4.337773 -1.043954) (xy 4.264982 -1.081027) (xy 4.186795 -1.121894) (xy 4.102415 -1.166927) (xy 4.080463 -1.178770) (xy 4.019544 -1.211679) (xy 3.965408 -1.240878) (xy 3.917326 -1.266751) 202 | (xy 3.874573 -1.289679) (xy 3.836420 -1.310047) (xy 3.802141 -1.328237) (xy 3.771009 -1.344631) (xy 3.742296 -1.359614) (xy 3.715276 -1.373568) (xy 3.689220 -1.386876) (xy 3.663403 -1.399921) 203 | (xy 3.637098 -1.413086) (xy 3.611161 -1.425969) (xy 3.517396 -1.471496) (xy 3.428859 -1.512542) (xy 3.343965 -1.549789) (xy 3.261126 -1.583920) (xy 3.178753 -1.615618) (xy 3.124025 -1.635483) 204 | (xy 3.095218 -1.645747) (xy 3.073354 -1.653354) (xy 3.057245 -1.658296) (xy 3.045702 -1.660564) (xy 3.037535 -1.660149) (xy 3.031557 -1.657043) (xy 3.026578 -1.651237) (xy 3.021410 -1.642722) 205 | (xy 3.016784 -1.634705) (xy 3.008552 -1.620443) (xy 3.002175 -1.608853) (xy 2.998803 -1.602037) (xy 2.998581 -1.601397) (xy -0.816714 -1.601397) (xy -0.805372 -1.605178) (xy -0.776040 -1.614485) 206 | (xy -0.748336 -1.622772) (xy -0.655406 -1.648522) (xy -0.561800 -1.672236) (xy -0.466948 -1.693985) (xy -0.370278 -1.713836) (xy -0.271219 -1.731860) (xy -0.169202 -1.748126) (xy -0.063656 -1.762702) 207 | (xy 0.045991 -1.775658) (xy 0.160309 -1.787064) (xy 0.279869 -1.796987) (xy 0.405240 -1.805499) (xy 0.536996 -1.812667) (xy 0.675704 -1.818561) (xy 0.821938 -1.823251) (xy 0.925774 -1.825783) 208 | (xy 1.072359 -1.828709) (xy 1.210836 -1.830980) (xy 1.341623 -1.832579) (xy 1.465141 -1.833487) (xy 1.581809 -1.833684) )(layer F.SilkS) (width 0.000000) 209 | ) 210 | (fp_poly (pts (xy -3.932730 1.565196) (xy -3.912428 1.573580) (xy -3.889684 1.589446) (xy -3.864395 1.612892) (xy -3.836459 1.644018) (xy -3.805774 1.682921) (xy -3.772237 1.729701) (xy -3.759154 1.748923) 211 | (xy -3.744813 1.770598) (xy -3.729658 1.794092) (xy -3.714355 1.818308) (xy -3.699568 1.842150) (xy -3.685964 1.864521) (xy -3.674208 1.884324) (xy -3.664965 1.900463) (xy -3.658902 1.911840) 212 | (xy -3.656682 1.917359) (xy -3.656763 1.917667) (xy -3.661020 1.920081) (xy -3.670869 1.925220) (xy -3.684242 1.932008) (xy -3.685260 1.932519) (xy -3.710938 1.943988) (xy -3.742359 1.955838) 213 | (xy -3.776809 1.967175) (xy -3.811573 1.977106) (xy -3.843562 1.984660) (xy -3.865874 1.988219) (xy -3.893930 1.991161) (xy -3.925571 1.993406) (xy -3.958639 1.994873) (xy -3.990973 1.995483) 214 | (xy -4.020415 1.995157) (xy -4.044805 1.993813) (xy -4.055876 1.992522) (xy -4.078238 1.988758) (xy -4.099589 1.984559) (xy -4.118339 1.980307) (xy -4.132898 1.976380) (xy -4.141678 1.973159) 215 | (xy -4.143535 1.971570) (xy -4.142194 1.965549) (xy -4.138465 1.952786) (xy -4.132792 1.934608) (xy -4.125617 1.912344) (xy -4.117384 1.887321) (xy -4.108535 1.860866) (xy -4.099514 1.834309) 216 | (xy -4.090764 1.808976) (xy -4.082727 1.786196) (xy -4.075846 1.767296) (xy -4.072108 1.757475) (xy -4.054631 1.715389) (xy -4.036723 1.677047) (xy -4.018822 1.643143) (xy -4.001361 1.614371) 217 | (xy -3.984779 1.591424) (xy -3.969510 1.574998) (xy -3.955991 1.565786) (xy -3.950693 1.564194) )(layer F.SilkS) (width 0.000000) 218 | ) 219 | (fp_poly (pts (xy -4.168139 1.483268) (xy -4.151900 1.488610) (xy -4.150476 1.489483) (xy -4.138385 1.501705) (xy -4.130603 1.519885) (xy -4.127123 1.544300) (xy -4.127939 1.575222) (xy -4.133042 1.612928) 220 | (xy -4.142427 1.657692) (xy -4.145796 1.671431) (xy -4.152651 1.697076) (xy -4.160976 1.725738) (xy -4.170391 1.756327) (xy -4.180513 1.787749) (xy -4.190959 1.818912) (xy -4.201346 1.848726) 221 | (xy -4.211291 1.876096) (xy -4.220414 1.899931) (xy -4.228330 1.919138) (xy -4.234657 1.932627) (xy -4.239014 1.939303) (xy -4.239787 1.939792) (xy -4.245144 1.938454) (xy -4.256209 1.933833) 222 | (xy -4.271175 1.926725) (xy -4.282632 1.920893) (xy -4.348190 1.881937) (xy -4.408168 1.836506) (xy -4.462454 1.784702) (xy -4.510937 1.726622) (xy -4.532660 1.695725) (xy -4.546635 1.673676) 223 | (xy -4.559150 1.652071) (xy -4.569573 1.632204) (xy -4.577273 1.615367) (xy -4.581620 1.602854) (xy -4.581981 1.595958) (xy -4.581602 1.595438) (xy -4.575770 1.592240) (xy -4.563161 1.586734) 224 | (xy -4.545082 1.579412) (xy -4.522836 1.570765) (xy -4.497729 1.561286) (xy -4.471065 1.551466) (xy -4.444150 1.541797) (xy -4.418288 1.532770) (xy -4.394784 1.524878) (xy -4.391702 1.523874) 225 | (xy -4.342484 1.508892) (xy -4.297234 1.497080) (xy -4.256563 1.488524) (xy -4.221082 1.483312) (xy -4.191404 1.481531) )(layer F.SilkS) (width 0.000000) 226 | ) 227 | (fp_poly (pts (xy -3.557620 1.418648) (xy -3.508067 1.422083) (xy -3.454757 1.427190) (xy -3.409427 1.432535) (xy -3.378345 1.436482) (xy -3.354742 1.439562) (xy -3.337628 1.442090) (xy -3.326012 1.444379) 228 | (xy -3.318905 1.446745) (xy -3.315315 1.449500) (xy -3.314251 1.452960) (xy -3.314723 1.457440) (xy -3.315597 1.462308) (xy -3.325164 1.504938) (xy -3.340454 1.551225) (xy -3.360630 1.599341) 229 | (xy -3.384853 1.647457) (xy -3.412287 1.693743) (xy -3.439560 1.733031) (xy -3.450118 1.745994) (xy -3.464524 1.762211) (xy -3.481519 1.780416) (xy -3.499840 1.799338) (xy -3.518229 1.817711) 230 | (xy -3.535423 1.834264) (xy -3.550162 1.847730) (xy -3.561185 1.856840) (xy -3.565400 1.859640) (xy -3.568817 1.860624) (xy -3.572675 1.859292) (xy -3.577738 1.854756) (xy -3.584772 1.846129) 231 | (xy -3.594539 1.832522) (xy -3.607805 1.813048) (xy -3.615770 1.801163) (xy -3.647429 1.753041) (xy -3.674415 1.710350) (xy -3.697448 1.671885) (xy -3.717249 1.636440) (xy -3.734540 1.602810) 232 | (xy -3.735232 1.601398) (xy -3.751835 1.565788) (xy -3.763802 1.536044) (xy -3.771491 1.511091) (xy -3.775260 1.489852) (xy -3.775791 1.479241) (xy -3.774996 1.464872) (xy -3.771704 1.455293) 233 | (xy -3.764553 1.446819) (xy -3.763433 1.445760) (xy -3.752987 1.437677) (xy -3.740188 1.431411) (xy -3.723485 1.426505) (xy -3.701328 1.422505) (xy -3.672292 1.418966) (xy -3.640878 1.417030) 234 | (xy -3.602272 1.416944) )(layer F.SilkS) (width 0.000000) 235 | ) 236 | (fp_poly (pts (xy -4.559446 1.019894) (xy -4.547774 1.025982) (xy -4.531185 1.035285) (xy -4.510830 1.047112) (xy -4.487854 1.060771) (xy -4.463408 1.075573) (xy -4.438638 1.090825) (xy -4.414693 1.105838) 237 | (xy -4.392722 1.119921) (xy -4.373871 1.132381) (xy -4.369210 1.135554) (xy -4.325053 1.166925) (xy -4.288542 1.195254) (xy -4.259430 1.220792) (xy -4.237472 1.243794) (xy -4.222422 1.264512) 238 | (xy -4.214034 1.283197) (xy -4.211953 1.297081) (xy -4.212675 1.306968) (xy -4.215768 1.315175) (xy -4.222625 1.324107) (xy -4.234499 1.336038) (xy -4.254506 1.352886) (xy -4.279654 1.369764) 239 | (xy -4.310833 1.387183) (xy -4.348933 1.405659) (xy -4.375512 1.417476) (xy -4.393744 1.425023) (xy -4.416505 1.433915) (xy -4.442517 1.443706) (xy -4.470506 1.453950) (xy -4.499195 1.464201) 240 | (xy -4.527309 1.474012) (xy -4.553572 1.482937) (xy -4.576709 1.490530) (xy -4.595443 1.496346) (xy -4.608500 1.499937) (xy -4.614064 1.500909) (xy -4.618761 1.499005) (xy -4.622690 1.492269) 241 | (xy -4.626605 1.479170) (xy -4.628282 1.472046) (xy -4.636942 1.422585) (xy -4.641938 1.368961) (xy -4.643241 1.313878) (xy -4.640822 1.260039) (xy -4.634649 1.210149) (xy -4.631365 1.193031) 242 | (xy -4.625385 1.168075) (xy -4.617919 1.141542) (xy -4.609445 1.114697) (xy -4.600441 1.088806) (xy -4.591386 1.065133) (xy -4.582759 1.044944) (xy -4.575037 1.029503) (xy -4.568699 1.020076) 243 | (xy -4.565054 1.017711) )(layer F.SilkS) (width 0.000000) 244 | ) 245 | (fp_poly (pts (xy -3.464504 0.888366) (xy -3.457045 0.897074) (xy -3.446842 0.909876) (xy -3.437148 0.922568) (xy -3.394938 0.985430) (xy -3.360726 1.050992) (xy -3.334390 1.119590) (xy -3.315811 1.191559) 246 | (xy -3.304867 1.267235) (xy -3.302775 1.295426) (xy -3.299862 1.346970) (xy -3.329367 1.346392) (xy -3.348172 1.345682) (xy -3.371056 1.344328) (xy -3.393598 1.342600) (xy -3.397357 1.342262) 247 | (xy -3.463521 1.335298) (xy -3.523632 1.327212) (xy -3.577368 1.318092) (xy -3.624402 1.308021) (xy -3.664411 1.297085) (xy -3.697069 1.285368) (xy -3.722052 1.272956) (xy -3.739035 1.259934) 248 | (xy -3.745719 1.251019) (xy -3.749565 1.235541) (xy -3.746778 1.215689) (xy -3.737294 1.191307) (xy -3.721046 1.162238) (xy -3.697972 1.128326) (xy -3.690773 1.118599) (xy -3.682135 1.107915) 249 | (xy -3.669187 1.092969) (xy -3.652725 1.074599) (xy -3.633547 1.053640) (xy -3.612451 1.030928) (xy -3.590234 1.007299) (xy -3.567693 0.983589) (xy -3.545627 0.960633) (xy -3.524831 0.939268) 250 | (xy -3.506105 0.920329) (xy -3.490244 0.904652) (xy -3.478048 0.893074) (xy -3.470312 0.886429) (xy -3.468061 0.885152) )(layer F.SilkS) (width 0.000000) 251 | ) 252 | (fp_poly (pts (xy -4.101916 0.670631) (xy -4.100594 0.671639) (xy -4.098573 0.678334) (xy -4.095896 0.692252) (xy -4.092726 0.712105) (xy -4.089226 0.736602) (xy -4.085556 0.764453) (xy -4.081880 0.794371) 253 | (xy -4.078360 0.825064) (xy -4.075157 0.855245) (xy -4.072434 0.883622) (xy -4.070352 0.908906) (xy -4.069845 0.916183) (xy -4.067474 0.970763) (xy -4.068085 1.017333) (xy -4.071678 1.055902) 254 | (xy -4.078255 1.086476) (xy -4.087816 1.109062) (xy -4.096124 1.119962) (xy -4.108156 1.126453) (xy -4.126173 1.128881) (xy -4.148649 1.127271) (xy -4.174057 1.121650) (xy -4.184158 1.118469) 255 | (xy -4.225772 1.102197) (xy -4.273018 1.079859) (xy -4.325641 1.051596) (xy -4.383385 1.017544) (xy -4.445994 0.977841) (xy -4.454759 0.972086) (xy -4.515832 0.931833) (xy -4.501825 0.912329) 256 | (xy -4.486946 0.893755) (xy -4.466986 0.871893) (xy -4.443761 0.848519) (xy -4.419082 0.825405) (xy -4.394766 0.804325) (xy -4.376997 0.790272) (xy -4.315626 0.749323) (xy -4.250417 0.715279) 257 | (xy -4.182695 0.688781) (xy -4.144982 0.677689) (xy -4.123492 0.672537) (xy -4.109362 0.670215) )(layer F.SilkS) (width 0.000000) 258 | ) 259 | (fp_poly (pts (xy -3.948466 0.655534) (xy -3.871479 0.663017) (xy -3.798499 0.677969) (xy -3.729200 0.700483) (xy -3.663257 0.730655) (xy -3.634791 0.746638) (xy -3.615890 0.758379) (xy -3.596515 0.771267) 260 | (xy -3.578093 0.784250) (xy -3.562052 0.796280) (xy -3.549819 0.806306) (xy -3.542822 0.813280) (xy -3.541796 0.815018) (xy -3.544138 0.819442) (xy -3.551529 0.829020) (xy -3.563102 0.842730) 261 | (xy -3.577991 0.859548) (xy -3.595329 0.878454) (xy -3.597986 0.881297) (xy -3.636893 0.921713) (xy -3.675319 0.959445) (xy -3.712554 0.993898) (xy -3.747889 1.024476) (xy -3.780614 1.050582) 262 | (xy -3.810021 1.071621) (xy -3.835399 1.086997) (xy -3.851852 1.094640) (xy -3.868799 1.100430) (xy -3.881030 1.102576) (xy -3.891430 1.101348) (xy -3.898280 1.098990) (xy -3.911459 1.089408) 263 | (xy -3.924272 1.071704) (xy -3.936610 1.046303) (xy -3.948368 1.013630) (xy -3.959438 0.974110) (xy -3.969714 0.928169) (xy -3.979090 0.876233) (xy -3.987458 0.818726) (xy -3.994713 0.756074) 264 | (xy -4.000569 0.690988) (xy -4.003548 0.652902) )(layer F.SilkS) (width 0.000000) 265 | ) 266 | (fp_poly (pts (xy 4.193702 1.461526) (xy 4.195565 1.462071) (xy 4.208678 1.468692) (xy 4.225598 1.481453) (xy 4.245381 1.499384) (xy 4.267083 1.521512) (xy 4.289760 1.546867) (xy 4.312470 1.574477) 267 | (xy 4.334267 1.603372) (xy 4.338131 1.608791) (xy 4.350786 1.627140) (xy 4.365264 1.648847) (xy 4.380870 1.672799) (xy 4.396914 1.697882) (xy 4.412703 1.722981) (xy 4.427545 1.746984) 268 | (xy 4.440747 1.768776) (xy 4.451617 1.787243) (xy 4.459463 1.801271) (xy 4.463593 1.809747) (xy 4.464053 1.811400) (xy 4.460367 1.815492) (xy 4.450040 1.821755) (xy 4.434507 1.829535) 269 | (xy 4.415198 1.838180) (xy 4.393546 1.847036) (xy 4.370984 1.855450) (xy 4.357166 1.860158) (xy 4.310081 1.873145) (xy 4.258646 1.883129) (xy 4.205460 1.889829) (xy 4.153121 1.892961) 270 | (xy 4.104228 1.892242) (xy 4.080899 1.890238) (xy 4.066741 1.888325) (xy 4.049143 1.885550) (xy 4.030062 1.882272) (xy 4.011455 1.878852) (xy 3.995280 1.875650) (xy 3.983494 1.873029) 271 | (xy 3.978055 1.871347) (xy 3.977958 1.871270) (xy 3.978685 1.866884) (xy 3.981699 1.855775) (xy 3.986565 1.839325) (xy 3.992848 1.818918) (xy 4.000113 1.795938) (xy 4.007923 1.771766) 272 | (xy 4.015844 1.747787) (xy 4.023440 1.725384) (xy 4.027908 1.712576) (xy 4.048885 1.656100) (xy 4.069533 1.606111) (xy 4.089677 1.562934) (xy 4.109140 1.526895) (xy 4.127746 1.498318) 273 | (xy 4.145321 1.477528) (xy 4.161689 1.464850) (xy 4.161802 1.464789) (xy 4.172554 1.459857) (xy 4.181686 1.458890) )(layer F.SilkS) (width 0.000000) 274 | ) 275 | (fp_poly (pts (xy 3.955501 1.379833) (xy 3.965931 1.382980) (xy 3.977679 1.389554) (xy 3.985821 1.398724) (xy 3.990797 1.411834) (xy 3.993048 1.430229) (xy 3.993014 1.455251) (xy 3.992619 1.464361) 276 | (xy 3.988962 1.502024) (xy 3.981441 1.544341) (xy 3.969877 1.592134) (xy 3.954090 1.646227) (xy 3.950010 1.659125) (xy 3.943371 1.679212) (xy 3.935423 1.702259) (xy 3.926649 1.726972) 277 | (xy 3.917534 1.752054) (xy 3.908561 1.776210) (xy 3.900215 1.798144) (xy 3.892979 1.816560) (xy 3.887339 1.830164) (xy 3.883777 1.837659) (xy 3.882909 1.838712) (xy 3.878306 1.836876) 278 | (xy 3.867969 1.831970) (xy 3.853748 1.824884) (xy 3.846347 1.821105) (xy 3.780094 1.782446) (xy 3.719495 1.737653) (xy 3.664890 1.687065) (xy 3.616620 1.631022) (xy 3.575025 1.569863) 279 | (xy 3.551516 1.527102) (xy 3.544637 1.512242) (xy 3.540183 1.500288) (xy 3.538856 1.493230) (xy 3.539215 1.492322) (xy 3.545422 1.488853) (xy 3.558511 1.483091) (xy 3.577268 1.475496) 280 | (xy 3.600478 1.466528) (xy 3.626925 1.456645) (xy 3.655395 1.446306) (xy 3.684672 1.435971) (xy 3.713541 1.426100) (xy 3.721255 1.423525) (xy 3.774181 1.406969) (xy 3.822176 1.394020) 281 | (xy 3.864773 1.384755) (xy 3.901504 1.379250) (xy 3.931902 1.377584) )(layer F.SilkS) (width 0.000000) 282 | ) 283 | (fp_poly (pts (xy 4.557227 1.314705) (xy 4.617322 1.318826) (xy 4.684469 1.325543) (xy 4.722946 1.330168) (xy 4.752396 1.333832) (xy 4.774388 1.336665) (xy 4.789912 1.339154) (xy 4.799960 1.341786) 284 | (xy 4.805523 1.345045) (xy 4.807593 1.349419) (xy 4.807161 1.355393) (xy 4.805219 1.363455) (xy 4.803679 1.369768) (xy 4.783566 1.439345) (xy 4.755601 1.507034) (xy 4.720454 1.571586) 285 | (xy 4.678799 1.631752) (xy 4.635835 1.681606) (xy 4.615068 1.702731) (xy 4.595496 1.721590) (xy 4.578097 1.737323) (xy 4.563845 1.749073) (xy 4.553717 1.755981) (xy 4.549603 1.757475) 286 | (xy 4.546247 1.754068) (xy 4.538975 1.744553) (xy 4.528542 1.729985) (xy 4.515700 1.711424) (xy 4.501201 1.689925) (xy 4.497073 1.683713) (xy 4.463802 1.632603) (xy 4.435546 1.587199) 287 | (xy 4.411837 1.546646) (xy 4.392207 1.510085) (xy 4.376187 1.476661) (xy 4.363309 1.445518) (xy 4.356750 1.427137) (xy 4.348251 1.396342) (xy 4.345491 1.371739) (xy 4.348466 1.353187) 288 | (xy 4.353607 1.344139) (xy 4.368065 1.332816) (xy 4.390525 1.324051) (xy 4.420831 1.317852) (xy 4.458822 1.314223) (xy 4.504340 1.313172) )(layer F.SilkS) (width 0.000000) 289 | ) 290 | (fp_poly (pts (xy 3.562915 0.915390) (xy 3.569569 0.919102) (xy 3.582234 0.926415) (xy 3.599579 0.936550) (xy 3.620268 0.948727) (xy 3.642969 0.962169) (xy 3.643621 0.962556) (xy 3.700132 0.997189) 291 | (xy 3.750573 1.030316) (xy 3.794673 1.061711) (xy 3.832159 1.091147) (xy 3.862761 1.118399) (xy 3.886208 1.143241) (xy 3.902228 1.165447) (xy 3.910550 1.184790) (xy 3.910622 1.185087) 292 | (xy 3.910091 1.201119) (xy 3.901157 1.218268) (xy 3.883889 1.236490) (xy 3.858356 1.255738) (xy 3.824627 1.275967) (xy 3.782773 1.297131) (xy 3.732863 1.319187) (xy 3.674965 1.342087) 293 | (xy 3.664613 1.345957) (xy 3.637396 1.355869) (xy 3.609573 1.365672) (xy 3.582467 1.374934) (xy 3.557403 1.383221) (xy 3.535706 1.390099) (xy 3.518700 1.395134) (xy 3.507710 1.397892) 294 | (xy 3.504802 1.398283) (xy 3.501383 1.395263) (xy 3.497627 1.385740) (xy 3.493315 1.369019) (xy 3.488933 1.348039) (xy 3.482587 1.304907) (xy 3.479125 1.257002) (xy 3.478551 1.207266) 295 | (xy 3.480868 1.158641) (xy 3.486080 1.114069) (xy 3.488643 1.099694) (xy 3.504393 1.035341) (xy 3.525391 0.973548) (xy 3.538582 0.942331) (xy 3.545879 0.926698) (xy 3.550939 0.917587) 296 | (xy 3.554949 0.913685) (xy 3.559096 0.913679) )(layer F.SilkS) (width 0.000000) 297 | ) 298 | (fp_poly (pts (xy 4.668322 0.797492) (xy 4.683392 0.816305) (xy 4.700524 0.840582) (xy 4.718237 0.868005) (xy 4.735051 0.896253) (xy 4.749486 0.923007) (xy 4.753147 0.930427) (xy 4.781860 0.999840) 299 | (xy 4.802312 1.071418) (xy 4.814540 1.145308) (xy 4.817806 1.187686) (xy 4.820439 1.244344) (xy 4.799487 1.243625) (xy 4.782586 1.242850) (xy 4.765820 1.241788) (xy 4.761431 1.241439) 300 | (xy 4.684673 1.234024) (xy 4.616285 1.225667) (xy 4.556283 1.216373) (xy 4.504683 1.206146) (xy 4.461503 1.194991) (xy 4.426758 1.182911) (xy 4.400465 1.169912) (xy 4.382639 1.155996) 301 | (xy 4.373299 1.141170) (xy 4.372451 1.138102) (xy 4.372498 1.119767) (xy 4.379632 1.096756) (xy 4.393815 1.069124) (xy 4.415007 1.036923) (xy 4.443170 1.000206) (xy 4.478266 0.959027) 302 | (xy 4.520255 0.913439) (xy 4.569099 0.863496) (xy 4.579594 0.853081) (xy 4.653185 0.780388) )(layer F.SilkS) (width 0.000000) 303 | ) 304 | (fp_poly (pts (xy 4.031589 0.627263) (xy 4.039578 0.686772) (xy 4.045860 0.743515) (xy 4.050387 0.796601) (xy 4.053113 0.845138) (xy 4.053990 0.888236) (xy 4.052973 0.925003) (xy 4.050014 0.954547) 305 | (xy 4.049072 0.960132) (xy 4.043299 0.983034) (xy 4.035463 1.002358) (xy 4.026435 1.016269) (xy 4.019796 1.021844) (xy 4.005946 1.025537) (xy 3.986572 1.025628) (xy 3.963825 1.022278) 306 | (xy 3.940421 1.015843) (xy 3.905144 1.002532) (xy 3.867878 0.985820) (xy 3.826947 0.964917) (xy 3.795034 0.947264) (xy 3.773998 0.935023) (xy 3.750642 0.920929) (xy 3.726038 0.905683) 307 | (xy 3.701259 0.889985) (xy 3.677379 0.874539) (xy 3.655471 0.860046) (xy 3.636609 0.847206) (xy 3.621865 0.836722) (xy 3.612313 0.829296) (xy 3.609023 0.825674) (xy 3.611773 0.820116) 308 | (xy 3.619220 0.809812) (xy 3.630158 0.796205) (xy 3.643386 0.780739) (xy 3.657697 0.764859) (xy 3.671889 0.750007) (xy 3.673368 0.748521) (xy 3.727355 0.700269) (xy 3.787320 0.657223) 309 | (xy 3.851747 0.620469) (xy 3.852642 0.620020) (xy 3.873142 0.610622) (xy 3.898166 0.600467) (xy 3.925445 0.590347) (xy 3.952711 0.581054) (xy 3.977696 0.573381) (xy 3.998134 0.568121) 310 | (xy 4.004911 0.566806) (xy 4.022364 0.563937) )(layer F.SilkS) (width 0.000000) 311 | ) 312 | (fp_poly (pts (xy 4.178586 0.552882) (xy 4.253255 0.559804) (xy 4.324682 0.574519) (xy 4.393461 0.597174) (xy 4.441115 0.618210) (xy 4.464936 0.630729) (xy 4.491367 0.646029) (xy 4.518093 0.662650) 313 | (xy 4.542802 0.679130) (xy 4.563182 0.694009) (xy 4.570417 0.699871) (xy 4.584655 0.711970) (xy 4.524821 0.776112) (xy 4.485235 0.817367) (xy 4.446104 0.855884) (xy 4.408188 0.891009) 314 | (xy 4.372247 0.922092) (xy 4.339042 0.948480) (xy 4.309332 0.969521) (xy 4.283879 0.984563) (xy 4.278778 0.987073) (xy 4.262384 0.992849) (xy 4.245174 0.996072) (xy 4.240127 0.996330) 315 | (xy 4.228191 0.995561) (xy 4.219571 0.992089) (xy 4.210892 0.984167) (xy 4.206090 0.978711) (xy 4.193666 0.959869) (xy 4.181637 0.933171) (xy 4.170170 0.899308) (xy 4.159426 0.858974) 316 | (xy 4.149571 0.812860) (xy 4.140769 0.761658) (xy 4.133182 0.706063) (xy 4.126977 0.646765) (xy 4.126691 0.643553) (xy 4.124669 0.621111) (xy 4.122652 0.599602) (xy 4.120894 0.581691) 317 | (xy 4.119799 0.571331) (xy 4.117426 0.550422) )(layer F.SilkS) (width 0.000000) 318 | ) 319 | ) 320 | --------------------------------------------------------------------------------