├── kicad ├── MeetingRoomDisplayConnector-cache.bck ├── MeetingRoomDisplayConnector-cache.dcm ├── GERBERS │ ├── MeetingRoomDisplayConnector-Edge.Cuts.gbr │ ├── MeetingRoomDisplayConnector.drl │ ├── MeetingRoomDisplayConnector-B.Mask.gbr │ ├── MeetingRoomDisplayConnector-F.Mask.gbr │ ├── MeetingRoomDisplayConnector-B.SilkS.gbr │ ├── MeetingRoomDisplayConnector-B.Cu.gbr │ ├── MeetingRoomDisplayConnector-F.Cu.gbr │ └── MeetingRoomDisplayConnector-F.SilkS.gbr ├── MeetingRoomDisplayConnector.pro ├── MeetingRoomDisplayConnector-cache.bak ├── MeetingRoomDisplayConnector-cache.lib ├── MeetingRoomDisplayConnector.bak ├── MeetingRoomDisplayConnector.sch ├── MeetingRoomDisplayConnector.net ├── WemosD1Mini.pretty │ └── D1_mini_board.kicad_mod ├── PartLib.dcm ├── MeetingRoomDisplayConnector.kicad_pcb └── MeetingRoomDisplayConnector.kicad_pcb-bak ├── images ├── AdafruitGFXLib.png ├── WifiManagerLib.png ├── PlaneSpotterSchema.png ├── PlaneSpotterWiring.png └── JsonStreamingParserLib.png ├── LICENSE ├── settings.h ├── WifiLocator.h ├── GeoMap.h ├── AdsbExchangeClient.h ├── README.md ├── PlaneSpotter.h ├── openscad └── enclosure.scad ├── WifiLocator.cpp ├── ILI9341.h ├── GeoMap.cpp ├── esp8266-plane-spotter-color.ino ├── AdsbExchangeClient.cpp ├── PlaneSpotter.cpp └── ILI9341.cpp /kicad/MeetingRoomDisplayConnector-cache.bck: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector-cache.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /images/AdafruitGFXLib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivasiddharth/esp8266-plane-spotter-color/master/images/AdafruitGFXLib.png -------------------------------------------------------------------------------- /images/WifiManagerLib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivasiddharth/esp8266-plane-spotter-color/master/images/WifiManagerLib.png -------------------------------------------------------------------------------- /images/PlaneSpotterSchema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivasiddharth/esp8266-plane-spotter-color/master/images/PlaneSpotterSchema.png -------------------------------------------------------------------------------- /images/PlaneSpotterWiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivasiddharth/esp8266-plane-spotter-color/master/images/PlaneSpotterWiring.png -------------------------------------------------------------------------------- /images/JsonStreamingParserLib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivasiddharth/esp8266-plane-spotter-color/master/images/JsonStreamingParserLib.png -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-Edge.Cuts.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Profile,NP* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11C,0.150000*% 11 | G04 APERTURE END LIST* 12 | D10* 13 | D11* 14 | X110490000Y-82550000D02* 15 | X160655000Y-82550000D01* 16 | X160655000Y-125095000D02* 17 | X160655000Y-82550000D01* 18 | X110490000Y-125095000D02* 19 | X160655000Y-125095000D01* 20 | X110490000Y-82550000D02* 21 | X110490000Y-125095000D01* 22 | M02* 23 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector.drl: -------------------------------------------------------------------------------- 1 | M48 2 | INCH,TZ 3 | T1C0.040 4 | % 5 | G90 6 | G05 7 | T1 8 | X45500Y-35000 9 | X45500Y-36000 10 | X45500Y-37000 11 | X45500Y-38000 12 | X45500Y-39000 13 | X45500Y-40000 14 | X45500Y-41000 15 | X45500Y-42000 16 | X45500Y-43000 17 | X45500Y-44000 18 | X45500Y-45000 19 | X45500Y-46000 20 | X45500Y-47000 21 | X45500Y-48000 22 | X51500Y-39000 23 | X51500Y-40000 24 | X51500Y-41000 25 | X51500Y-42000 26 | X51500Y-43000 27 | X51500Y-44000 28 | X51500Y-45000 29 | X51500Y-46000 30 | X60500Y-39000 31 | X60500Y-40000 32 | X60500Y-41000 33 | X60500Y-42000 34 | X60500Y-43000 35 | X60500Y-44000 36 | X60500Y-45000 37 | X60500Y-46000 38 | T0 39 | M30 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-B.Mask.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Soldermask,Bot* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,2.432000X2.127200*% 11 | %ADD12O,2.432000X2.127200*% 12 | %ADD13C,2.200000*% 13 | G04 APERTURE END LIST* 14 | D10* 15 | D11* 16 | X115570000Y-88900000D03* 17 | D12* 18 | X115570000Y-91440000D03* 19 | X115570000Y-93980000D03* 20 | X115570000Y-96520000D03* 21 | X115570000Y-99060000D03* 22 | X115570000Y-101600000D03* 23 | X115570000Y-104140000D03* 24 | X115570000Y-106680000D03* 25 | X115570000Y-109220000D03* 26 | X115570000Y-111760000D03* 27 | X115570000Y-114300000D03* 28 | X115570000Y-116840000D03* 29 | X115570000Y-119380000D03* 30 | X115570000Y-121920000D03* 31 | D13* 32 | X153670000Y-99060000D03* 33 | X153670000Y-101600000D03* 34 | X153670000Y-104140000D03* 35 | X153670000Y-106680000D03* 36 | X153670000Y-109220000D03* 37 | X153670000Y-111760000D03* 38 | X153670000Y-114300000D03* 39 | X153670000Y-116840000D03* 40 | X130810000Y-116840000D03* 41 | X130810000Y-114300000D03* 42 | X130810000Y-111760000D03* 43 | X130810000Y-109220000D03* 44 | X130810000Y-106680000D03* 45 | X130810000Y-104140000D03* 46 | X130810000Y-101600000D03* 47 | X130810000Y-99060000D03* 48 | M02* 49 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-F.Mask.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Soldermask,Top* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,2.432000X2.127200*% 11 | %ADD12O,2.432000X2.127200*% 12 | %ADD13C,2.200000*% 13 | G04 APERTURE END LIST* 14 | D10* 15 | D11* 16 | X115570000Y-88900000D03* 17 | D12* 18 | X115570000Y-91440000D03* 19 | X115570000Y-93980000D03* 20 | X115570000Y-96520000D03* 21 | X115570000Y-99060000D03* 22 | X115570000Y-101600000D03* 23 | X115570000Y-104140000D03* 24 | X115570000Y-106680000D03* 25 | X115570000Y-109220000D03* 26 | X115570000Y-111760000D03* 27 | X115570000Y-114300000D03* 28 | X115570000Y-116840000D03* 29 | X115570000Y-119380000D03* 30 | X115570000Y-121920000D03* 31 | D13* 32 | X153670000Y-99060000D03* 33 | X153670000Y-101600000D03* 34 | X153670000Y-104140000D03* 35 | X153670000Y-106680000D03* 36 | X153670000Y-109220000D03* 37 | X153670000Y-111760000D03* 38 | X153670000Y-114300000D03* 39 | X153670000Y-116840000D03* 40 | X130810000Y-116840000D03* 41 | X130810000Y-114300000D03* 42 | X130810000Y-111760000D03* 43 | X130810000Y-109220000D03* 44 | X130810000Y-106680000D03* 45 | X130810000Y-104140000D03* 46 | X130810000Y-101600000D03* 47 | X130810000Y-99060000D03* 48 | M02* 49 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-B.SilkS.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Legend,Bot* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,2.432000X2.127200*% 11 | %ADD12O,2.432000X2.127200*% 12 | %ADD13C,2.200000*% 13 | G04 APERTURE END LIST* 14 | D10* 15 | %LPC*% 16 | D11* 17 | X115570000Y-88900000D03* 18 | D12* 19 | X115570000Y-91440000D03* 20 | X115570000Y-93980000D03* 21 | X115570000Y-96520000D03* 22 | X115570000Y-99060000D03* 23 | X115570000Y-101600000D03* 24 | X115570000Y-104140000D03* 25 | X115570000Y-106680000D03* 26 | X115570000Y-109220000D03* 27 | X115570000Y-111760000D03* 28 | X115570000Y-114300000D03* 29 | X115570000Y-116840000D03* 30 | X115570000Y-119380000D03* 31 | X115570000Y-121920000D03* 32 | D13* 33 | X153670000Y-99060000D03* 34 | X153670000Y-101600000D03* 35 | X153670000Y-104140000D03* 36 | X153670000Y-106680000D03* 37 | X153670000Y-109220000D03* 38 | X153670000Y-111760000D03* 39 | X153670000Y-114300000D03* 40 | X153670000Y-116840000D03* 41 | X130810000Y-116840000D03* 42 | X130810000Y-114300000D03* 43 | X130810000Y-111760000D03* 44 | X130810000Y-109220000D03* 45 | X130810000Y-106680000D03* 46 | X130810000Y-104140000D03* 47 | X130810000Y-101600000D03* 48 | X130810000Y-99060000D03* 49 | M02* 50 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.pro: -------------------------------------------------------------------------------- 1 | update=2017 January 01, Sunday 22:29:39 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [eeschema] 29 | version=1 30 | LibDir=/Users/deichhor/git/d1_mini_kicad/library 31 | [eeschema/libraries] 32 | LibName1=power 33 | LibName2=device 34 | LibName3=transistors 35 | LibName4=conn 36 | LibName5=linear 37 | LibName6=regul 38 | LibName7=74xx 39 | LibName8=cmos4000 40 | LibName9=adc-dac 41 | LibName10=memory 42 | LibName11=xilinx 43 | LibName12=microcontrollers 44 | LibName13=dsp 45 | LibName14=microchip 46 | LibName15=analog_switches 47 | LibName16=motorola 48 | LibName17=texas 49 | LibName18=intel 50 | LibName19=audio 51 | LibName20=interface 52 | LibName21=digital-audio 53 | LibName22=philips 54 | LibName23=display 55 | LibName24=cypress 56 | LibName25=siliconi 57 | LibName26=opto 58 | LibName27=atmel 59 | LibName28=contrib 60 | LibName29=valves 61 | LibName30=wemos_mini 62 | LibName31=PartLib 63 | LibName32=d1_mini_kicad/library/wemos_mini 64 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector-cache.bak: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # ILI9341_24_Touch 5 | # 6 | DEF ILI9341_24_Touch U 0 40 Y Y 1 F N 7 | F0 "U" 1000 -700 60 H V C CNN 8 | F1 "ILI9341_24_Touch" 150 0 60 H V C CNN 9 | F2 "" 0 0 60 H V C CNN 10 | F3 "" 0 0 60 H V C CNN 11 | DRAW 12 | S -500 900 600 -1300 0 1 0 N 13 | X T_IRQ 1 -700 750 200 R 50 50 1 1 I 14 | X T_DO 2 -700 600 200 R 50 50 1 1 I 15 | X T_DIN 3 -700 450 200 R 50 50 1 1 I 16 | X T_CS 4 -700 300 200 R 50 50 1 1 I 17 | X T_CLK 5 -700 150 200 R 50 50 1 1 I 18 | X SDO 6 -700 0 200 R 50 50 1 1 I 19 | X LED 7 -700 -150 200 R 50 50 1 1 I 20 | X SCK 8 -700 -300 200 R 50 50 1 1 I 21 | X SDI 9 -700 -450 200 R 50 50 1 1 I 22 | X DC 10 -700 -600 200 R 50 50 1 1 I 23 | X RESET 11 -700 -750 200 R 50 50 1 1 I 24 | X CS 12 -700 -900 200 R 50 50 1 1 I 25 | X GND 13 -700 -1050 200 R 50 50 1 1 I 26 | X VCC 14 -700 -1200 200 R 50 50 1 1 I 27 | ENDDRAW 28 | ENDDEF 29 | # 30 | # WeMos_mini 31 | # 32 | DEF WeMos_mini U 0 40 Y Y 1 F N 33 | F0 "U" 0 500 60 H V C CNN 34 | F1 "WeMos_mini" 0 -500 60 H V C CNN 35 | F2 "" 550 -700 60 H V C CNN 36 | F3 "" 550 -700 60 H V C CNN 37 | DRAW 38 | S -300 450 300 -550 0 1 0 N 39 | X 5V 1 -500 350 200 R 50 50 1 1 W 40 | X GND 2 -500 250 200 R 50 50 1 1 W 41 | X D4 3 -500 150 200 R 50 50 1 1 B 42 | X D3 4 -500 50 200 R 50 50 1 1 B 43 | X D2 5 -500 -50 200 R 50 50 1 1 B 44 | X D1 6 -500 -150 200 R 50 50 1 1 B 45 | X Rx 7 -500 -250 200 R 50 50 1 1 B 46 | X Tx 8 -500 -350 200 R 50 50 1 1 B 47 | X Rst 9 500 -350 200 L 50 50 1 1 B 48 | X A0 10 500 -250 200 L 50 50 1 1 B 49 | X D0 11 500 -150 200 L 50 50 1 1 B 50 | X D5 12 500 -50 200 L 50 50 1 1 B 51 | X D6 13 500 50 200 L 50 50 1 1 B 52 | X D7 14 500 150 200 L 50 50 1 1 B 53 | X D8 15 500 250 200 L 50 50 1 1 B 54 | X 3.3V 16 500 350 200 L 50 50 1 1 w 55 | ENDDRAW 56 | ENDDEF 57 | # 58 | #End Library 59 | -------------------------------------------------------------------------------- /settings.h: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at https://blog.squix.org 24 | 25 | 26 | */ 27 | 28 | // Tft library connectors 29 | #define TFT_DC D2 30 | #define TFT_CS D1 31 | #define TOUCH_CS D3 32 | #define TOUCH_IRQ D4 33 | #define LED_PIN D8 34 | 35 | // Needed for loading the map. If you want to be save better get your own key here: 36 | // https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register 37 | #define MAP_QUEST_API_KEY "r19I8UVBfwIkmE4EZR9S6yMR43eMiRDZ" 38 | 39 | // Need for loading map by google static map api. If you want to be save better create one here 40 | // https://developers.google.com/maps/documentation/static-maps/get-api-key?hl=de 41 | #define GOOGLE_API_KEY "AIzaSyBw0G8jCBry0IATNmysuyPd2fBblndS3jU" 42 | 43 | #define MAP_ZOOM 11 44 | #define MAP_WIDTH 320 45 | #define MAP_HEIGHT 192 46 | // How many pixels outside the visible map should planes be requested 47 | #define MAP_REQUEST_MARGIN 40 48 | 49 | 50 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # GND 5 | # 6 | DEF GND #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -250 50 H I C CNN 8 | F1 "GND" 0 -150 50 H V C CNN 9 | F2 "" 0 0 50 H V C CNN 10 | F3 "" 0 0 50 H V C CNN 11 | DRAW 12 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 13 | X GND 1 0 0 0 D 50 50 1 1 W N 14 | ENDDRAW 15 | ENDDEF 16 | # 17 | # ILI9341_24_Touch 18 | # 19 | DEF ILI9341_24_Touch U 0 40 Y Y 1 F N 20 | F0 "U" 550 -1200 60 H V C CNN 21 | F1 "ILI9341_24_Touch" 150 200 60 H V C CNN 22 | F2 "" 0 200 60 H V C CNN 23 | F3 "" 0 200 60 H V C CNN 24 | DRAW 25 | S -500 1100 600 -1100 0 1 0 N 26 | X T_IRQ 1 -700 950 200 R 50 50 1 1 I 27 | X T_DO 2 -700 800 200 R 50 50 1 1 I 28 | X T_DIN 3 -700 650 200 R 50 50 1 1 I 29 | X T_CS 4 -700 500 200 R 50 50 1 1 I 30 | X T_CLK 5 -700 350 200 R 50 50 1 1 I 31 | X SDO 6 -700 200 200 R 50 50 1 1 I 32 | X LED 7 -700 50 200 R 50 50 1 1 I 33 | X SCK 8 -700 -100 200 R 50 50 1 1 I 34 | X SDI 9 -700 -250 200 R 50 50 1 1 I 35 | X DC 10 -700 -400 200 R 50 50 1 1 I 36 | X RESET 11 -700 -550 200 R 50 50 1 1 I 37 | X CS 12 -700 -700 200 R 50 50 1 1 I 38 | X GND 13 -700 -850 200 R 50 50 1 1 I 39 | X VCC 14 -700 -1000 200 R 50 50 1 1 I 40 | ENDDRAW 41 | ENDDEF 42 | # 43 | # WeMos_mini 44 | # 45 | DEF WeMos_mini U 0 40 Y Y 1 F N 46 | F0 "U" 0 500 60 H V C CNN 47 | F1 "WeMos_mini" 0 -500 60 H V C CNN 48 | F2 "" 550 -700 60 H V C CNN 49 | F3 "" 550 -700 60 H V C CNN 50 | DRAW 51 | S -300 450 300 -550 0 1 0 N 52 | X 5V 1 -500 350 200 R 50 50 1 1 W 53 | X GND 2 -500 250 200 R 50 50 1 1 W 54 | X D4 3 -500 150 200 R 50 50 1 1 B 55 | X D3 4 -500 50 200 R 50 50 1 1 B 56 | X D2 5 -500 -50 200 R 50 50 1 1 B 57 | X D1 6 -500 -150 200 R 50 50 1 1 B 58 | X Rx 7 -500 -250 200 R 50 50 1 1 B 59 | X Tx 8 -500 -350 200 R 50 50 1 1 B 60 | X Rst 9 500 -350 200 L 50 50 1 1 B 61 | X A0 10 500 -250 200 L 50 50 1 1 B 62 | X D0 11 500 -150 200 L 50 50 1 1 B 63 | X D5 12 500 -50 200 L 50 50 1 1 B 64 | X D6 13 500 50 200 L 50 50 1 1 B 65 | X D7 14 500 150 200 L 50 50 1 1 B 66 | X D8 15 500 250 200 L 50 50 1 1 B 67 | X 3.3V 16 500 350 200 L 50 50 1 1 w 68 | ENDDRAW 69 | ENDDEF 70 | # 71 | #End Library 72 | -------------------------------------------------------------------------------- /WifiLocator.h: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | 25 | Base64 encoding code by Rene Nyfenegger: 26 | http://www.adp-gmbh.ch/cpp/common/base64.html 27 | 28 | */ 29 | 30 | #pragma once 31 | 32 | #include 33 | #include 34 | #include 35 | #include 36 | 37 | #define MAX_SSIDS 5 38 | 39 | #define min(a,b) ((a)<(b)?(a):(b)) 40 | 41 | class WifiLocator: public JsonListener { 42 | private: 43 | String lon_; 44 | String lat_; 45 | String key_; 46 | String result_; 47 | String range_; 48 | String base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 49 | String encodeBase64(char* bytes_to_encode, unsigned int in_len); 50 | 51 | public: 52 | WifiLocator(); 53 | 54 | void updateLocation(); 55 | 56 | void updateLocation(String bssid); 57 | 58 | void doUpdate(String query); 59 | 60 | String getLat(); 61 | 62 | String getLon(); 63 | 64 | String getRange(); 65 | 66 | String getResult(); 67 | 68 | virtual void whitespace(char c); 69 | 70 | virtual void startDocument(); 71 | 72 | virtual void key(String key); 73 | 74 | virtual void value(String value); 75 | 76 | virtual void endArray(); 77 | 78 | virtual void endObject(); 79 | 80 | virtual void endDocument(); 81 | 82 | virtual void startArray(); 83 | 84 | virtual void startObject(); 85 | }; 86 | -------------------------------------------------------------------------------- /GeoMap.h: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at https://blog.squix.org 24 | */ 25 | #pragma once 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #define MAPQUEST_TILE_LENGTH 256.0 33 | 34 | typedef void (*ProgressCallback)(String fileName, uint32_t bytesDownloaded, uint32_t bytesTotal, boolean isFirstCall); 35 | 36 | enum MapProvider { 37 | MapQuest, 38 | Google 39 | }; 40 | 41 | struct Coordinates { 42 | double lat; 43 | double lon; 44 | }; 45 | 46 | struct CoordinatesPixel { 47 | int x; 48 | int y; 49 | }; 50 | 51 | struct CoordinatesTiles { 52 | double x; 53 | double y; 54 | }; 55 | 56 | class GeoMap { 57 | private: 58 | MapProvider mapProvider_; 59 | String apiKey_; 60 | int mapWidth_, mapHeight_; 61 | long zoom_; 62 | Coordinates mapCenter_; 63 | 64 | public: 65 | GeoMap(MapProvider mapProvider, String apiKey, int mapWidth, int mapHeight); 66 | void downloadMap(Coordinates mapCenter, int zoom, ProgressCallback progressCallback); 67 | void downloadMap(Coordinates mapCenter, int zoom); 68 | String getMapName(); 69 | CoordinatesPixel convertToPixel(Coordinates coordinates); 70 | Coordinates convertToCoordinates(CoordinatesPixel coordinatesPixel); 71 | CoordinatesTiles convertToTiles(Coordinates coordinates); 72 | Coordinates convertToCoordinatesFromTiles(CoordinatesTiles tiles); 73 | void downloadFile(String url, String filename, ProgressCallback progressCallback); 74 | void downloadFile(String url, String filename); 75 | int getMapWidth(); 76 | int getMapHeight(); 77 | 78 | }; 79 | 80 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-B.Cu.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,2.032000X1.727200*% 11 | %ADD12O,2.032000X1.727200*% 12 | %ADD13C,1.800000*% 13 | %ADD14C,0.762000*% 14 | G04 APERTURE END LIST* 15 | D10* 16 | D11* 17 | X115570000Y-88900000D03* 18 | D12* 19 | X115570000Y-91440000D03* 20 | X115570000Y-93980000D03* 21 | X115570000Y-96520000D03* 22 | X115570000Y-99060000D03* 23 | X115570000Y-101600000D03* 24 | X115570000Y-104140000D03* 25 | X115570000Y-106680000D03* 26 | X115570000Y-109220000D03* 27 | X115570000Y-111760000D03* 28 | X115570000Y-114300000D03* 29 | X115570000Y-116840000D03* 30 | X115570000Y-119380000D03* 31 | X115570000Y-121920000D03* 32 | D13* 33 | X153670000Y-99060000D03* 34 | X153670000Y-101600000D03* 35 | X153670000Y-104140000D03* 36 | X153670000Y-106680000D03* 37 | X153670000Y-109220000D03* 38 | X153670000Y-111760000D03* 39 | X153670000Y-114300000D03* 40 | X153670000Y-116840000D03* 41 | X130810000Y-116840000D03* 42 | X130810000Y-114300000D03* 43 | X130810000Y-111760000D03* 44 | X130810000Y-109220000D03* 45 | X130810000Y-106680000D03* 46 | X130810000Y-104140000D03* 47 | X130810000Y-101600000D03* 48 | X130810000Y-99060000D03* 49 | D14* 50 | X115570000Y-116840000D02* 51 | X118110000Y-116840000D01* 52 | X154940000Y-104140000D02* 53 | X153670000Y-104140000D01* 54 | X156210000Y-105410000D02* 55 | X154940000Y-104140000D01* 56 | X156210000Y-118110000D02* 57 | X156210000Y-105410000D01* 58 | X153670000Y-120650000D02* 59 | X156210000Y-118110000D01* 60 | X121920000Y-120650000D02* 61 | X153670000Y-120650000D01* 62 | X118110000Y-116840000D02* 63 | X121920000Y-120650000D01* 64 | X153670000Y-111760000D02* 65 | X151130000Y-111760000D01* 66 | X128270000Y-88900000D02* 67 | X115570000Y-88900000D01* 68 | X151130000Y-111760000D02* 69 | X128270000Y-88900000D01* 70 | X115570000Y-104140000D02* 71 | X119380000Y-104140000D01* 72 | X129540000Y-114300000D02* 73 | X130810000Y-114300000D01* 74 | X119380000Y-104140000D02* 75 | X129540000Y-114300000D01* 76 | X115570000Y-101600000D02* 77 | X120650000Y-101600000D01* 78 | X120650000Y-101600000D02* 79 | X128270000Y-109220000D01* 80 | X128270000Y-109220000D02* 81 | X130810000Y-109220000D01* 82 | X115570000Y-91440000D02* 83 | X120650000Y-91440000D01* 84 | X120650000Y-91440000D02* 85 | X120650000Y-101600000D01* 86 | X115570000Y-114300000D02* 87 | X119380000Y-114300000D01* 88 | X133350000Y-99060000D02* 89 | X130810000Y-99060000D01* 90 | X134620000Y-100330000D02* 91 | X133350000Y-99060000D01* 92 | X134620000Y-116840000D02* 93 | X134620000Y-100330000D01* 94 | X132080000Y-119380000D02* 95 | X134620000Y-116840000D01* 96 | X130810000Y-119380000D02* 97 | X132080000Y-119380000D01* 98 | X124460000Y-119380000D02* 99 | X130810000Y-119380000D01* 100 | X119380000Y-114300000D02* 101 | X124460000Y-119380000D01* 102 | M02* 103 | -------------------------------------------------------------------------------- /AdsbExchangeClient.h: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | */ 25 | 26 | #pragma once 27 | 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include "GeoMap.h" 34 | 35 | #define MAX_AIRCRAFTS 10 36 | #define MAX_HISTORY 20 37 | #define MAX_HISTORY_TEMP 80 38 | 39 | #define MAX_AGE_MILLIS 15000 40 | #define min(a,b) ((a)<(b)?(a):(b)) 41 | 42 | struct AircraftPosition { 43 | int altitude; 44 | Coordinates coordinates; 45 | }; 46 | 47 | struct AircraftHistory { 48 | String call; 49 | AircraftPosition positions[MAX_HISTORY]; 50 | int counter; 51 | }; 52 | 53 | struct Aircraft { 54 | String from; 55 | String fromCode; 56 | String fromShort; 57 | String to; 58 | String toCode; 59 | String toShort; 60 | double speed; 61 | double lat; 62 | double lon; 63 | uint16_t altitude; 64 | double distance; 65 | String aircraftType; 66 | String operatorCode; 67 | double heading; 68 | String icao; 69 | String call; 70 | boolean posStall; 71 | }; 72 | 73 | 74 | 75 | 76 | class AdsbExchangeClient: public JsonListener { 77 | private: 78 | int counter = 0; 79 | int index = 0; 80 | String currentKey = ""; 81 | Aircraft aircrafts[MAX_AIRCRAFTS]; 82 | AircraftHistory histories[MAX_AIRCRAFTS]; 83 | AircraftPosition positionTemp[MAX_HISTORY_TEMP]; 84 | long lastSightingMillis = 0; 85 | int trailIndex = 0; 86 | 87 | public: 88 | AdsbExchangeClient(); 89 | 90 | void updateVisibleAircraft(String searchQuery); 91 | 92 | Aircraft getAircraft(int i); 93 | 94 | AircraftHistory getAircraftHistory(int i); 95 | 96 | int getNumberOfAircrafts(); 97 | 98 | Aircraft getClosestAircraft(Coordinates coordinates); 99 | 100 | virtual void whitespace(char c); 101 | 102 | virtual void startDocument(); 103 | 104 | virtual void key(String key); 105 | 106 | virtual void value(String value); 107 | 108 | virtual void endArray(); 109 | 110 | virtual void endObject(); 111 | 112 | virtual void endDocument(); 113 | 114 | virtual void startArray(); 115 | 116 | virtual void startObject(); 117 | 118 | }; 119 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-F.Cu.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Copper,L1,Top,Signal* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,2.032000X1.727200*% 11 | %ADD12O,2.032000X1.727200*% 12 | %ADD13C,1.800000*% 13 | %ADD14C,0.762000*% 14 | G04 APERTURE END LIST* 15 | D10* 16 | D11* 17 | X115570000Y-88900000D03* 18 | D12* 19 | X115570000Y-91440000D03* 20 | X115570000Y-93980000D03* 21 | X115570000Y-96520000D03* 22 | X115570000Y-99060000D03* 23 | X115570000Y-101600000D03* 24 | X115570000Y-104140000D03* 25 | X115570000Y-106680000D03* 26 | X115570000Y-109220000D03* 27 | X115570000Y-111760000D03* 28 | X115570000Y-114300000D03* 29 | X115570000Y-116840000D03* 30 | X115570000Y-119380000D03* 31 | X115570000Y-121920000D03* 32 | D13* 33 | X153670000Y-99060000D03* 34 | X153670000Y-101600000D03* 35 | X153670000Y-104140000D03* 36 | X153670000Y-106680000D03* 37 | X153670000Y-109220000D03* 38 | X153670000Y-111760000D03* 39 | X153670000Y-114300000D03* 40 | X153670000Y-116840000D03* 41 | X130810000Y-116840000D03* 42 | X130810000Y-114300000D03* 43 | X130810000Y-111760000D03* 44 | X130810000Y-109220000D03* 45 | X130810000Y-106680000D03* 46 | X130810000Y-104140000D03* 47 | X130810000Y-101600000D03* 48 | X130810000Y-99060000D03* 49 | D14* 50 | X115570000Y-111760000D02* 51 | X113030000Y-111760000D01* 52 | X132080000Y-85090000D02* 53 | X153670000Y-106680000D01* 54 | X114300000Y-85090000D02* 55 | X132080000Y-85090000D01* 56 | X111760000Y-87630000D02* 57 | X114300000Y-85090000D01* 58 | X111760000Y-110490000D02* 59 | X111760000Y-87630000D01* 60 | X113030000Y-111760000D02* 61 | X111760000Y-110490000D01* 62 | X115570000Y-96520000D02* 63 | X140970000Y-96520000D01* 64 | X140970000Y-96520000D02* 65 | X153670000Y-109220000D01* 66 | X115570000Y-119380000D02* 67 | X113030000Y-119380000D01* 68 | X149860000Y-114300000D02* 69 | X153670000Y-114300000D01* 70 | X148590000Y-115570000D02* 71 | X149860000Y-114300000D01* 72 | X139700000Y-124460000D02* 73 | X148590000Y-115570000D01* 74 | X113030000Y-124460000D02* 75 | X139700000Y-124460000D01* 76 | X111760000Y-123190000D02* 77 | X113030000Y-124460000D01* 78 | X111760000Y-120650000D02* 79 | X111760000Y-123190000D01* 80 | X113030000Y-119380000D02* 81 | X111760000Y-120650000D01* 82 | X115570000Y-121920000D02* 83 | X125730000Y-121920000D01* 84 | X125730000Y-121920000D02* 85 | X130810000Y-116840000D01* 86 | X115570000Y-109220000D02* 87 | X114300000Y-109220000D01* 88 | X114300000Y-93980000D02* 89 | X115570000Y-93980000D01* 90 | X113030000Y-95250000D02* 91 | X114300000Y-93980000D01* 92 | X113030000Y-107950000D02* 93 | X113030000Y-95250000D01* 94 | X114300000Y-109220000D02* 95 | X113030000Y-107950000D01* 96 | X115570000Y-109220000D02* 97 | X124460000Y-109220000D01* 98 | X127000000Y-111760000D02* 99 | X130810000Y-111760000D01* 100 | X124460000Y-109220000D02* 101 | X127000000Y-111760000D01* 102 | X126047500Y-102552500D02* 103 | X126047500Y-103187500D01* 104 | X129540000Y-106680000D02* 105 | X130810000Y-106680000D01* 106 | X126047500Y-103187500D02* 107 | X129540000Y-106680000D01* 108 | X126365000Y-102870000D02* 109 | X126047500Y-102552500D01* 110 | X126047500Y-102552500D02* 111 | X122555000Y-99060000D01* 112 | X122555000Y-99060000D02* 113 | X115570000Y-99060000D01* 114 | X115570000Y-106680000D02* 115 | X122555000Y-106680000D01* 116 | X122555000Y-106680000D02* 117 | X126365000Y-102870000D01* 118 | M02* 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP8266 Plane Spotter Color 2 | 3 | This is the repository of the ESP8266 Plane Spotter Color. It downloads data from web APIs and displays aircrafts close 4 | to your location on a map. 5 | 6 | ## Hardware 7 | 8 | This code is made for an 240x320 65K ILI9341 display with code running on an ESP8266. 9 | Since it was sometimes complicated to find the right parts I created a kit which contains all the parts including the connector PCB: 10 | https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4 11 | By buying the kit from me you are supporting future development. Thank you! 12 | 13 | [![Squix ESP8266 Color Display Kit](https://github.com/squix78/esp8266-weather-station-color/raw/master/resources/ESP8266ColorDisplayKit.png)](https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4) 14 | 15 | ## The related blog post 16 | https://blog.squix.org/2017/01/esp8266-planespotter-color.html 17 | 18 | ## Video 19 | [![ESP8266 Plane Spotter Color](http://img.youtube.com/vi/4pTkoMsl1H4/0.jpg)](http://www.youtube.com/watch?v=4pTkoMsl1H4 "Plane Spotter Color") 20 | 21 | ## Features 22 | * Beautiful startup splash screen 23 | * Automatic geo location by using WiFi scanning. List of visible SSIDs identifies your location 24 | * Automatic download of JPEGs from MapQuest 25 | * Detailed information about the nearest aircraft 26 | * Flight track: last 20 waypoints per aircraft displayed 27 | 28 | ## Planed Features 29 | * Enable touch screen 30 | * Zoom in/out by button 31 | * shift map center 32 | * call location service again 33 | * select aircraft of interest 34 | * only download map if center of map, scale or map type changed 35 | 36 | ## Known Issues 37 | * Flickering with every update: not enough memory for frame/ double buffering 38 | * Sometimes waypoints get lost 39 | * Encoding problems when displaying airport names containing non-ASCII characters (e.g. Zürich) 40 | 41 | 42 | ## Hardware Requirements 43 | 44 | This project was built for the following hardware: 45 | * ESP8266 Wifi chip, especially with the Wemos D1 Mini, but all other ESP8266 modules should work as well. 46 | * ILI9341/ XPT2046 TFT display with touch screen. 47 | 48 | Since it was sometimes complicated to find the right parts I created a kit which contains all the parts including the connector PCB: 49 | https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4 50 | By buying the kit from me you are supporting future development. Thank you! 51 | 52 | Optionally you can get the connector PCB in the kicad sub directory. This allows for a easy soldering 53 | 54 | ## Wiring/ Schema 55 | 56 | If you are currently prototyping this shows how to setup the connections for the above mentioned ILI9341 display 57 | 58 | ![Wiring](images/PlaneSpotterWiring.png) 59 | 60 | ![Schema](images/PlaneSpotterSchema.png) 61 | 62 | 63 | ## Libraries 64 | 65 | Install the following libraries: 66 | 67 | ### WifiManager by tzapu 68 | 69 | ![WifiManager](images/WifiManagerLib.png) 70 | 71 | ### Json Streaming Parser by Daniel Eichhorn 72 | 73 | ![Json Streaming Parser] (images/JsonStreamingParserLib.png) 74 | 75 | ### JPEGDecoder, fork by Frederic Plante 76 | 77 | This is (not yet?) available through the library manager. You have to download it from here and add it to the Arduino IDE 78 | https://github.com/fredericplante/JPEGDecoder 79 | 80 | *Attention:* You'll also have to open User_config.h in Arduino/libraries/JPEGDecoder-master and change 81 | ``` 82 | #define USE_SD_CARD 83 | //#define USE_SPIFFS 84 | ``` 85 | into 86 | ``` 87 | //#define USE_SD_CARD 88 | #define USE_SPIFFS 89 | ``` 90 | ### Adafruit GFX by Adafruit 91 | 92 | ![Adafruit GFX Lib](images/AdafruitGFXLib.png) 93 | 94 | ## Credits 95 | 96 | This project wouldn't be possible if not for many open source contributors. Here are some I'd like to mention: 97 | * Frédéric Plante for his adaptations of the JPEGDecoder library 98 | * tzapu for the WifiManager library 99 | * Rene Nyfenegger for the base64 encoder I got from here: http://www.adp-gmbh.ch/cpp/common/base64.html 100 | * Adafruit for the ILI9341 driver and potentially also for the original designs of the TFT display 101 | -------------------------------------------------------------------------------- /PlaneSpotter.h: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at https://blog.squix.org 24 | 25 | 26 | */ 27 | 28 | #pragma once 29 | 30 | #include 31 | // JPEG decoder library 32 | #include 33 | #include 34 | #include "AdsbExchangeClient.h" 35 | #include "ILI9341.h" 36 | #include "GeoMap.h" 37 | 38 | 39 | 40 | #define TFT_BLACK 0x0000 41 | #define TFT_BLUE 0x001F 42 | #define TFT_RED 0xF800 43 | #define TFT_GREEN 0x07E0 44 | #define TFT_CYAN 0x07FF 45 | #define TFT_MAGENTA 0xF81F 46 | #define TFT_YELLOW 0xFFE0 47 | #define TFT_WHITE 0xFFFF 48 | 49 | #define TS_MIN_X 220 50 | #define TS_MIN_Y 350 51 | #define TS_MAX_X 4000 52 | #define TS_MAX_Y 3500 53 | 54 | enum TextAlignment { 55 | LEFT, CENTER, RIGHT 56 | }; 57 | 58 | class PlaneSpotter { 59 | public: 60 | PlaneSpotter(Adafruit_ILI9341* tft, GeoMap* geoMap); 61 | void copyProgmemToSpiffs(const uint8_t *data, unsigned int length, String filename); 62 | 63 | void drawSPIFFSJpeg(String filename, int xpos, int ypos); 64 | void renderJPEG(int xpos, int ypos); 65 | 66 | void drawPlane(Aircraft aircraft, boolean isSpecial); 67 | 68 | void drawInfoBox(Aircraft closestAircraft); 69 | 70 | void drawAircraftHistory(Aircraft aircraft, AircraftHistory history); 71 | 72 | void drawMenu(); 73 | 74 | void drawString(int x, int y, char *text); 75 | 76 | void drawString(int x, int y, String text); 77 | 78 | void setTextAlignment(TextAlignment alignment); 79 | 80 | void setTextColor(uint16_t c); 81 | 82 | void setTextColor(uint16_t c, uint16_t bg); 83 | 84 | void setTouchScreen(XPT2046_Touchscreen* touchScreen); 85 | 86 | void setTouchScreenCalibration(uint16_t minX, uint16_t minY, uint16_t maxX, uint16_t maxY); 87 | 88 | CoordinatesPixel getTouchPoint(); 89 | 90 | private: 91 | Adafruit_ILI9341* tft_; 92 | XPT2046_Touchscreen* touchScreen_; 93 | GeoMap* geoMap_; 94 | // Shape of the plane 95 | // The points are defined as degree on a circle, the first array are the degrees, 96 | // the second the radius of the circle 97 | int planeDeg_[5] = {0, 130, 180, 230, 0}; 98 | int planeRadius_[5] = {10, 10, 3, 10, 10}; 99 | //const uint16_t heightPalette_[40] = {0x081F, 0x00FF, 0x027F, 0x029F, 0x037F, 0x041F, 0x047F, 0x0E5F, 0x0F5F, 0x07DF, 0x0FFC, 0x0FF8, 0x07D2, 0x07CD, 0x0FCA, 0x07C7, 0x07C3, 0x1FA2, 0x27C1, 0x57A1, 100 | // 0x87A1, 0x9FA2, 0xBFA2, 0xEF82, 0xF763, 0xF6A3, 0xF5C3, 0xF4E3, 0xF3E3, 0xF324, 0xF243, 0xF123, 0xF803, 0xF807, 0xF80D, 0xF810, 0xF815, 0xF81A, 0xF81E, 0xF81F}; 101 | const uint16_t heightPalette_[10] = {0x30FE, 0x00BF, 0x041F, 0x063F, 0x07EC, 0xD7C1, 0xF401, 0xF084, 0xF0B4, 0xF0DD}; 102 | int planeDots_ = 5; 103 | TextAlignment alignment_ = LEFT; 104 | uint16_t textColor_; 105 | uint16_t backgroundColor_; 106 | uint16_t minX_ = TS_MIN_X; 107 | uint16_t minY_ = TS_MIN_Y; 108 | uint16_t maxX_ = TS_MAX_X; 109 | uint16_t maxY_ = TS_MAX_Y; 110 | 111 | 112 | 113 | 114 | 115 | }; 116 | 117 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.bak: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:microcontrollers 14 | LIBS:dsp 15 | LIBS:microchip 16 | LIBS:analog_switches 17 | LIBS:motorola 18 | LIBS:texas 19 | LIBS:intel 20 | LIBS:audio 21 | LIBS:interface 22 | LIBS:digital-audio 23 | LIBS:philips 24 | LIBS:display 25 | LIBS:cypress 26 | LIBS:siliconi 27 | LIBS:opto 28 | LIBS:atmel 29 | LIBS:contrib 30 | LIBS:valves 31 | LIBS:wemos_mini 32 | LIBS:PartLib 33 | LIBS:MeetingRoomDisplayConnector-cache 34 | EELAYER 25 0 35 | EELAYER END 36 | $Descr A4 11693 8268 37 | encoding utf-8 38 | Sheet 1 1 39 | Title "" 40 | Date "" 41 | Rev "" 42 | Comp "" 43 | Comment1 "" 44 | Comment2 "" 45 | Comment3 "" 46 | Comment4 "" 47 | $EndDescr 48 | $Comp 49 | L WeMos_mini U? 50 | U 1 1 5846DA55 51 | P 5350 4000 52 | F 0 "U?" H 5350 4500 60 0000 C CNN 53 | F 1 "WeMos_mini" H 5350 3500 60 0000 C CNN 54 | F 2 "" H 5900 3300 60 0000 C CNN 55 | F 3 "" H 5900 3300 60 0000 C CNN 56 | 1 5350 4000 57 | 1 0 0 -1 58 | $EndComp 59 | $Comp 60 | L ILI9341_24_Touch U? 61 | U 1 1 5846DFFC 62 | P 7300 4050 63 | F 0 "U?" H 7850 2850 60 0000 C CNN 64 | F 1 "ILI9341_24_Touch" H 7450 4250 60 0000 C CNN 65 | F 2 "" H 7300 4250 60 0000 C CNN 66 | F 3 "" H 7300 4250 60 0000 C CNN 67 | 1 7300 4050 68 | 1 0 0 -1 69 | $EndComp 70 | Wire Wire Line 71 | 5850 3650 6250 3650 72 | Wire Wire Line 73 | 4850 3750 4200 3750 74 | $Comp 75 | L GND #PWR? 76 | U 1 1 5846E091 77 | P 4200 3750 78 | F 0 "#PWR?" H 4200 3500 50 0001 C CNN 79 | F 1 "GND" H 4200 3600 50 0000 C CNN 80 | F 2 "" H 4200 3750 50 0000 C CNN 81 | F 3 "" H 4200 3750 50 0000 C CNN 82 | 1 4200 3750 83 | 1 0 0 -1 84 | $EndComp 85 | $Comp 86 | L GND #PWR? 87 | U 1 1 5846E0A9 88 | P 6350 4850 89 | F 0 "#PWR?" H 6350 4600 50 0001 C CNN 90 | F 1 "GND" H 6350 4700 50 0000 C CNN 91 | F 2 "" H 6350 4850 50 0000 C CNN 92 | F 3 "" H 6350 4850 50 0000 C CNN 93 | 1 6350 4850 94 | 1 0 0 -1 95 | $EndComp 96 | Wire Wire Line 97 | 6350 4850 6500 4850 98 | Wire Wire Line 99 | 6500 4850 6500 4900 100 | Wire Wire Line 101 | 6500 4900 6600 4900 102 | Text Label 6250 3650 2 60 ~ 0 103 | VCC 104 | Text Label 6250 5300 2 60 ~ 0 105 | VCC 106 | Wire Wire Line 107 | 6600 5050 6600 5300 108 | Wire Wire Line 109 | 6600 5300 6250 5300 110 | Wire Wire Line 111 | 4850 4150 4600 4150 112 | Wire Wire Line 113 | 4600 4150 4600 4750 114 | Wire Wire Line 115 | 4600 4750 6600 4750 116 | Wire Wire Line 117 | 5850 4350 5950 4350 118 | Wire Wire Line 119 | 5950 4350 5950 4600 120 | Wire Wire Line 121 | 5950 4600 6600 4600 122 | Wire Wire Line 123 | 4850 4050 4500 4050 124 | Wire Wire Line 125 | 4500 4050 4500 4850 126 | Wire Wire Line 127 | 4500 4850 6250 4850 128 | Wire Wire Line 129 | 6250 4850 6250 4450 130 | Wire Wire Line 131 | 6250 4450 6600 4450 132 | Wire Wire Line 133 | 5850 3850 6350 3850 134 | Wire Wire Line 135 | 6250 3850 6250 4300 136 | Wire Wire Line 137 | 6250 4300 6600 4300 138 | Wire Wire Line 139 | 6600 3400 6350 3400 140 | Wire Wire Line 141 | 6350 3400 6350 3850 142 | Connection ~ 6250 3850 143 | Wire Wire Line 144 | 5850 4050 6400 4050 145 | Wire Wire Line 146 | 6350 4050 6350 4150 147 | Wire Wire Line 148 | 6350 4150 6600 4150 149 | Wire Wire Line 150 | 6600 3700 6400 3700 151 | Wire Wire Line 152 | 6400 3700 6400 4050 153 | Connection ~ 6350 4050 154 | Wire Wire Line 155 | 5850 3950 6000 3950 156 | Wire Wire Line 157 | 6000 3950 6000 3250 158 | Wire Wire Line 159 | 6000 3250 6600 3250 160 | Wire Wire Line 161 | 6600 3850 6450 3850 162 | Wire Wire Line 163 | 6450 3850 6450 3250 164 | Connection ~ 6450 3250 165 | Wire Wire Line 166 | 4850 3850 4500 3850 167 | Wire Wire Line 168 | 4500 3850 4500 3100 169 | Wire Wire Line 170 | 4500 3100 6600 3100 171 | Wire Wire Line 172 | 4850 3950 4650 3950 173 | Wire Wire Line 174 | 4650 3950 4650 3500 175 | Wire Wire Line 176 | 4650 3500 6600 3500 177 | Wire Wire Line 178 | 6600 3500 6600 3550 179 | Wire Wire Line 180 | 5850 3750 6100 3750 181 | Wire Wire Line 182 | 6100 3750 6100 4000 183 | Wire Wire Line 184 | 6100 4000 6600 4000 185 | $EndSCHEMATC 186 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:microcontrollers 14 | LIBS:dsp 15 | LIBS:microchip 16 | LIBS:analog_switches 17 | LIBS:motorola 18 | LIBS:texas 19 | LIBS:intel 20 | LIBS:audio 21 | LIBS:interface 22 | LIBS:digital-audio 23 | LIBS:philips 24 | LIBS:display 25 | LIBS:cypress 26 | LIBS:siliconi 27 | LIBS:opto 28 | LIBS:atmel 29 | LIBS:contrib 30 | LIBS:valves 31 | LIBS:wemos_mini 32 | LIBS:PartLib 33 | LIBS:MeetingRoomDisplayConnector-cache 34 | EELAYER 25 0 35 | EELAYER END 36 | $Descr A4 11693 8268 37 | encoding utf-8 38 | Sheet 1 1 39 | Title "" 40 | Date "" 41 | Rev "" 42 | Comp "" 43 | Comment1 "" 44 | Comment2 "" 45 | Comment3 "" 46 | Comment4 "" 47 | $EndDescr 48 | $Comp 49 | L WeMos_mini U1 50 | U 1 1 5846DA55 51 | P 5350 4000 52 | F 0 "U1" H 5350 4500 60 0000 C CNN 53 | F 1 "WeMos_mini" H 5350 3500 60 0000 C CNN 54 | F 2 "wemos_d1_mini:D1_mini_board" H 5900 3300 60 0001 C CNN 55 | F 3 "" H 5900 3300 60 0000 C CNN 56 | 1 5350 4000 57 | 1 0 0 -1 58 | $EndComp 59 | $Comp 60 | L ILI9341_24_Touch U2 61 | U 1 1 5846DFFC 62 | P 7300 4050 63 | F 0 "U2" H 7850 2850 60 0000 C CNN 64 | F 1 "ILI9341_24_Touch" H 7450 4250 60 0000 C CNN 65 | F 2 "Pin_Headers:Pin_Header_Straight_1x14" H 7300 4250 60 0001 C CNN 66 | F 3 "" H 7300 4250 60 0000 C CNN 67 | 1 7300 4050 68 | 1 0 0 -1 69 | $EndComp 70 | Wire Wire Line 71 | 5850 3650 6250 3650 72 | Wire Wire Line 73 | 4850 3750 4200 3750 74 | $Comp 75 | L GND #PWR01 76 | U 1 1 5846E091 77 | P 4200 3750 78 | F 0 "#PWR01" H 4200 3500 50 0001 C CNN 79 | F 1 "GND" H 4200 3600 50 0000 C CNN 80 | F 2 "" H 4200 3750 50 0000 C CNN 81 | F 3 "" H 4200 3750 50 0000 C CNN 82 | 1 4200 3750 83 | 1 0 0 -1 84 | $EndComp 85 | $Comp 86 | L GND #PWR02 87 | U 1 1 5846E0A9 88 | P 6350 4850 89 | F 0 "#PWR02" H 6350 4600 50 0001 C CNN 90 | F 1 "GND" H 6350 4700 50 0000 C CNN 91 | F 2 "" H 6350 4850 50 0000 C CNN 92 | F 3 "" H 6350 4850 50 0000 C CNN 93 | 1 6350 4850 94 | 1 0 0 -1 95 | $EndComp 96 | Wire Wire Line 97 | 6350 4850 6500 4850 98 | Wire Wire Line 99 | 6500 4850 6500 4900 100 | Wire Wire Line 101 | 6500 4900 6600 4900 102 | Text Label 6250 3650 2 60 ~ 0 103 | VCC 104 | Text Label 6250 5300 2 60 ~ 0 105 | VCC 106 | Wire Wire Line 107 | 6600 5050 6600 5300 108 | Wire Wire Line 109 | 6600 5300 6250 5300 110 | Wire Wire Line 111 | 4850 4150 4600 4150 112 | Wire Wire Line 113 | 4600 4150 4600 4750 114 | Wire Wire Line 115 | 4600 4750 6600 4750 116 | Wire Wire Line 117 | 5850 4350 5950 4350 118 | Wire Wire Line 119 | 5950 4350 5950 4600 120 | Wire Wire Line 121 | 5950 4600 6600 4600 122 | Wire Wire Line 123 | 4850 4050 4500 4050 124 | Wire Wire Line 125 | 4500 4050 4500 4850 126 | Wire Wire Line 127 | 4500 4850 6250 4850 128 | Wire Wire Line 129 | 6250 4850 6250 4450 130 | Wire Wire Line 131 | 6250 4450 6600 4450 132 | Wire Wire Line 133 | 5850 3850 6350 3850 134 | Wire Wire Line 135 | 6250 3850 6250 4300 136 | Wire Wire Line 137 | 6250 4300 6600 4300 138 | Wire Wire Line 139 | 6600 3400 6350 3400 140 | Wire Wire Line 141 | 6350 3400 6350 3850 142 | Connection ~ 6250 3850 143 | Wire Wire Line 144 | 5850 4050 6400 4050 145 | Wire Wire Line 146 | 6350 4050 6350 4150 147 | Wire Wire Line 148 | 6350 4150 6600 4150 149 | Wire Wire Line 150 | 6600 3700 6400 3700 151 | Wire Wire Line 152 | 6400 3700 6400 4050 153 | Connection ~ 6350 4050 154 | Wire Wire Line 155 | 5850 3950 6000 3950 156 | Wire Wire Line 157 | 6000 3950 6000 3250 158 | Wire Wire Line 159 | 6000 3250 6600 3250 160 | Wire Wire Line 161 | 6600 3850 6450 3850 162 | Wire Wire Line 163 | 6450 3850 6450 3250 164 | Connection ~ 6450 3250 165 | Wire Wire Line 166 | 4850 3850 4500 3850 167 | Wire Wire Line 168 | 4500 3850 4500 3100 169 | Wire Wire Line 170 | 4500 3100 6600 3100 171 | Wire Wire Line 172 | 4850 3950 4650 3950 173 | Wire Wire Line 174 | 4650 3950 4650 3500 175 | Wire Wire Line 176 | 4650 3500 6600 3500 177 | Wire Wire Line 178 | 6600 3500 6600 3550 179 | Wire Wire Line 180 | 5850 3750 6100 3750 181 | Wire Wire Line 182 | 6100 3750 6100 4000 183 | Wire Wire Line 184 | 6100 4000 6600 4000 185 | $EndSCHEMATC 186 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.net: -------------------------------------------------------------------------------- 1 | (export (version D) 2 | (design 3 | (source /Users/deichhor/Documents/MeetingRoomDisplay/KiCad/MeetingRoomDisplayConnector.sch) 4 | (date "2016 December 06, Tuesday 17:05:14") 5 | (tool "Eeschema 4.0.2-stable") 6 | (sheet (number 1) (name /) (tstamps /) 7 | (title_block 8 | (title) 9 | (company) 10 | (rev) 11 | (date) 12 | (source MeetingRoomDisplayConnector.sch) 13 | (comment (number 1) (value "")) 14 | (comment (number 2) (value "")) 15 | (comment (number 3) (value "")) 16 | (comment (number 4) (value ""))))) 17 | (components 18 | (comp (ref U1) 19 | (value WeMos_mini) 20 | (footprint wemos_d1_mini:D1_mini_board) 21 | (libsource (lib wemos_mini) (part WeMos_mini)) 22 | (sheetpath (names /) (tstamps /)) 23 | (tstamp 5846DA55)) 24 | (comp (ref U2) 25 | (value ILI9341_24_Touch) 26 | (footprint Pin_Headers:Pin_Header_Straight_1x14) 27 | (libsource (lib MeetingRoomDisplayConnector-cache) (part ILI9341_24_Touch)) 28 | (sheetpath (names /) (tstamps /)) 29 | (tstamp 5846DFFC))) 30 | (libparts 31 | (libpart (lib MeetingRoomDisplayConnector-cache) (part ILI9341_24_Touch) 32 | (fields 33 | (field (name Reference) U) 34 | (field (name Value) ILI9341_24_Touch)) 35 | (pins 36 | (pin (num 1) (name T_IRQ) (type input)) 37 | (pin (num 2) (name T_DO) (type input)) 38 | (pin (num 3) (name T_DIN) (type input)) 39 | (pin (num 4) (name T_CS) (type input)) 40 | (pin (num 5) (name T_CLK) (type input)) 41 | (pin (num 6) (name SDO) (type input)) 42 | (pin (num 7) (name LED) (type input)) 43 | (pin (num 8) (name SCK) (type input)) 44 | (pin (num 9) (name SDI) (type input)) 45 | (pin (num 10) (name DC) (type input)) 46 | (pin (num 11) (name RESET) (type input)) 47 | (pin (num 12) (name CS) (type input)) 48 | (pin (num 13) (name GND) (type input)) 49 | (pin (num 14) (name VCC) (type input)))) 50 | (libpart (lib wemos_mini) (part WeMos_mini) 51 | (description "WeMos D1 mini") 52 | (docs http://www.wemos.cc/Products/d1_mini.html) 53 | (fields 54 | (field (name Reference) U) 55 | (field (name Value) WeMos_mini)) 56 | (pins 57 | (pin (num 1) (name 5V) (type power_in)) 58 | (pin (num 2) (name GND) (type power_in)) 59 | (pin (num 3) (name D4) (type BiDi)) 60 | (pin (num 4) (name D3) (type BiDi)) 61 | (pin (num 5) (name D2) (type BiDi)) 62 | (pin (num 6) (name D1) (type BiDi)) 63 | (pin (num 7) (name Rx) (type BiDi)) 64 | (pin (num 8) (name Tx) (type BiDi)) 65 | (pin (num 9) (name Rst) (type BiDi)) 66 | (pin (num 10) (name A0) (type BiDi)) 67 | (pin (num 11) (name D0) (type BiDi)) 68 | (pin (num 12) (name D5) (type BiDi)) 69 | (pin (num 13) (name D6) (type BiDi)) 70 | (pin (num 14) (name D7) (type BiDi)) 71 | (pin (num 15) (name D8) (type BiDi)) 72 | (pin (num 16) (name 3.3V) (type power_out))))) 73 | (libraries 74 | (library (logical MeetingRoomDisplayConnector-cache) 75 | (uri /Users/deichhor/Documents/MeetingRoomDisplay/KiCad/MeetingRoomDisplayConnector-cache.lib)) 76 | (library (logical wemos_mini) 77 | (uri /Users/deichhor/git/d1_mini_kicad/library/wemos_mini.lib))) 78 | (nets 79 | (net (code 1) (name "Net-(U1-Pad14)") 80 | (node (ref U1) (pin 14)) 81 | (node (ref U2) (pin 3)) 82 | (node (ref U2) (pin 9))) 83 | (net (code 2) (name "Net-(U1-Pad5)") 84 | (node (ref U2) (pin 10)) 85 | (node (ref U1) (pin 5))) 86 | (net (code 3) (name "Net-(U1-Pad9)") 87 | (node (ref U1) (pin 9)) 88 | (node (ref U2) (pin 11))) 89 | (net (code 4) (name "Net-(U1-Pad6)") 90 | (node (ref U2) (pin 12)) 91 | (node (ref U1) (pin 6))) 92 | (net (code 5) (name /VCC) 93 | (node (ref U1) (pin 16)) 94 | (node (ref U2) (pin 14))) 95 | (net (code 6) (name "Net-(U1-Pad15)") 96 | (node (ref U1) (pin 15)) 97 | (node (ref U2) (pin 7))) 98 | (net (code 7) (name "Net-(U1-Pad4)") 99 | (node (ref U2) (pin 4)) 100 | (node (ref U1) (pin 4))) 101 | (net (code 8) (name "Net-(U1-Pad3)") 102 | (node (ref U2) (pin 1)) 103 | (node (ref U1) (pin 3))) 104 | (net (code 9) (name "Net-(U1-Pad13)") 105 | (node (ref U1) (pin 13)) 106 | (node (ref U2) (pin 2)) 107 | (node (ref U2) (pin 6))) 108 | (net (code 10) (name "Net-(U1-Pad12)") 109 | (node (ref U2) (pin 8)) 110 | (node (ref U2) (pin 5)) 111 | (node (ref U1) (pin 12))) 112 | (net (code 11) (name "Net-(U1-Pad11)") 113 | (node (ref U1) (pin 11))) 114 | (net (code 12) (name "Net-(U1-Pad10)") 115 | (node (ref U1) (pin 10))) 116 | (net (code 13) (name "Net-(U1-Pad8)") 117 | (node (ref U1) (pin 8))) 118 | (net (code 14) (name "Net-(U1-Pad7)") 119 | (node (ref U1) (pin 7))) 120 | (net (code 15) (name "Net-(U1-Pad1)") 121 | (node (ref U1) (pin 1))) 122 | (net (code 16) (name GND) 123 | (node (ref U2) (pin 13)) 124 | (node (ref U1) (pin 2))))) -------------------------------------------------------------------------------- /openscad/enclosure.scad: -------------------------------------------------------------------------------- 1 | $fn = 100; 2 | pcbWidth = 42.72; 3 | pcbLength = 77.18; 4 | 5 | displayBorderX = 1.86; 6 | displayBorderY = 16.2; 7 | displayLength = 53; 8 | spacing = 6; 9 | wall = 2.5; 10 | lidWall = 2; 11 | rimHeight = 3; 12 | holeRadius = 3.2 / 2 - 0.5; 13 | bottomLeftX = 3; 14 | bottomLeftY = 6.92; 15 | bottomRightX = pcbWidth - bottomLeftX; 16 | bottomRightY = bottomLeftY; 17 | topLeftX = 3; 18 | topLeftY = pcbLength - 3; 19 | topRightX = pcbWidth - bottomLeftX; 20 | topRightY = pcbLength - 3; 21 | poleHeight = wall + 5.6; 22 | 23 | boxWidth = 2 * (spacing + wall) + pcbWidth; 24 | boxLength = 2 * (spacing + wall) + pcbLength; 25 | boxHeight = 20; 26 | 27 | screwHoleRadius = 1.5; 28 | lidHoleRadius = 1.4; 29 | screwHolePoleRadius = 3; 30 | screwHoleHeight = 5; 31 | lidPusherWidth = 30; 32 | lidPusherLength = 2; 33 | lidPusherHeight = 12.3; 34 | lidPusherOffsetY = 20; 35 | 36 | connectorHoleX = pcbWidth + 10; 37 | connectorHoleY = 14 + spacing + wall; 38 | connectorHoleZ = 7 + wall; 39 | 40 | module bottomCase() { 41 | difference() { 42 | cube([boxWidth, boxLength, boxHeight]); 43 | translate([wall, wall, wall]) 44 | cube([boxWidth - 2 * wall, boxLength - 2 * wall, boxHeight]); 45 | } 46 | }; 47 | module poles() { 48 | pcbOffset = wall + spacing; 49 | 50 | translate([pcbOffset + bottomLeftX, pcbOffset + bottomLeftY, 0]) 51 | cylinder(r=holeRadius, h = poleHeight); 52 | translate([pcbOffset + bottomRightX, pcbOffset + bottomRightY, 0]) 53 | cylinder(r=holeRadius, h = poleHeight); 54 | translate([pcbOffset + topLeftX, pcbOffset + topLeftY, 0]) 55 | cylinder(r=holeRadius, h = poleHeight); 56 | translate([pcbOffset + topRightX, pcbOffset + topRightY, 0]) 57 | cylinder(r=holeRadius, h = poleHeight); 58 | } 59 | module screwHoles() { 60 | difference() { 61 | union() { 62 | translate([screwHolePoleRadius, screwHolePoleRadius, rimHeight]) 63 | cylinder(r = screwHolePoleRadius, h = boxHeight - rimHeight); 64 | translate([boxWidth - screwHolePoleRadius, boxLength - screwHolePoleRadius, rimHeight]) 65 | cylinder(r = screwHolePoleRadius, h = boxHeight - rimHeight); 66 | translate([screwHolePoleRadius, boxLength - screwHolePoleRadius, rimHeight]) 67 | cylinder(r = screwHolePoleRadius, h = boxHeight - rimHeight); 68 | translate([boxWidth - screwHolePoleRadius, screwHolePoleRadius, rimHeight]) 69 | cylinder(r = screwHolePoleRadius, h = boxHeight - rimHeight); 70 | } 71 | union() { 72 | translate([screwHolePoleRadius, screwHolePoleRadius, boxHeight - screwHoleHeight]) 73 | cylinder(r = screwHoleRadius, h = 5); 74 | translate([boxWidth - screwHolePoleRadius, boxLength - screwHolePoleRadius, boxHeight - screwHoleHeight]) 75 | cylinder(r = screwHoleRadius, h = 5); 76 | translate([screwHolePoleRadius, boxLength - screwHolePoleRadius, boxHeight - screwHoleHeight]) 77 | cylinder(r = screwHoleRadius, h = 5); 78 | translate([boxWidth - screwHolePoleRadius, screwHolePoleRadius, boxHeight - screwHoleHeight]) 79 | cylinder(r = screwHoleRadius, h = 5); 80 | 81 | } 82 | } 83 | } 84 | module connectorHole() { 85 | translate([connectorHoleX, connectorHoleY, connectorHoleZ]) 86 | cube([10, 15, 20]); 87 | } 88 | module case() { 89 | difference() { 90 | union() { 91 | bottomCase(); 92 | 93 | } 94 | union() { 95 | //translate([wall + spacing + displayBorderX, wall + spacing + displayBorderY, -5]) 96 | // cube([pcbWidth - 2 * displayBorderX, displayLength, 30]); 97 | cutAways(); 98 | connectorHole(); 99 | } 100 | } 101 | } 102 | module lid() { 103 | translate([(boxWidth - lidPusherWidth) / 2, boxLength - lidPusherOffsetY, lidWall]) 104 | cube([lidPusherWidth, lidPusherLength, lidPusherHeight]); 105 | difference() { 106 | cube([boxWidth, boxLength, lidWall]); 107 | 108 | union() { 109 | translate([screwHolePoleRadius, screwHolePoleRadius, -2]) 110 | cylinder(r = lidHoleRadius, h = 5); 111 | translate([boxWidth - screwHolePoleRadius, boxLength - screwHolePoleRadius, -2]) 112 | cylinder(r = lidHoleRadius, h = 5); 113 | translate([boxWidth - screwHolePoleRadius, screwHolePoleRadius, -2]) 114 | cylinder(r = lidHoleRadius, h = 5); 115 | translate([screwHolePoleRadius, boxLength - screwHolePoleRadius, -2]) 116 | cylinder(r = lidHoleRadius, h = 5); 117 | } 118 | } 119 | } 120 | module cutAways() { 121 | increment = 2; 122 | 123 | hull() { 124 | translate([wall + spacing + displayBorderX, wall + spacing + displayBorderY, wall - 0.5]) 125 | cube([pcbWidth - 2 * displayBorderX, displayLength, 0.5]); 126 | translate([wall + spacing + displayBorderX - increment, wall + spacing + displayBorderY - increment, -0.5]) 127 | cube([pcbWidth - 2 * displayBorderX + 2*increment, displayLength + 2 * increment, 0.5]); 128 | }; 129 | translate([0, 0, rimHeight]) 130 | rotate([0, 150, 0]) 131 | cube([5, boxLength, 20]); 132 | translate([0,0, rimHeight]) 133 | rotate([210, 0, 0]) 134 | cube([boxWidth, 5, 20]); 135 | translate([boxWidth, 0, rimHeight]) 136 | rotate([0, 210, 0]) 137 | translate([-5, 0, 0]) 138 | cube([5, boxLength, 20]); 139 | translate([0, boxLength, rimHeight]) 140 | rotate([150, 0, 0]) 141 | translate([0, -5, 0]) 142 | cube([boxWidth, 5, 20]); 143 | } 144 | module allCase() { 145 | //cutAways(); 146 | screwHoles(); 147 | case(); 148 | 149 | poles(); 150 | } 151 | //allCase(); 152 | lid(); 153 | 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /WifiLocator.cpp: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | 25 | Base64 encoding code by Rene Nyfenegger: 26 | http://www.adp-gmbh.ch/cpp/common/base64.html 27 | 28 | */ 29 | 30 | #include "WifiLocator.h" 31 | 32 | WifiLocator::WifiLocator() { 33 | 34 | } 35 | 36 | void WifiLocator::updateLocation() { 37 | int n = min(WiFi.scanNetworks(false,true), MAX_SSIDS); 38 | String multiAPString = ""; 39 | if (n > 0) { 40 | for (int i = 0; i < n; i++) { 41 | if (i > 0) { 42 | multiAPString += ","; 43 | } 44 | multiAPString += WiFi.BSSIDstr(i) + "," + WiFi.RSSI(i); 45 | } 46 | Serial.println(multiAPString); 47 | char multiAPs[multiAPString.length() + 1]; 48 | multiAPString.toCharArray(multiAPs, multiAPString.length()); 49 | multiAPString = encodeBase64(multiAPs, multiAPString.length()); 50 | Serial.println(multiAPString); 51 | doUpdate("/wifi?v=1.1&search=" + multiAPString); 52 | } 53 | } 54 | 55 | void WifiLocator::updateLocation(String bssid) { 56 | doUpdate("/wifi?v=1.1&bssid=" + bssid); 57 | } 58 | 59 | void WifiLocator::doUpdate(String query) { 60 | JsonStreamingParser parser; 61 | parser.setListener(this); 62 | WiFiClient client; 63 | const int httpPort = 80; 64 | // http://api.mylnikov.org/geolocation/wifi?v=1.1&data=open&bssid=00:0C:42:1F:65:E9 65 | if (!client.connect("api.mylnikov.org", httpPort)) { 66 | Serial.println("connection failed"); 67 | return; 68 | } 69 | 70 | Serial.print("Requesting URL: "); 71 | Serial.println(query); 72 | 73 | // This will send the request to the server 74 | client.print(String("GET ") + query + " HTTP/1.1\r\n" + 75 | "Host: api.mylnikov.org\r\n" + 76 | "Connection: close\r\n\r\n"); 77 | int retryCounter = 0; 78 | while(!client.available()) { 79 | delay(1000); 80 | retryCounter++; 81 | if (retryCounter > 10) { 82 | return; 83 | } 84 | } 85 | 86 | int pos = 0; 87 | boolean isBody = false; 88 | char c; 89 | 90 | int size = 0; 91 | client.setNoDelay(false); 92 | while(client.connected()) { 93 | while((size = client.available()) > 0) { 94 | c = client.read(); 95 | if (c == '{' || c == '[') { 96 | Serial.print(c); 97 | isBody = true; 98 | } 99 | if (isBody) { 100 | parser.parse(c); 101 | } 102 | } 103 | } 104 | } 105 | 106 | void WifiLocator::key(String key) { 107 | key_ = key; 108 | } 109 | 110 | void WifiLocator::value(String value) { 111 | if (key_ == "result") { 112 | result_ = value; 113 | } 114 | if (key_ == "lat") { 115 | lat_ = value; 116 | } 117 | if (key_ == "lon") { 118 | lon_ = value; 119 | } 120 | if (key_ == "range") { 121 | range_ = value; 122 | } 123 | Serial.println("Key " + key_ + ", value: " + value); 124 | } 125 | 126 | String WifiLocator::getLon() { 127 | return lon_; 128 | } 129 | 130 | String WifiLocator::getLat() { 131 | return lat_; 132 | } 133 | 134 | String WifiLocator::getRange() { 135 | return range_; 136 | } 137 | 138 | String WifiLocator::getResult() { 139 | return result_; 140 | } 141 | 142 | void WifiLocator::whitespace(char c) { 143 | 144 | } 145 | 146 | void WifiLocator::startDocument() { 147 | 148 | } 149 | 150 | void WifiLocator::endArray() { 151 | 152 | } 153 | 154 | void WifiLocator::endObject() { 155 | 156 | } 157 | 158 | void WifiLocator::endDocument() { 159 | 160 | } 161 | 162 | void WifiLocator::startArray() { 163 | 164 | } 165 | 166 | void WifiLocator::startObject() { 167 | 168 | } 169 | 170 | /* 171 | * Base64 code by Rene Nyfenegger: 172 | * http://www.adp-gmbh.ch/cpp/common/base64.html 173 | */ 174 | String WifiLocator::encodeBase64(char* bytes_to_encode, unsigned int in_len) { 175 | String ret; 176 | int i = 0; 177 | int j = 0; 178 | unsigned char char_array_3[3]; 179 | unsigned char char_array_4[4]; 180 | 181 | while (in_len--) { 182 | char_array_3[i++] = *(bytes_to_encode++); 183 | if (i == 3) { 184 | char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; 185 | char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); 186 | char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); 187 | char_array_4[3] = char_array_3[2] & 0x3f; 188 | 189 | for(i = 0; (i <4) ; i++) 190 | ret += base64_chars[char_array_4[i]]; 191 | i = 0; 192 | } 193 | } 194 | 195 | if (i) 196 | { 197 | for(j = i; j < 3; j++) 198 | char_array_3[j] = '\0'; 199 | 200 | char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; 201 | char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); 202 | char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); 203 | char_array_4[3] = char_array_3[2] & 0x3f; 204 | 205 | for (j = 0; (j < i + 1); j++) 206 | ret += base64_chars[char_array_4[j]]; 207 | 208 | while((i++ < 3)) 209 | ret += '='; 210 | 211 | } 212 | 213 | return ret; 214 | 215 | } 216 | 217 | -------------------------------------------------------------------------------- /kicad/WemosD1Mini.pretty/D1_mini_board.kicad_mod: -------------------------------------------------------------------------------- 1 | (module D1_mini_board (layer F.Cu) (tedit 58697A45) 2 | (fp_text reference U1 (at 1.27 18.81) (layer B.SilkS) 3 | (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) 4 | ) 5 | (fp_text value WeMos_mini (at 1.27 -12.065) (layer F.Fab) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text user WeMos (at 0 -15.24) (layer B.SilkS) 9 | (effects (font (size 3 3) (thickness 0.15)) (justify mirror)) 10 | ) 11 | (fp_line (start -6.35 3.81) (end -6.35 -10.16) (layer B.SilkS) (width 0.15)) 12 | (fp_line (start -6.35 -10.16) (end 6.35 -10.16) (layer B.SilkS) (width 0.15)) 13 | (fp_line (start 6.35 -10.16) (end 6.35 3.81) (layer B.SilkS) (width 0.15)) 14 | (fp_line (start 6.35 3.81) (end -6.35 3.81) (layer B.SilkS) (width 0.15)) 15 | (fp_line (start -8.89 5.08) (end 8.89 5.08) (layer B.SilkS) (width 0.15)) 16 | (fp_line (start 8.89 5.08) (end 8.89 -17.78) (layer B.SilkS) (width 0.15)) 17 | (fp_line (start 8.89 -17.78) (end -8.89 -17.78) (layer B.SilkS) (width 0.15)) 18 | (fp_line (start -8.89 -17.78) (end -8.89 5.08) (layer B.SilkS) (width 0.15)) 19 | (fp_line (start 10.817472 16.277228) (end 5.00618 16.277228) (layer B.SilkS) (width 0.1)) 20 | (fp_line (start 5.00618 16.277228) (end 4.979849 14.993795) (layer B.SilkS) (width 0.1)) 21 | (fp_line (start 4.979849 14.993795) (end -3.851373 15.000483) (layer B.SilkS) (width 0.1)) 22 | (fp_line (start -3.851373 15.000483) (end -3.849397 16.202736) (layer B.SilkS) (width 0.1)) 23 | (fp_line (start -3.849397 16.202736) (end -12.930193 16.176658) (layer B.SilkS) (width 0.1)) 24 | (fp_line (start -12.930193 16.176658) (end -12.916195 -14.993493) (layer B.SilkS) (width 0.1)) 25 | (fp_line (start -12.916195 -14.993493) (end -12.683384 -15.596286) (layer B.SilkS) (width 0.1)) 26 | (fp_line (start -12.683384 -15.596286) (end -12.399901 -16.141167) (layer B.SilkS) (width 0.1)) 27 | (fp_line (start -12.399901 -16.141167) (end -12.065253 -16.627577) (layer B.SilkS) (width 0.1)) 28 | (fp_line (start -12.065253 -16.627577) (end -11.678953 -17.054952) (layer B.SilkS) (width 0.1)) 29 | (fp_line (start -11.678953 -17.054952) (end -11.240512 -17.422741) (layer B.SilkS) (width 0.1)) 30 | (fp_line (start -11.240512 -17.422741) (end -10.74944 -17.730377) (layer B.SilkS) (width 0.1)) 31 | (fp_line (start -10.74944 -17.730377) (end -10.20525 -17.97731) (layer B.SilkS) (width 0.1)) 32 | (fp_line (start -10.20525 -17.97731) (end -9.607453 -18.162976) (layer B.SilkS) (width 0.1)) 33 | (fp_line (start -9.607453 -18.162976) (end 9.43046 -18.191734) (layer B.SilkS) (width 0.1)) 34 | (fp_line (start 9.43046 -18.191734) (end 10.049824 -17.957741) (layer B.SilkS) (width 0.1)) 35 | (fp_line (start 10.049824 -17.957741) (end 10.638018 -17.673258) (layer B.SilkS) (width 0.1)) 36 | (fp_line (start 10.638018 -17.673258) (end 11.181445 -17.323743) (layer B.SilkS) (width 0.1)) 37 | (fp_line (start 11.181445 -17.323743) (end 11.666503 -16.894658) (layer B.SilkS) (width 0.1)) 38 | (fp_line (start 11.666503 -16.894658) (end 12.079595 -16.37146) (layer B.SilkS) (width 0.1)) 39 | (fp_line (start 12.079595 -16.37146) (end 12.407122 -15.739613) (layer B.SilkS) (width 0.1)) 40 | (fp_line (start 12.407122 -15.739613) (end 12.635482 -14.984575) (layer B.SilkS) (width 0.1)) 41 | (fp_line (start 12.635482 -14.984575) (end 12.751078 -14.091807) (layer B.SilkS) (width 0.1)) 42 | (fp_line (start 12.751078 -14.091807) (end 12.776026 8.463285) (layer B.SilkS) (width 0.1)) 43 | (fp_line (start 12.776026 8.463285) (end 10.83248 9.424181) (layer B.SilkS) (width 0.1)) 44 | (fp_line (start 10.83248 9.424181) (end 10.802686 16.232524) (layer B.SilkS) (width 0.1)) 45 | (fp_line (start -3.17965 10.051451) (end 3.959931 10.051451) (layer B.SilkS) (width 0.1)) 46 | (fp_line (start 3.959931 10.051451) (end 3.959931 15.865188) (layer B.SilkS) (width 0.1)) 47 | (fp_line (start 3.959931 15.865188) (end -3.17965 15.865188) (layer B.SilkS) (width 0.1)) 48 | (fp_line (start -3.17965 15.865188) (end -3.17965 10.051451) (layer B.SilkS) (width 0.1)) 49 | (fp_line (start 10.7436 9.402349) (end 9.191378 9.402349) (layer B.SilkS) (width 0.1)) 50 | (fp_line (start 9.191378 9.402349) (end 8.662211 9.931515) (layer B.SilkS) (width 0.1)) 51 | (fp_line (start 8.662211 9.931515) (end 7.40985 9.931515) (layer B.SilkS) (width 0.1)) 52 | (fp_line (start 7.40985 9.931515) (end 7.40985 14.993876) (layer B.SilkS) (width 0.1)) 53 | (fp_line (start 7.40985 14.993876) (end 8.697489 14.993876) (layer B.SilkS) (width 0.1)) 54 | (fp_line (start 8.697489 14.993876) (end 9.226656 15.487765) (layer B.SilkS) (width 0.1)) 55 | (fp_line (start 9.226656 15.487765) (end 10.796517 15.487765) (layer B.SilkS) (width 0.1)) 56 | (fp_line (start 10.796517 15.487765) (end 10.7436 9.402349) (layer B.SilkS) (width 0.1)) 57 | (fp_line (start 10.778878 11.483738) (end 11.431517 11.483738) (layer B.SilkS) (width 0.1)) 58 | (fp_line (start 11.431517 11.483738) (end 11.431517 13.476932) (layer B.SilkS) (width 0.1)) 59 | (fp_line (start 11.431517 13.476932) (end 10.814156 13.476932) (layer B.SilkS) (width 0.1)) 60 | (pad 8 thru_hole circle (at -11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 61 | (pad 7 thru_hole circle (at -11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 62 | (pad 6 thru_hole circle (at -11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 63 | (pad 5 thru_hole circle (at -11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 64 | (pad 4 thru_hole circle (at -11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 65 | (pad 3 thru_hole circle (at -11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 66 | (pad 2 thru_hole circle (at -11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 67 | (pad 1 thru_hole circle (at -11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 68 | (pad 16 thru_hole circle (at 11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 69 | (pad 15 thru_hole circle (at 11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 70 | (pad 14 thru_hole circle (at 11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 71 | (pad 13 thru_hole circle (at 11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 72 | (pad 12 thru_hole circle (at 11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 73 | (pad 11 thru_hole circle (at 11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 74 | (pad 10 thru_hole circle (at 11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 75 | (pad 9 thru_hole circle (at 11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) 76 | ) 77 | -------------------------------------------------------------------------------- /ILI9341.h: -------------------------------------------------------------------------------- 1 | /*************************************************** 2 | This is our library for the Adafruit ILI9341 Breakout and Shield 3 | ----> http://www.adafruit.com/products/1651 4 | 5 | Check out the links above for our tutorials and wiring diagrams 6 | These displays use SPI to communicate, 4 or 5 pins are required to 7 | interface (RST is optional) 8 | Adafruit invests time and resources providing this open source code, 9 | please support Adafruit and open-source hardware by purchasing 10 | products from Adafruit! 11 | 12 | Written by Limor Fried/Ladyada for Adafruit Industries. 13 | MIT license, all text above must be included in any redistribution 14 | ****************************************************/ 15 | 16 | #ifndef _ADAFRUIT_ILI9341H_ 17 | #define _ADAFRUIT_ILI9341H_ 18 | 19 | #if ARDUINO >= 100 20 | #include "Arduino.h" 21 | #include "Print.h" 22 | #else 23 | #include "WProgram.h" 24 | #endif 25 | #include 26 | #ifdef ESP8266 27 | #include 28 | #else 29 | #include 30 | #endif 31 | 32 | #define ILI9341_TFTWIDTH 240 33 | #define ILI9341_TFTHEIGHT 320 34 | 35 | #define ILI9341_NOP 0x00 36 | #define ILI9341_SWRESET 0x01 37 | #define ILI9341_RDDID 0x04 38 | #define ILI9341_RDDST 0x09 39 | 40 | #define ILI9341_SLPIN 0x10 41 | #define ILI9341_SLPOUT 0x11 42 | #define ILI9341_PTLON 0x12 43 | #define ILI9341_NORON 0x13 44 | 45 | #define ILI9341_RDMODE 0x0A 46 | #define ILI9341_RDMADCTL 0x0B 47 | #define ILI9341_RDPIXFMT 0x0C 48 | #define ILI9341_RDIMGFMT 0x0D 49 | #define ILI9341_RDSELFDIAG 0x0F 50 | 51 | #define ILI9341_INVOFF 0x20 52 | #define ILI9341_INVON 0x21 53 | #define ILI9341_GAMMASET 0x26 54 | #define ILI9341_DISPOFF 0x28 55 | #define ILI9341_DISPON 0x29 56 | 57 | #define ILI9341_CASET 0x2A 58 | #define ILI9341_PASET 0x2B 59 | #define ILI9341_RAMWR 0x2C 60 | #define ILI9341_RAMRD 0x2E 61 | 62 | #define ILI9341_PTLAR 0x30 63 | #define ILI9341_MADCTL 0x36 64 | #define ILI9341_PIXFMT 0x3A 65 | 66 | #define ILI9341_FRMCTR1 0xB1 67 | #define ILI9341_FRMCTR2 0xB2 68 | #define ILI9341_FRMCTR3 0xB3 69 | #define ILI9341_INVCTR 0xB4 70 | #define ILI9341_DFUNCTR 0xB6 71 | 72 | #define ILI9341_PWCTR1 0xC0 73 | #define ILI9341_PWCTR2 0xC1 74 | #define ILI9341_PWCTR3 0xC2 75 | #define ILI9341_PWCTR4 0xC3 76 | #define ILI9341_PWCTR5 0xC4 77 | #define ILI9341_VMCTR1 0xC5 78 | #define ILI9341_VMCTR2 0xC7 79 | 80 | #define ILI9341_RDID1 0xDA 81 | #define ILI9341_RDID2 0xDB 82 | #define ILI9341_RDID3 0xDC 83 | #define ILI9341_RDID4 0xDD 84 | 85 | #define ILI9341_GMCTRP1 0xE0 86 | #define ILI9341_GMCTRN1 0xE1 87 | /* 88 | #define ILI9341_PWCTR6 0xFC 89 | 90 | */ 91 | 92 | // Color definitions 93 | #define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ 94 | #define ILI9341_NAVY 0x000F /* 0, 0, 128 */ 95 | #define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ 96 | #define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ 97 | #define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ 98 | #define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ 99 | #define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ 100 | #define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ 101 | #define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ 102 | #define ILI9341_BLUE 0x001F /* 0, 0, 255 */ 103 | #define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ 104 | #define ILI9341_LIGHTBLUE 0x061F /* 0, 192, 255 */ 105 | #define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ 106 | #define ILI9341_RED 0xF800 /* 255, 0, 0 */ 107 | #define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ 108 | #define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ 109 | #define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ 110 | #define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ 111 | #define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ 112 | #define ILI9341_PINK 0xF81F 113 | 114 | //#define ILI9341_USE_DIGITAL_WRITE 115 | //#define ILI9341_USE_NO_CS 116 | #ifdef ESP8266 117 | //not working 118 | //#define ILI9341_USE_HW_CS 119 | #endif 120 | 121 | class Adafruit_ILI9341 : public Adafruit_GFX { 122 | 123 | public: 124 | #ifndef ESP8266 125 | Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, 126 | int8_t _RST, int8_t _MISO); 127 | #endif 128 | #if defined(USE_HW_CS) || defined(USE_NO_CS) 129 | Adafruit_ILI9341(int8_t _DC, int8_t _RST = -1); 130 | #else 131 | Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1); 132 | #endif 133 | void begin(void), 134 | setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1), 135 | pushColor(uint16_t color), 136 | fillScreen(uint16_t color), 137 | drawPixel(int16_t x, int16_t y, uint16_t color), 138 | drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), 139 | drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), 140 | fillRect(int16_t x, int16_t y, int16_t w, int16_t h, 141 | uint16_t color), 142 | setRotation(uint8_t r), 143 | invertDisplay(boolean i); 144 | uint16_t color565(uint8_t r, uint8_t g, uint8_t b); 145 | 146 | void commandList(uint8_t *addr); 147 | 148 | /* These are not for current use, 8-bit protocol only! */ 149 | uint8_t readdata(void), 150 | readcommand8(uint8_t reg, uint8_t index = 0); 151 | /* 152 | uint16_t readcommand16(uint8_t); 153 | uint32_t readcommand32(uint8_t); 154 | void dummyclock(void); 155 | */ 156 | 157 | void writecommand(uint8_t c); 158 | void writedata(uint8_t d); 159 | void writedata(uint8_t * data, uint8_t size); 160 | void writeCmdData(uint8_t cmd, uint8_t * data, uint8_t size); 161 | 162 | 163 | uint16_t getHeight(void); 164 | uint16_t getWidth(void); 165 | 166 | void area_update_start(uint32_t x, uint32_t y, uint32_t w, uint32_t h); 167 | void area_update_data(uint8_t *data, uint32_t pixel); 168 | void area_update_end(void); 169 | private: 170 | 171 | uint8_t spiread(void); 172 | 173 | 174 | #ifdef ESP8266 175 | inline void spiwrite(uint8_t data); 176 | inline void spiwrite16(uint16_t data); 177 | inline void spiwriteBytes(uint8_t * data, uint32_t size); 178 | inline void spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat); 179 | 180 | inline void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); 181 | #else 182 | void spiwrite(uint8_t); 183 | void spiwrite16(uint16_t data); 184 | void spiwriteBytes(uint8_t * data, uint8_t size); 185 | void spiwritePattern(uint8_t * data, uint8_t size, uint8_t repeat); 186 | void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); 187 | #endif 188 | 189 | inline void spiCsHigh(void); 190 | inline void spiCsLow(void); 191 | inline void spiDcHigh(void); 192 | inline void spiDcLow(void); 193 | 194 | uint8_t tabcolor; 195 | #ifndef ESP8266 196 | boolean hwSPI; 197 | #endif 198 | #if defined (__AVR__) || defined(TEENSYDUINO) 199 | uint8_t mySPCR; 200 | volatile uint8_t *mosiport, *clkport, *dcport, *rsport, *csport; 201 | int8_t _cs, _dc, _rst, _mosi, _miso, _sclk; 202 | uint8_t mosipinmask, clkpinmask, cspinmask, dcpinmask; 203 | #elif defined (__arm__) 204 | volatile RwReg *mosiport, *clkport, *dcport, *rsport, *csport; 205 | uint32_t _cs, _dc, _rst, _mosi, _miso, _sclk; 206 | uint32_t mosipinmask, clkpinmask, cspinmask, dcpinmask; 207 | #elif defined (ESP8266) 208 | #ifndef USE_HW_CS 209 | int8_t _cs; 210 | uint32_t _csMask; 211 | #endif 212 | int8_t _dc, _rst; 213 | uint32_t _dcMask, _rstMask; 214 | #endif 215 | }; 216 | 217 | #endif 218 | -------------------------------------------------------------------------------- /GeoMap.cpp: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | */ 25 | #include "GeoMap.h" 26 | 27 | GeoMap::GeoMap(MapProvider mapProvider, String apiKey, int mapWidth, int mapHeight) { 28 | mapProvider_ = mapProvider; 29 | apiKey_ = apiKey; 30 | mapWidth_ = mapWidth; 31 | mapHeight_ = mapHeight; 32 | } 33 | 34 | int GeoMap::getMapWidth() { 35 | return mapWidth_; 36 | } 37 | int GeoMap::getMapHeight() { 38 | return mapHeight_; 39 | } 40 | 41 | void GeoMap::downloadMap(Coordinates mapCenter, int zoom) { 42 | downloadMap(mapCenter, zoom, nullptr); 43 | } 44 | 45 | void GeoMap::downloadMap(Coordinates mapCenter, int zoom, ProgressCallback progressCallback) { 46 | mapCenter_= mapCenter; 47 | zoom_ = zoom; 48 | switch(mapProvider_) { 49 | case MapProvider::MapQuest: 50 | downloadFile("http://open.mapquestapi.com/staticmap/v4/getmap?key=" + apiKey_ + "&type=map&scalebar=false&size=" 51 | + String(mapWidth_) + "," + String(mapHeight_) + "&zoom=" + String(zoom_) + "¢er="+ String(mapCenter_.lat) + "," + String(mapCenter_.lon), getMapName(), progressCallback); 52 | break; 53 | case MapProvider::Google: 54 | downloadFile("http://maps.googleapis.com/maps/api/staticmap?key=" + apiKey_ + "¢er="+ String(mapCenter_.lat) + "," + String(mapCenter_.lon)+"&zoom="+ String(zoom_)+"&size=" 55 | + String(mapWidth_) + "x" + String(mapHeight_)+"&format=jpg-baseline&maptype=roadmap", getMapName(), progressCallback); 56 | break; 57 | } 58 | 59 | } 60 | 61 | String GeoMap::getMapName() { 62 | return "map" + String(mapCenter_.lat) + "_" + String(mapCenter_.lon) + "_" + String(zoom_) + ".jpg"; 63 | } 64 | 65 | CoordinatesPixel GeoMap::convertToPixel(Coordinates coordinates) { 66 | CoordinatesTiles centerTile = convertToTiles(mapCenter_); 67 | CoordinatesTiles poiTile = convertToTiles(coordinates); 68 | CoordinatesPixel poiPixel; 69 | poiPixel.x = (poiTile.x - centerTile.x) * MAPQUEST_TILE_LENGTH + mapWidth_ / 2; 70 | poiPixel.y = (poiTile.y - centerTile.y) * MAPQUEST_TILE_LENGTH + mapHeight_ / 2; 71 | return poiPixel; 72 | } 73 | 74 | CoordinatesTiles GeoMap::convertToTiles(Coordinates coordinates) { 75 | 76 | double lon_rad = coordinates.lon * PI / 180; 77 | double lat_rad = coordinates.lat * PI / 180;; 78 | double n = pow(2.0, zoom_); 79 | 80 | CoordinatesTiles tile; 81 | tile.x = ((coordinates.lon + 180) / 360) * n; 82 | tile.y = (1 - (log(tan(lat_rad) + 1.0/cos(lat_rad)) / PI)) * n / 2.0; 83 | 84 | return tile; 85 | } 86 | 87 | Coordinates GeoMap::convertToCoordinatesFromTiles(CoordinatesTiles tiles) { 88 | Coordinates result; 89 | 90 | double n = pow(2.0, zoom_); 91 | 92 | 93 | result.lon = (360 * tiles.x / n) - 180; 94 | result.lat = 180 / PI * (atan(sinh(PI * (1 - 2 * tiles.y / n)))); 95 | 96 | return result; 97 | } 98 | 99 | Coordinates GeoMap::convertToCoordinates(CoordinatesPixel poiPixel) { 100 | CoordinatesTiles centerTile = convertToTiles(mapCenter_); 101 | CoordinatesTiles poiTile; 102 | Serial.println(String(centerTile.x, 9) + ", " + String(centerTile.y, 9)); 103 | poiTile.x = ((poiPixel.x - (mapWidth_ / 2.0)) / MAPQUEST_TILE_LENGTH) + centerTile.x; 104 | poiTile.y = ((poiPixel.y - (mapHeight_ / 2.0)) / MAPQUEST_TILE_LENGTH) + centerTile.y; 105 | Serial.println(String(poiTile.x, 9) + ", " + String(poiTile.y, 9)); 106 | Coordinates poiCoordinates = convertToCoordinatesFromTiles(poiTile); 107 | return poiCoordinates; 108 | } 109 | 110 | 111 | void GeoMap::downloadFile(String url, String filename) { 112 | downloadFile(url, filename, nullptr); 113 | } 114 | 115 | void GeoMap::downloadFile(String url, String filename, ProgressCallback progressCallback) { 116 | Serial.println("Downloading " + url + " and saving as " + filename); 117 | 118 | if (SPIFFS.exists(filename) == true) { 119 | Serial.println("File already exists. Skipping"); 120 | //return; 121 | } 122 | // wait for WiFi connection 123 | boolean isFirstCall = true; 124 | ESP8266WiFiMulti _wifiMulti; 125 | if((_wifiMulti.run() == WL_CONNECTED)) { 126 | HTTPClient http; 127 | 128 | Serial.print("[HTTP] begin...\n"); 129 | 130 | // configure server and url 131 | http.begin(url); 132 | 133 | Serial.print("[HTTP] GET...\n"); 134 | // start connection and send HTTP header 135 | int httpCode = http.GET(); 136 | if(httpCode > 0) { 137 | //SPIFFS.remove(filename); 138 | File f = SPIFFS.open(filename, "w+"); 139 | if (!f) { 140 | Serial.println("file open failed"); 141 | return; 142 | } 143 | // HTTP header has been send and Server response header has been handled 144 | Serial.printf("[HTTP] GET... code: %d\n", httpCode); 145 | 146 | // file found at server 147 | if(httpCode == HTTP_CODE_OK) { 148 | 149 | // get lenght of document (is -1 when Server sends no Content-Length header) 150 | int total = http.getSize(); 151 | int len = total; 152 | progressCallback(filename, 0,total, true); 153 | // create buffer for read 154 | uint8_t buff[128] = { 0 }; 155 | 156 | // get tcp stream 157 | WiFiClient * stream = http.getStreamPtr(); 158 | 159 | // read all data from server 160 | while(http.connected() && (len > 0 || len == -1)) { 161 | // get available data size 162 | size_t size = stream->available(); 163 | 164 | if(size) { 165 | // read up to 128 byte 166 | int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); 167 | 168 | // write it to Serial 169 | f.write(buff, c); 170 | 171 | if(len > 0) { 172 | len -= c; 173 | } 174 | progressCallback(filename, total - len,total, false); 175 | isFirstCall = false; 176 | } 177 | delay(1); 178 | } 179 | 180 | Serial.println(); 181 | Serial.print("[HTTP] connection closed or file end.\n"); 182 | 183 | } 184 | f.close(); 185 | } else { 186 | Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); 187 | } 188 | 189 | http.end(); 190 | } 191 | } 192 | 193 | 194 | -------------------------------------------------------------------------------- /esp8266-plane-spotter-color.ino: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | */ 25 | 26 | #include 27 | #include 28 | 29 | //SPIFFS stuff 30 | #include 31 | #include 32 | 33 | // Wifi Libraries 34 | #include 35 | #include 36 | #include 37 | #include 38 | 39 | 40 | 41 | 42 | // Easy Wifi Setup 43 | #include 44 | 45 | // Go to settings to change important parameters 46 | #include "settings.h" 47 | 48 | // Project libraries 49 | #include "WifiLocator.h" 50 | #include "PlaneSpotter.h" 51 | #include "ILI9341.h" 52 | #include "artwork.h" 53 | #include "AdsbExchangeClient.h" 54 | #include "GeoMap.h" 55 | 56 | // Initialize the TFT 57 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 58 | WifiLocator locator; 59 | AdsbExchangeClient adsbClient; 60 | GeoMap geoMap(MapProvider::Google, GOOGLE_API_KEY, MAP_WIDTH, MAP_HEIGHT); 61 | //GeoMap geoMap(MapProvider::MapQuest, MAP_QUEST_API_KEY, MAP_WIDTH, MAP_HEIGHT); 62 | PlaneSpotter planeSpotter(&tft, &geoMap); 63 | 64 | 65 | XPT2046_Touchscreen ts(TOUCH_CS); // Param 2 - NULL - No interrupts 66 | //XPT2046_Touchscreen ts(TOUCH_CS, 255); // Param 2 - 255 - No interrupts 67 | //XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ); // Param 2 - Touch IRQ Pin - interrupt enabled polling 68 | 69 | 70 | Coordinates mapCenter; 71 | 72 | // Check http://www.virtualradarserver.co.uk/Documentation/Formats/AircraftList.aspx 73 | // to craft this query to your needs 74 | // lat=47.424341887&lng=8.56877803&fDstL=0&fDstU=10&fAltL=0&fAltL=1500&fAltU=10000 75 | //const String QUERY_STRING = "fDstL=0&fDstU=20&fAltL=0&fAltL=1000&fAltU=10000"; 76 | // airport zürich is on 1410ft => hide landed airplanes 77 | const String QUERY_STRING = "fAltL=1500&trFmt=sa"; 78 | 79 | void downloadCallback(String filename, uint32_t bytesDownloaded, uint32_t bytesTotal, boolean isFirstCall); 80 | ProgressCallback _downloadCallback = downloadCallback; 81 | 82 | void updatePlanesAndDrawMap(); 83 | void calibrateTouchScreen(); 84 | 85 | Coordinates northWestBound; 86 | Coordinates southEastBound; 87 | 88 | long millisAtLastUpdate = 0; 89 | long millisAtLastTouch = 0; 90 | uint8_t currentZoom = MAP_ZOOM; 91 | 92 | 93 | void setup() { 94 | 95 | // Start serial communication 96 | Serial.begin(115200); 97 | Serial.println("Free Heap: " + String(ESP.getFreeHeap())); 98 | // The LED pin needs to set HIGH 99 | // Use this pin to save energy 100 | pinMode(LED_PIN, D8); 101 | digitalWrite(LED_PIN, HIGH); 102 | 103 | // Init TFT 104 | tft.begin(); 105 | tft.setRotation(3); // landscape 106 | tft.cp437(false); 107 | tft.setFont(&Dialog_plain_9); 108 | tft.fillScreen(TFT_BLACK); 109 | planeSpotter.setTextColor(TFT_WHITE, TFT_BLACK); 110 | planeSpotter.setTextAlignment(CENTER); 111 | planeSpotter.drawString(160, 200, " Loading Splash... "); 112 | 113 | // Init file system 114 | if (!SPIFFS.begin()) { Serial.println("initialisation failed!"); return;} 115 | //SPIFFS.format(); 116 | 117 | // copy files from code to SPIFFS 118 | planeSpotter.copyProgmemToSpiffs(splash, splash_len, "/splash.jpg"); 119 | planeSpotter.copyProgmemToSpiffs(plane, plane_len, "/plane.jpg"); 120 | planeSpotter.drawSPIFFSJpeg("/splash.jpg", 30, 75); 121 | planeSpotter.setTextColor(TFT_WHITE, TFT_BLACK); 122 | planeSpotter.setTextAlignment(CENTER); 123 | planeSpotter.drawString(160, 200, " Connecting to WiFi.. "); 124 | 125 | 126 | WiFiManager wifiManager; 127 | // Uncomment for testing wifi manager 128 | //wifiManager.resetSettings(); 129 | 130 | //wifiManager.setAPCallback(configModeCallback); 131 | 132 | //or use this for auto generated name ESP + ChipID 133 | wifiManager.autoConnect(); 134 | 135 | // Set center of the map by using a WiFi fingerprint 136 | // Hardcode the values if it doesn't work or you want another location 137 | locator.updateLocation(); 138 | mapCenter.lat = locator.getLat().toFloat(); 139 | mapCenter.lon = locator.getLon().toFloat(); 140 | mapCenter.lat = 47.424341887; 141 | mapCenter.lon = 8.56877803; 142 | 143 | planeSpotter.setTextColor(TFT_WHITE, TFT_BLACK); 144 | planeSpotter.setTextAlignment(CENTER); 145 | planeSpotter.drawString(160, 200, " Loading map... "); 146 | geoMap.downloadMap(mapCenter, currentZoom, _downloadCallback); 147 | 148 | northWestBound = geoMap.convertToCoordinates({-MAP_REQUEST_MARGIN,-MAP_REQUEST_MARGIN}); 149 | southEastBound = geoMap.convertToCoordinates({MAP_WIDTH + MAP_REQUEST_MARGIN, MAP_HEIGHT + MAP_REQUEST_MARGIN}); 150 | 151 | ts.begin(); 152 | planeSpotter.setTouchScreen(&ts); 153 | 154 | } 155 | 156 | 157 | void loop() { 158 | boolean isTouched = ts.touched(); 159 | if(millis() - millisAtLastUpdate > 5000 && !isTouched) { 160 | updatePlanesAndDrawMap(); 161 | millisAtLastUpdate = millis(); 162 | } 163 | 164 | CoordinatesPixel pt = planeSpotter.getTouchPoint(); 165 | if (isTouched && millis() - millisAtLastTouch > 4000) { 166 | //tft.fillCircle(pt.x, pt.y, 2, TFT_RED); 167 | //currentZoom--; 168 | /*mapCenter = geoMap.convertToCoordinates(pt); 169 | geoMap.downloadMap(mapCenter, currentZoom, _downloadCallback); 170 | northWestBound = geoMap.convertToCoordinates({-MAP_REQUEST_MARGIN,-MAP_REQUEST_MARGIN}); 171 | southEastBound = geoMap.convertToCoordinates({MAP_WIDTH + MAP_REQUEST_MARGIN, MAP_HEIGHT + MAP_REQUEST_MARGIN}); 172 | millisAtLastTouch = millis();*/ 173 | planeSpotter.drawMenu(); 174 | } 175 | 176 | delay(20); 177 | 178 | } 179 | 180 | 181 | 182 | void downloadCallback(String filename, uint32_t bytesDownloaded, uint32_t bytesTotal, boolean isFirstCall) { 183 | if (isFirstCall) { 184 | tft.fillRect(0, geoMap.getMapHeight(), tft.getWidth(), tft.getHeight() - geoMap.getMapHeight(), TFT_BLACK); 185 | } 186 | Serial.println(String(bytesDownloaded) + " / " + String(bytesTotal)); 187 | int width = 320; 188 | int progress = width * bytesDownloaded / bytesTotal; 189 | tft.fillRect(10, 220, progress, 5, TFT_WHITE); 190 | planeSpotter.drawSPIFFSJpeg("/plane.jpg", 15 + progress, 220 - 15); 191 | } 192 | 193 | void updatePlanesAndDrawMap() { 194 | Serial.println("Heap: " + String(ESP.getFreeHeap())); 195 | adsbClient.updateVisibleAircraft(QUERY_STRING + "&lat=" + String(mapCenter.lat, 6) + "&lng=" + String(mapCenter.lon, 6) + "&fNBnd=" + String(northWestBound.lat, 9) + "&fWBnd=" + String(northWestBound.lon, 9) + "&fSBnd=" + String(southEastBound.lat, 9) + "&fEBnd=" + String(southEastBound.lon, 9)); 196 | 197 | long startMillis = millis(); 198 | planeSpotter.drawSPIFFSJpeg(geoMap.getMapName(), 0, 0); 199 | 200 | tft.setTextColor(TFT_WHITE, TFT_BLACK); 201 | Aircraft closestAircraft = adsbClient.getClosestAircraft(mapCenter); 202 | for (int i = 0; i < adsbClient.getNumberOfAircrafts(); i++) { 203 | Aircraft aircraft = adsbClient.getAircraft(i); 204 | AircraftHistory history = adsbClient.getAircraftHistory(i); 205 | planeSpotter.drawAircraftHistory(aircraft, history); 206 | planeSpotter.drawPlane(aircraft, aircraft.call == closestAircraft.call); 207 | 208 | 209 | } 210 | planeSpotter.drawInfoBox(closestAircraft); 211 | 212 | // Draw center of map 213 | CoordinatesPixel p = geoMap.convertToPixel(mapCenter); 214 | tft.fillCircle(p.x, p.y, 2, TFT_BLUE); 215 | 216 | Serial.println(String(millis()-startMillis) + "ms for drawing"); 217 | } 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /AdsbExchangeClient.cpp: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at http://blog.squix.ch 24 | */ 25 | 26 | #include "AdsbExchangeClient.h" 27 | 28 | 29 | AdsbExchangeClient::AdsbExchangeClient() { 30 | 31 | } 32 | 33 | void AdsbExchangeClient::updateVisibleAircraft(String searchQuery) { 34 | JsonStreamingParser parser; 35 | parser.setListener(this); 36 | WiFiClient client; 37 | 38 | // http://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=47.437691&lng=8.568854&fDstL=0&fDstU=20&fAltL=0&fAltU=5000 39 | const char host[] = "global.adsbexchange.com"; 40 | String url = "/VirtualRadar/AircraftList.json?" + searchQuery; 41 | 42 | const int httpPort = 80; 43 | if (!client.connect(host, httpPort)) { 44 | Serial.println("connection failed"); 45 | return; 46 | } 47 | 48 | 49 | Serial.print("Requesting URL: "); 50 | Serial.println(url); 51 | 52 | // This will send the request to the server 53 | client.print(String("GET ") + url + " HTTP/1.1\r\n" + 54 | "Host: " + host + "\r\n" + 55 | "Connection: close\r\n\r\n"); 56 | 57 | int retryCounter = 0; 58 | while(!client.available()) { 59 | Serial.println("."); 60 | delay(1000); 61 | retryCounter++; 62 | if (retryCounter > 10) { 63 | return; 64 | } 65 | } 66 | 67 | int pos = 0; 68 | boolean isBody = false; 69 | char c; 70 | 71 | int size = 0; 72 | client.setNoDelay(false); 73 | while(client.connected()) { 74 | while((size = client.available()) > 0) { 75 | c = client.read(); 76 | if (c == '{' || c == '[') { 77 | isBody = true; 78 | } 79 | if (isBody) { 80 | parser.parse(c); 81 | } 82 | } 83 | } 84 | endDocument(); 85 | } 86 | 87 | 88 | void AdsbExchangeClient::whitespace(char c) { 89 | 90 | } 91 | 92 | void AdsbExchangeClient::startDocument() { 93 | counter = 0; 94 | index = -1; 95 | } 96 | 97 | void AdsbExchangeClient::key(String key) { 98 | currentKey = key; 99 | } 100 | 101 | void AdsbExchangeClient::value(String value) { 102 | /*String from = ""; 103 | String to = ""; 104 | String altitude = ""; 105 | String aircraftType = ""; 106 | String currentKey = ""; 107 | String operator = ""; 108 | 109 | 110 | "Type": "A319", 111 | "Mdl": "Airbus A319 112", 112 | 113 | "From": "LSZH Z\u00c3\u00bcrich, Zurich, Switzerland", 114 | "To": "LEMD Madrid Barajas, Spain", 115 | "Op": "Swiss International Air Lines", 116 | "OpIcao": "SWR", 117 | "Dst": 6.23, 118 | "Year": "1996" 119 | */ 120 | if (counter >= MAX_AIRCRAFTS - 1) { 121 | Serial.println("Max Aircrafts reached...."); 122 | return; 123 | } 124 | if (currentKey == "Id") { 125 | 126 | counter++; 127 | index = counter - 1; 128 | aircrafts[index] = {}; 129 | histories[index] = {}; 130 | 131 | trailIndex = 0; 132 | for (int i = 0; i < MAX_HISTORY_TEMP; i++) { 133 | positionTemp[i] = {}; 134 | } 135 | 136 | } else if (currentKey == "From") { 137 | aircrafts[index].from = value; 138 | aircrafts[index].fromCode = value.substring(0,4); 139 | int indexOfFirstComma = value.indexOf(","); 140 | aircrafts[index].fromShort = value.substring(4, indexOfFirstComma); 141 | } else if (currentKey == "To") { 142 | aircrafts[index].to = value; 143 | aircrafts[index].toCode = value.substring(0,4); 144 | int indexOfFirstComma = value.indexOf(","); 145 | aircrafts[index].toShort = value.substring(4, indexOfFirstComma); 146 | } else if (currentKey == "OpIcao") { 147 | aircrafts[index].operatorCode = value; 148 | } else if (currentKey == "Dst") { 149 | aircrafts[index].distance = value.toFloat(); 150 | } else if (currentKey == "Mdl") { 151 | aircrafts[index].aircraftType = value; 152 | } else if (currentKey == "Trak") { 153 | aircrafts[index].heading = value.toFloat(); 154 | } else if (currentKey == "Alt") { 155 | aircrafts[index].altitude = value.toInt();; 156 | } else if (currentKey == "Lat") { 157 | aircrafts[index].lat = value.toFloat(); 158 | } else if (currentKey == "Long") { 159 | aircrafts[index].lon = value.toFloat(); 160 | } else if (currentKey == "Spd") { 161 | aircrafts[index].speed = value.toFloat(); 162 | } else if (currentKey == "Icao") { 163 | aircrafts[index].icao = value; 164 | } else if (currentKey == "Call") { 165 | Serial.println("Saw " + value); 166 | aircrafts[index].call = value; 167 | } else if (currentKey == "PosStale") { 168 | aircrafts[index].posStall = (value == "true"); 169 | } else if (currentKey == "Cos") { 170 | int tempIndex = trailIndex / 4; 171 | if (tempIndex < MAX_HISTORY_TEMP) { 172 | AircraftPosition position = positionTemp[tempIndex]; 173 | Coordinates coordinates = position.coordinates; 174 | if (trailIndex % 4 == 0) { 175 | coordinates.lat = value.toFloat(); 176 | } else if (trailIndex % 4 == 1) { 177 | coordinates.lon = value.toFloat(); 178 | } else if (trailIndex % 4 == 3) { 179 | position.altitude = value.toInt(); 180 | } 181 | position.coordinates = coordinates; 182 | positionTemp[tempIndex] = position; 183 | trailIndex++; 184 | } 185 | 186 | } else if (currentKey == "Trt") { 187 | if(aircrafts[index].posStall) { 188 | Serial.println("This aircraft is stalled. Ignoring it"); 189 | counter--; 190 | index = counter - 1; 191 | } 192 | } 193 | 194 | } 195 | 196 | Aircraft AdsbExchangeClient::getAircraft(int i) { 197 | if (i < MAX_AIRCRAFTS) { 198 | return aircrafts[i]; 199 | } 200 | //return nullptr; 201 | } 202 | 203 | AircraftHistory AdsbExchangeClient::getAircraftHistory(int i) { 204 | return histories[i]; 205 | } 206 | 207 | int AdsbExchangeClient::getNumberOfAircrafts() { 208 | return counter; 209 | } 210 | 211 | Aircraft AdsbExchangeClient::getClosestAircraft(Coordinates coordinates) { 212 | double minDistance = 999999.0; 213 | Aircraft closestAircraft = aircrafts[0]; 214 | for (int i = 0; i < getNumberOfAircrafts(); i++) { 215 | Aircraft currentAircraft = aircrafts[i]; 216 | 217 | if (currentAircraft.distance < minDistance) { 218 | minDistance = currentAircraft.distance; 219 | closestAircraft = currentAircraft; 220 | } 221 | } 222 | return closestAircraft; 223 | } 224 | 225 | void AdsbExchangeClient::endArray() { 226 | if (counter >= MAX_AIRCRAFTS - 1) { 227 | Serial.println("MAx Aircrafts reached:end array"); 228 | return; 229 | } 230 | if (currentKey == "Cos" && trailIndex > 0) { 231 | AircraftHistory history = {}; 232 | uint16_t items = (trailIndex / 4); 233 | Serial.println("Finished history array: " + String(items) + " elements"); 234 | int historyCounter = 0; 235 | for (int i = 0; i < min(items, MAX_HISTORY); i++) { 236 | AircraftPosition position = {}; 237 | Coordinates coordinates = position.coordinates; 238 | coordinates.lat = positionTemp[items - i - 1].coordinates.lat; 239 | coordinates.lon = positionTemp[items - i - 1].coordinates.lon; 240 | position.coordinates = coordinates; 241 | position.altitude = positionTemp[items - i - 1].altitude; 242 | history.positions[i] = position; 243 | Serial.println(String(i) + ": " + String(items - i -1) + ", " + String(history.positions[i].coordinates.lat, 9) + ", " + String(history.positions[i].coordinates.lon, 9)); 244 | historyCounter++; 245 | } 246 | history.call = aircrafts[index].call; 247 | history.counter = historyCounter; 248 | histories[index] = history; 249 | currentKey = ""; 250 | } 251 | } 252 | 253 | void AdsbExchangeClient::endObject() { 254 | 255 | } 256 | 257 | void AdsbExchangeClient::endDocument() { 258 | /*Serial.println("End of document:"); 259 | for (int i = 0; i < getNumberOfAircrafts(); i++) { 260 | AircraftHistory history = histories[i]; 261 | for (int j = 0; j < history.counter; j++) { 262 | AircraftPosition position = history.positions[j]; 263 | Serial.println(history.call + ": " + String(j) + ". " + String(position.coordinates.lat, 9) + ", " + String(position.coordinates.lon, 9) + ", " + String(position.altitude)); 264 | } 265 | }*/ 266 | } 267 | 268 | void AdsbExchangeClient::startArray() { 269 | 270 | } 271 | 272 | void AdsbExchangeClient::startObject() { 273 | 274 | } 275 | -------------------------------------------------------------------------------- /PlaneSpotter.cpp: -------------------------------------------------------------------------------- 1 | /**The MIT License (MIT) 2 | 3 | Copyright (c) 2015 by Daniel Eichhorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | See more at https://blog.squix.org 24 | 25 | 26 | */ 27 | 28 | #include "PlaneSpotter.h" 29 | 30 | PlaneSpotter::PlaneSpotter(Adafruit_ILI9341* tft, GeoMap* geoMap) { 31 | tft_ = tft; 32 | geoMap_ = geoMap; 33 | } 34 | 35 | void PlaneSpotter::copyProgmemToSpiffs(const uint8_t *data, unsigned int length, String filename) { 36 | File f = SPIFFS.open(filename, "w+"); 37 | uint8_t c; 38 | for(int i = 0; i < length; i++) { 39 | c = pgm_read_byte(data + i); 40 | f.write(c); 41 | } 42 | f.close(); 43 | } 44 | 45 | 46 | void PlaneSpotter::drawSPIFFSJpeg(String filename, int xpos, int ypos) { 47 | 48 | Serial.println(filename); 49 | char buffer[filename.length() + 1]; 50 | filename.toCharArray(buffer, filename.length() + 1); 51 | JpegDec.decodeFile(buffer); 52 | renderJPEG(xpos, ypos); 53 | 54 | } 55 | 56 | void PlaneSpotter::renderJPEG(int xpos, int ypos) { 57 | 58 | uint16_t *pImg; 59 | uint16_t mcu_w = JpegDec.MCUWidth; 60 | uint16_t mcu_h = JpegDec.MCUHeight; 61 | uint32_t mcu_pixels = mcu_w * mcu_h; 62 | uint32_t drawTime = millis(); 63 | 64 | while( JpegDec.read()){ 65 | 66 | pImg = JpegDec.pImage; 67 | int mcu_x = JpegDec.MCUx * mcu_w + xpos; 68 | int mcu_y = JpegDec.MCUy * mcu_h + ypos; 69 | if ( ( mcu_x + mcu_w) <= tft_->width() && ( mcu_y + mcu_h) <= tft_->height()){ 70 | 71 | tft_->setAddrWindow(mcu_x, mcu_y, mcu_x + mcu_w - 1, mcu_y + mcu_h - 1); 72 | uint32_t count = mcu_pixels; 73 | while (count--) {tft_->pushColor(*pImg++);} 74 | // Push all MCU pixels to the TFT window, ~18% faster to pass an array pointer and length to the library 75 | //tft_->pushColor16(pImg, mcu_pixels); // To be supported in HX8357 library at a future date 76 | 77 | } 78 | 79 | else if( ( mcu_y + mcu_h) >= tft_->height()) JpegDec.abort(); 80 | 81 | } 82 | 83 | 84 | } 85 | 86 | void PlaneSpotter::drawAircraftHistory(Aircraft aircraft, AircraftHistory history) { 87 | Coordinates lastCoordinates; 88 | lastCoordinates.lat = aircraft.lat; 89 | lastCoordinates.lon = aircraft.lon; 90 | for (int j = 0; j < min(history.counter, MAX_HISTORY); j++) { 91 | 92 | AircraftPosition position = history.positions[j]; 93 | Coordinates coordinates = position.coordinates; 94 | CoordinatesPixel p1 = geoMap_->convertToPixel(coordinates); 95 | 96 | CoordinatesPixel p2 = geoMap_->convertToPixel(lastCoordinates); 97 | uint16_t color = heightPalette_[min(position.altitude / 4000, 9)]; 98 | tft_->drawLine(p1.x, p1.y, p2.x, p2.y, color); 99 | tft_->drawLine(p1.x+1, p1.y+1, p2.x+1, p2.y+1, color); 100 | 101 | lastCoordinates = coordinates; 102 | // Serial.println(String(j) + ". " + String(historyIndex) + ". " + String(coordinates.lat) + ", " + String(coordinates.lon)); 103 | } 104 | } 105 | 106 | void PlaneSpotter::drawPlane(Aircraft aircraft, boolean isSpecial) { 107 | Coordinates coordinates; 108 | coordinates.lon = aircraft.lon; 109 | coordinates.lat = aircraft.lat; 110 | CoordinatesPixel p = geoMap_->convertToPixel(coordinates); 111 | 112 | setTextColor(TFT_WHITE, TFT_BLACK); 113 | setTextAlignment(LEFT); 114 | drawString(p.x + 8,p.y - 5, aircraft.call); 115 | 116 | int planeDotsX[planeDots_]; 117 | int planeDotsY[planeDots_]; 118 | //isSpecial = false; 119 | for (int i = 0; i < planeDots_; i++) { 120 | planeDotsX[i] = cos((-450 + (planeDeg_[i] + aircraft.heading)) * PI / 180) * planeRadius_[i] + p.x; 121 | planeDotsY[i] = sin((-450 + (planeDeg_[i] + aircraft.heading)) * PI / 180) * planeRadius_[i] + p.y; 122 | } 123 | if (isSpecial) { 124 | tft_->fillTriangle(planeDotsX[0], planeDotsY[0], planeDotsX[1], planeDotsY[1], planeDotsX[2], planeDotsY[2], TFT_RED); 125 | tft_->fillTriangle(planeDotsX[2], planeDotsY[2], planeDotsX[3], planeDotsY[3], planeDotsX[4], planeDotsY[4], TFT_RED); 126 | } else { 127 | for (int i = 1; i < planeDots_; i++) { 128 | tft_->drawLine(planeDotsX[i], planeDotsY[i], planeDotsX[i-1], planeDotsY[i-1], TFT_RED); 129 | } 130 | } 131 | } 132 | 133 | 134 | void PlaneSpotter::drawInfoBox(Aircraft closestAircraft) { 135 | int line1 = geoMap_->getMapHeight() + 9; 136 | int line2 = geoMap_->getMapHeight() + 18; 137 | int line3 = geoMap_->getMapHeight() + 27; 138 | int line4 = geoMap_->getMapHeight() + 36; 139 | int line5 = geoMap_->getMapHeight() + 45; 140 | int rightTab0 = tft_->getWidth() - 3; 141 | int leftTab1 = 0; 142 | int leftTab2 = 40; 143 | int leftTab3 = tft_->getWidth() / 2; 144 | int leftTab4 = leftTab3 + 40; 145 | 146 | //tft_->setFont(&Dialog_plain_9); 147 | 148 | tft_->fillRect(0, geoMap_->getMapHeight(), tft_->width(), tft_->height() - geoMap_->getMapHeight(), TFT_BLACK); 149 | if (closestAircraft.call != "") { 150 | setTextAlignment(LEFT); 151 | setTextColor(TFT_GREEN); 152 | drawString(leftTab1, line1, "Call:"); 153 | setTextColor(TFT_WHITE); 154 | drawString(leftTab2, line1, closestAircraft.call); 155 | 156 | setTextColor(TFT_GREEN); 157 | drawString(leftTab3, line1, "Type:"); 158 | setTextColor(TFT_WHITE); 159 | drawString(leftTab4, line1, closestAircraft.aircraftType); 160 | 161 | setTextColor(TFT_GREEN); 162 | drawString(leftTab1, line2, "Alt:"); 163 | setTextColor(TFT_WHITE); 164 | drawString(leftTab2, line2, String(closestAircraft.altitude) + "ft"); 165 | 166 | setTextColor(TFT_GREEN); 167 | drawString(leftTab3, line2, "Head: "); 168 | setTextColor(TFT_WHITE); 169 | drawString(leftTab4, line2, String(closestAircraft.heading, 0)); 170 | 171 | setTextColor(TFT_GREEN); 172 | drawString(leftTab1, line3, "Dst:"); 173 | setTextColor(TFT_WHITE); 174 | drawString(leftTab2, line3, String(closestAircraft.distance, 2) + "km"); 175 | setTextColor(TFT_GREEN); 176 | drawString(leftTab3, line3, "Spd:"); 177 | setTextColor(TFT_WHITE); 178 | drawString(leftTab4, line3, String(closestAircraft.speed, 0) + "kn"); 179 | 180 | if (closestAircraft.fromShort != "" && closestAircraft.toShort != "") { 181 | setTextColor(TFT_GREEN); 182 | drawString(leftTab1, line4, "From:"); 183 | setTextColor(TFT_WHITE); 184 | drawString(leftTab2, line4, closestAircraft.from); 185 | setTextColor(TFT_GREEN); 186 | drawString(leftTab1, line5, "To:"); 187 | setTextColor(TFT_WHITE); 188 | drawString(leftTab2, line5, closestAircraft.to); 189 | } 190 | } 191 | 192 | } 193 | 194 | void PlaneSpotter::drawMenu() { 195 | //tft_->setFont(&Dialog_plain_16); 196 | String commands[] = {"Pan", "Zoom+", "Zoom-", "Track"}; 197 | int numberOfCommands = 4; 198 | tft_->fillScreen(TFT_BLACK); 199 | int fontHeight = 16; 200 | int buttonHeight = 40; 201 | for (int i = 0; i < numberOfCommands; i++) { 202 | tft_->drawFastHLine(0, i * buttonHeight, tft_->getWidth(), TFT_WHITE); 203 | drawString(10, i * buttonHeight + (buttonHeight - fontHeight) / 2, commands[i]); 204 | } 205 | } 206 | 207 | void PlaneSpotter::drawString(int x, int y, char *text) { 208 | int16_t x1, y1; 209 | uint16_t w, h; 210 | tft_->setTextWrap(false); 211 | tft_->getTextBounds(text, 0, 0, &x1, &y1, &w, &h); 212 | switch (alignment_) { 213 | case LEFT: 214 | x1 = x; 215 | break; 216 | case CENTER: 217 | x1 = x - w / 2; 218 | break; 219 | case RIGHT: 220 | x1 = x - w; 221 | break; 222 | } 223 | if (textColor_ != backgroundColor_) { 224 | tft_->fillRect(x1, y - h -1, w + 2, h + 3, backgroundColor_); 225 | } 226 | tft_->setCursor(x1, y); 227 | tft_->print(text); 228 | } 229 | 230 | void PlaneSpotter::drawString(int x, int y, String text) { 231 | char buf[text.length()+2]; 232 | text.toCharArray(buf, text.length() + 1); 233 | drawString(x, y, buf); 234 | } 235 | 236 | void PlaneSpotter::setTextColor(uint16_t c) { 237 | setTextColor(c, c); 238 | } 239 | void PlaneSpotter::setTextColor(uint16_t c, uint16_t bg) { 240 | textColor_ = c; 241 | backgroundColor_ = bg; 242 | tft_->setTextColor(textColor_, backgroundColor_); 243 | } 244 | 245 | void PlaneSpotter::setTextAlignment(TextAlignment alignment) { 246 | alignment_ = alignment; 247 | } 248 | 249 | void PlaneSpotter::setTouchScreen(XPT2046_Touchscreen* touchScreen) { 250 | touchScreen_ = touchScreen; 251 | } 252 | 253 | void PlaneSpotter::setTouchScreenCalibration(uint16_t minX, uint16_t minY, uint16_t maxX, uint16_t maxY) { 254 | minX_ = minX; 255 | minY_ = minY; 256 | maxX_ = maxX; 257 | maxY_ = maxY; 258 | } 259 | 260 | CoordinatesPixel PlaneSpotter::getTouchPoint() { 261 | TS_Point pt = touchScreen_->getPoint(); 262 | CoordinatesPixel p; 263 | p.x = tft_->getWidth() * (pt.x - minX_) / (maxX_ - minX_); 264 | p.y = tft_->getHeight() * (pt.y - minY_) / (maxY_ - minY_); 265 | return p; 266 | } 267 | 268 | -------------------------------------------------------------------------------- /kicad/PartLib.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 7400 4 | D Quad nand2 5 | K TTL nand2 6 | $ENDCMP 7 | # 8 | $CMP 7402 9 | D Quad Nor2 10 | K TTL Nor2 11 | $ENDCMP 12 | # 13 | $CMP 74AHC1G14 14 | D inverting buffer with Schmitt trigger. 15 | F 74xx/74ahc_ahct1g14.pdf 16 | $ENDCMP 17 | # 18 | $CMP 74HC00 19 | D Quad nand2 20 | K HCMOS nand2 21 | $ENDCMP 22 | # 23 | $CMP 74HC02 24 | D Quad Nor2 25 | K HCMOS Nor2 26 | $ENDCMP 27 | # 28 | $CMP 74HC04 29 | D Hex Inverseur 30 | K HCMOS not inv 31 | $ENDCMP 32 | # 33 | $CMP 74HC245 34 | D Octal BUS Transceivers, 3 State out 35 | K HCMOS BUS 3State 36 | $ENDCMP 37 | # 38 | $CMP 74HC595 39 | D 8 bits serial in // out Shift Register 3 State Out 40 | K HCMOS SR 3State 41 | F 74xx/74HC595.pdf 42 | $ENDCMP 43 | # 44 | $CMP 74HC74 45 | D Dual D FlipFlop, Set & Reset 46 | K TTL DFF 47 | F 74xx/74hc_hct74.pdf 48 | $ENDCMP 49 | # 50 | $CMP 74HCT00 51 | D Quad nand2 52 | K HCTMOS nand2 53 | $ENDCMP 54 | # 55 | $CMP 74HCT02 56 | D Quad Nor2 57 | K HCTMOS Nor2 58 | $ENDCMP 59 | # 60 | $CMP 74HCT04 61 | D Hex Inverseur 62 | K HCTMOS not inv 63 | $ENDCMP 64 | # 65 | $CMP 74HCT541_PWR 66 | D 8bits Buffer/Line Driver 3 state Out 67 | K TTL BUFFER 3State BUS 68 | $ENDCMP 69 | # 70 | $CMP 74HCT574_PWR 71 | D 8 bits Register, 3 state Out, with visible Pins power 72 | K TTL REG DFF DFF8 3State 73 | $ENDCMP 74 | # 75 | $CMP 74LS00 76 | D Quad nand2 77 | K TTL nand2 78 | $ENDCMP 79 | # 80 | $CMP 74LS01 81 | D Quad nand2 open collect. 82 | K TTL nand2 opencol 83 | $ENDCMP 84 | # 85 | $CMP 74LS02 86 | D Quad Nor2 87 | K TTL Nor2 88 | $ENDCMP 89 | # 90 | $CMP 74LS03 91 | D Quad Nand2 open collect 92 | K TTL Nand2 OpenCol 93 | $ENDCMP 94 | # 95 | $CMP 74LS04 96 | D Hex Inverseur 97 | K TTL not inv 98 | $ENDCMP 99 | # 100 | $CMP 74LS05 101 | D Inverseur Open Collect 102 | K TTL not inv OpenCol 103 | $ENDCMP 104 | # 105 | $CMP 74LS08 106 | D Quad And2 107 | K TTL and2 108 | $ENDCMP 109 | # 110 | $CMP 74LS09 111 | D Quad And2 Open Collect 112 | K TTL and2 OpenCol 113 | $ENDCMP 114 | # 115 | $CMP 74LS10 116 | D Triple Nand3 117 | K TTL Nand3 118 | $ENDCMP 119 | # 120 | $CMP 74LS107 121 | D Double JK FlipFlop, reset 122 | K TTL JK 123 | $ENDCMP 124 | # 125 | $CMP 74LS109 126 | D Double JK FlipFlop, Set & Reset 127 | K TTL JK 128 | $ENDCMP 129 | # 130 | $CMP 74LS11 131 | D Triple And3 132 | K TTL And3 133 | $ENDCMP 134 | # 135 | $CMP 74LS112 136 | D Double JK FlipFlop, Set & Reset 137 | K TTL JK 138 | $ENDCMP 139 | # 140 | $CMP 74LS113 141 | D Double JK, Set 142 | K TTL JK 143 | $ENDCMP 144 | # 145 | $CMP 74LS114 146 | D Double JK, common Clock & Reset, Set 147 | K TTL JK 148 | $ENDCMP 149 | # 150 | $CMP 74LS12 151 | D Triple Nand3 Open Collect 152 | K TTL Nand3 OpenCol 153 | $ENDCMP 154 | # 155 | $CMP 74LS122 156 | D Retriggerable Monostable 157 | K TTL monostable 158 | $ENDCMP 159 | # 160 | $CMP 74LS123 161 | D Dual retriggerable Monostable 162 | K TTL monostable 163 | $ENDCMP 164 | # 165 | $CMP 74LS125 166 | D Quad buffer 3 State out 167 | K TTL buffer 3State 168 | $ENDCMP 169 | # 170 | $CMP 74LS126 171 | D Quad buffer 3 State out 172 | K TTL Buffer 3State 173 | $ENDCMP 174 | # 175 | $CMP 74LS13 176 | D Double Nand4 schmitt trigger 177 | K TTL Nand4 178 | $ENDCMP 179 | # 180 | $CMP 74LS132 181 | D Quad Nand2 schmitt trigger 182 | K TTL Nand2 183 | $ENDCMP 184 | # 185 | $CMP 74LS133 186 | D Nand 8 inputs 187 | K TTL Nand8 188 | $ENDCMP 189 | # 190 | $CMP 74LS136 191 | D Quad Exclusive Or 2-inputs, Open Collect. 192 | K TTL XOR2 OpenCol 193 | $ENDCMP 194 | # 195 | $CMP 74LS137 196 | D Decoder 3 to 8, addr latches. 197 | K TTL DECOD8 DECOD 198 | $ENDCMP 199 | # 200 | $CMP 74LS138 201 | D Decoder 3 to 8 (active low outputs) 202 | K TTL DECOD DECOD8 203 | $ENDCMP 204 | # 205 | $CMP 74LS139 206 | D Dual Decoder 1 of 4, Active low outputs 207 | K TTL DECOD4 208 | $ENDCMP 209 | # 210 | $CMP 74LS14 211 | D Hex inverseur schmitt trigger 212 | K TTL not inv 213 | $ENDCMP 214 | # 215 | $CMP 74LS145 216 | D Decoder 1 to 10, Open Collect. 217 | K TTL DECOD10 OpenColl 218 | $ENDCMP 219 | # 220 | $CMP 74LS147 221 | D Priority Encodeur, 10 to 4 222 | K TTL ENCOD 223 | $ENDCMP 224 | # 225 | $CMP 74LS148 226 | D Priority Encoder 3 to 8 cascadable 227 | K TTL ENCOD 228 | $ENDCMP 229 | # 230 | $CMP 74LS15 231 | D Triple And 3 inputs 232 | K TTL And3 233 | $ENDCMP 234 | # 235 | $CMP 74LS151 236 | D Multiplexer 8 to 1 237 | K TTL MUX8 238 | $ENDCMP 239 | # 240 | $CMP 74LS153 241 | D Dual Multiplexer 4 to 1 242 | K TTL Mux4 243 | $ENDCMP 244 | # 245 | $CMP 74LS154 246 | D Decoder 4 to 16 247 | K TTL DECOD16 DECOD 248 | $ENDCMP 249 | # 250 | $CMP 74LS155 251 | D Dual 2 to 4 lines Decoder/Demultiplexer 252 | K TTL DECOD8 DECOD4 DEMUX4 DEMUX8 DEMUX DECOD 253 | $ENDCMP 254 | # 255 | $CMP 74LS156 256 | D Dual 2 to 4 lines Decoder/Demultiplexer, Open Collect. 257 | K TTL DECOD8 DECOD4 DEMUX4 DEMUX8 OpenCol 258 | $ENDCMP 259 | # 260 | $CMP 74LS157 261 | D Quad 2 to 1 line Multiplexer 262 | K TTL MUX MUX2 263 | $ENDCMP 264 | # 265 | $CMP 74LS158 266 | D Quad 2 to 1 multiplexer 267 | K TTL Mux MUX2 268 | $ENDCMP 269 | # 270 | $CMP 74LS160 271 | D Sychronous 4 bits programmable decimal Counter 272 | K TTL CNT CNT4 273 | $ENDCMP 274 | # 275 | $CMP 74LS161 276 | D Sychronous 4 bits programmable binary Counter 277 | K TTL CNT CNT4 278 | $ENDCMP 279 | # 280 | $CMP 74LS162 281 | D Sychronous 4 bits programmable decimal Counter 282 | K TTL CNT CNT4 283 | $ENDCMP 284 | # 285 | $CMP 74LS163 286 | D Sychronous 4 bits programmable binary Counter 287 | K TTL CNT CNT4 288 | $ENDCMP 289 | # 290 | $CMP 74LS165 291 | D Shift Register 8 bits, parallel load 292 | K TTL SR SR8 293 | $ENDCMP 294 | # 295 | $CMP 74LS166 296 | D Shift Register 8 bits, parallel load 297 | K TTL SR SR8 298 | $ENDCMP 299 | # 300 | $CMP 74LS168 301 | D Synchronous 4 bits Up/Down Decimal counter 302 | K TTL CNT CNT4 303 | $ENDCMP 304 | # 305 | $CMP 74LS169 306 | D Synchronous 4 bits Up/Down binary counter 307 | K TTL CNT CNT4 308 | $ENDCMP 309 | # 310 | $CMP 74LS170 311 | D 4 x 4 Register Files Open Collect. 312 | K TTL Register OpenCol 313 | $ENDCMP 314 | # 315 | $CMP 74LS173 316 | D 4 bits D-type Register, 3 state out 317 | K TTL REG REG4 3State DFF 318 | $ENDCMP 319 | # 320 | $CMP 74LS174 321 | D Hex D-type FlipFlop, reset 322 | K TTL REG REG6 DFF 323 | $ENDCMP 324 | # 325 | $CMP 74LS175 326 | D 4 bits D FlipFlop, reset 327 | K TTL REG REG4 DFF 328 | $ENDCMP 329 | # 330 | $CMP 74LS181 331 | D Arithmetic logic unit 332 | K TTL ALU ARITH 333 | F 74xx/74F181.pdf 334 | $ENDCMP 335 | # 336 | $CMP 74LS182 337 | D Carry generator 338 | K TTL ALU ARITH 339 | $ENDCMP 340 | # 341 | $CMP 74LS190 342 | D 4 bits Synchronous 4 bits Up/Down BCD Counter 343 | K TTL CNT CNT4 344 | $ENDCMP 345 | # 346 | $CMP 74LS191 347 | D 4 bits Synchronous 4 bits Up/Down binary Counter 348 | K TTL CNT CNT4 349 | $ENDCMP 350 | # 351 | $CMP 74LS192 352 | D Synchronous 4 bits Up/Down (2 clk) counter 353 | K TTL CNT CNT4 354 | $ENDCMP 355 | # 356 | $CMP 74LS193 357 | D Synchronous 4 bits Up/Down (2 clk) counter 358 | K TTL CNT CNT4 359 | $ENDCMP 360 | # 361 | $CMP 74LS194 362 | D Shift Register 4 bits Bidirectionnel 363 | K TTL RS SR4 364 | $ENDCMP 365 | # 366 | $CMP 74LS195 367 | D Shift Register 4 bits, parallel 368 | K TTL SR SR4 369 | $ENDCMP 370 | # 371 | $CMP 74LS196 372 | D 4 (3 + 1 ) bits presettable BCD counter 373 | K TTL CNT CNT4 374 | $ENDCMP 375 | # 376 | $CMP 74LS197 377 | D 4 (3 + 1 ) bits presettable binary counter 378 | K TTL CNT CNT4 379 | $ENDCMP 380 | # 381 | $CMP 74LS20 382 | D Dual Nand 4 inputs 383 | K TTL Nand4 384 | $ENDCMP 385 | # 386 | $CMP 74LS21 387 | D Dual And 4 inputs 388 | K TTL And4 389 | $ENDCMP 390 | # 391 | $CMP 74LS22 392 | D Dual Nand 4 inputs Open Collect. 393 | K TTL Nand4 OpenCol 394 | $ENDCMP 395 | # 396 | $CMP 74LS221 397 | D Dual Monostable 398 | K TTL Monostable 399 | $ENDCMP 400 | # 401 | $CMP 74LS240 402 | D 8 bits BUS Buffer (Inverter) 3 State out 403 | K TTL Buffer BUS 3State 404 | $ENDCMP 405 | # 406 | $CMP 74LS241 407 | D 8 bits Bus Buffer 3 State out 408 | K TTL Buffer BUS 3State 409 | $ENDCMP 410 | # 411 | $CMP 74LS243 412 | D 4 bits Bus Tranceiver 413 | K TTL Buffer 3State BUS BIDI 414 | $ENDCMP 415 | # 416 | $CMP 74LS244 417 | D 8 bits Bus Buffer 3 State out 418 | K TTL Buffer BUS 3State 419 | $ENDCMP 420 | # 421 | $CMP 74LS245 422 | D Octal BUS Transceivers, 3 State out 423 | K TTL BUS 3State 424 | $ENDCMP 425 | # 426 | $CMP 74LS246 427 | D BDC to 7 segments Decoder Open Collec. active Low 428 | K TTL DECOD 429 | $ENDCMP 430 | # 431 | $CMP 74LS247 432 | D BDC to 7 segments Decoder Open Collec. active Low 433 | K TTL DECOD 434 | $ENDCMP 435 | # 436 | $CMP 74LS248 437 | D BCD to 7 segments Decoder, Active High 438 | K TTL DECOD 439 | $ENDCMP 440 | # 441 | $CMP 74LS249 442 | D BCD to 7 segments Decoder, Open collect, Active High 443 | K TTL DECOD OpenCol 444 | $ENDCMP 445 | # 446 | $CMP 74LS251 447 | D Multiplexer 8 to 1, 3 state Out 448 | K TTL MUX MUX8 3State 449 | $ENDCMP 450 | # 451 | $CMP 74LS253 452 | D Dual Multiplexer 4 to 1, 3 State Out 453 | K TTL MUX MUX4 3State 454 | $ENDCMP 455 | # 456 | $CMP 74LS257 457 | D Quad 2 to 1 Multiplexer 458 | K TTL MUX MUX2 459 | $ENDCMP 460 | # 461 | $CMP 74LS258 462 | D Quad 2 to 1 Multiplexer,invert 463 | K TTL MUX MUX2 464 | $ENDCMP 465 | # 466 | $CMP 74LS259 467 | D 8 bits addressable latch 468 | K TTL REG DFF 469 | $ENDCMP 470 | # 471 | $CMP 74LS26 472 | D Quad Nand 2 inputs Open collect. 473 | K TTL Nand2 OpenCol 474 | $ENDCMP 475 | # 476 | $CMP 74LS27 477 | D Triple Nr 3 inputs 478 | K TTL Nor3 479 | $ENDCMP 480 | # 481 | $CMP 74LS273 482 | D 8 bits D FlipFlop, reset 483 | K TTL DFF DFF8 484 | $ENDCMP 485 | # 486 | $CMP 74LS28 487 | D Quad Buffer Nor2 488 | K TTL Nor2 Buffer 489 | $ENDCMP 490 | # 491 | $CMP 74LS280 492 | D Parity Generator/Checker 493 | K TTL ALU Arith 494 | $ENDCMP 495 | # 496 | $CMP 74LS283 497 | D 4 bits full Adder 498 | K TTL ADD Arith ALU 499 | $ENDCMP 500 | # 501 | $CMP 74LS290 502 | D 4 bits BCD counter 503 | K TTL CNT CNT4 504 | $ENDCMP 505 | # 506 | $CMP 74LS293 507 | D 4 bits binary counter 508 | K TTL CNT CNT4 509 | $ENDCMP 510 | # 511 | $CMP 74LS298 512 | D Quad 2 to 1 multiplexer with storage 513 | K TTL MUX MUX2 514 | $ENDCMP 515 | # 516 | $CMP 74LS299 517 | D 8 bits Universer shift/storage Register 518 | K TTL REG SR SR8 519 | $ENDCMP 520 | # 521 | $CMP 74LS30 522 | D Nand 8 inputs 523 | K TTL Nand8 524 | $ENDCMP 525 | # 526 | $CMP 74LS32 527 | D Quad Or 2 inputs 528 | K TTL Or2 529 | $ENDCMP 530 | # 531 | $CMP 74LS323 532 | D 8 bits Universal Shift/Storage Register 533 | K TTL REG SR SR8 534 | $ENDCMP 535 | # 536 | $CMP 74LS33 537 | D Quad Nand 2 inputs, Open collect. 538 | K TTL Nand8 OpenCol 539 | $ENDCMP 540 | # 541 | $CMP 74LS348 542 | D 8 to 3 lines Priority Encoder 543 | K TTL ENCOD Arith 544 | $ENDCMP 545 | # 546 | $CMP 74LS352 547 | D Dual 4 to 1 line Multiplexer 548 | K TTL Mux MUX4 549 | $ENDCMP 550 | # 551 | $CMP 74LS353 552 | D Dual 4 to 1 line Multiplexer, inverter 553 | K TTL MUX MUX2 554 | $ENDCMP 555 | # 556 | $CMP 74LS365 557 | D Hex Bus Driver, 3 State Out 558 | K TTL Buffer BUS 3State 559 | $ENDCMP 560 | # 561 | $CMP 74LS366 562 | D Hex Bus Driver inverter, 3 state out 563 | K TTL Buffer BUS 3State 564 | $ENDCMP 565 | # 566 | $CMP 74LS367 567 | D Hex Bus Driver 3 state Out 568 | K TTL Buffer BUS 3State 569 | $ENDCMP 570 | # 571 | $CMP 74LS368 572 | D Hex Bus Driver inverter, 3 state Out 573 | K TTL Buffer BUS 3State 574 | $ENDCMP 575 | # 576 | $CMP 74LS37 577 | D Quad Buffer nand2 578 | K TTL nand2 buffer 579 | $ENDCMP 580 | # 581 | $CMP 74LS373 582 | D 8 bits Latch, 3 state Out 583 | K TTL REG DFF DFF8 LATCH 584 | $ENDCMP 585 | # 586 | $CMP 74LS374 587 | D 8 bits Register, 3 state Out 588 | K TTL DFF DFF8 REG 3State 589 | $ENDCMP 590 | # 591 | $CMP 74LS375 592 | D 4 bits Latch 593 | K TTL DFF DFF4 Latch 594 | $ENDCMP 595 | # 596 | $CMP 74LS377 597 | D 8 bit Register 598 | K TTL REG DFF DFF8 599 | $ENDCMP 600 | # 601 | $CMP 74LS378 602 | D 6 bits Register 603 | K TTL REG DFF DFF6 604 | $ENDCMP 605 | # 606 | $CMP 74LS379 607 | D 4 bits Register 608 | K TTL REG DFF DFF4 609 | $ENDCMP 610 | # 611 | $CMP 74LS38 612 | D Quad Buffer Nand 2 inputs Open collect. 613 | K TTL Nand2 OpenCol Buffer 614 | $ENDCMP 615 | # 616 | $CMP 74LS385 617 | D Quad serial Adder 618 | K TTL ADD Arith ALU 619 | $ENDCMP 620 | # 621 | $CMP 74LS386 622 | D Quad 2 input XOR 623 | K TTL XOR2 624 | $ENDCMP 625 | # 626 | $CMP 74LS390 627 | D Dual BDC 4 bits counter 628 | K TTL CNT CNT4 629 | $ENDCMP 630 | # 631 | $CMP 74LS393 632 | D Dual BDC 4 bits counter 633 | K TTL CNT CNT4 634 | F 74xx\74LS393.pdf 635 | $ENDCMP 636 | # 637 | $CMP 74LS395 638 | D 4 bits universal shift register, 3 state out 639 | K TTL SR SR4 REG 3State 640 | $ENDCMP 641 | # 642 | $CMP 74LS398 643 | D Quad 2 to 1 line Multiplexer, 3 state out 644 | K TTL MUX MUX2 3State 645 | $ENDCMP 646 | # 647 | $CMP 74LS399 648 | D Quad 2 to 1 line multiplexer with storage 649 | K TTL MUX MUX2 650 | $ENDCMP 651 | # 652 | $CMP 74LS40 653 | D Dual Nand 4 inputs 654 | K TTL Nand4 655 | $ENDCMP 656 | # 657 | $CMP 74LS42 658 | D 4 to 10 line DECODER 659 | K TTL DECOD DECOD10 660 | $ENDCMP 661 | # 662 | $CMP 74LS46 663 | D BCD to 7 segments Driver, Open Collect, 15V outputs 664 | K TTL DECOD DECOD7 OpenCol 665 | $ENDCMP 666 | # 667 | $CMP 74LS47 668 | D BCD to 7 segments Driver, Open Collect, 30V outputs 669 | K TTL DECOD DECOD7 OpenCol 670 | $ENDCMP 671 | # 672 | $CMP 74LS48 673 | D BCD to 7 segments Decoder/driver, Active High outputs 674 | K TTL DECOD DECOD7 675 | $ENDCMP 676 | # 677 | $CMP 74LS49 678 | D BDC to 7 segments decoder/driver, Open collect. 679 | K TTL DECOD DECOD7 OpenCol 680 | $ENDCMP 681 | # 682 | $CMP 74LS51 683 | D Dual 3- and 2-input AND-NOR ( S = /(AB[C] + DE[F]) ) 684 | K TTL ANDNOR 685 | F http://www.ti.com/lit/ds/symlink/sn74ls51.pdf 686 | $ENDCMP 687 | # 688 | $CMP 74LS54 689 | D And-Nor (S = /(AB + CD + EF + GH) ) 690 | K TTL ANDNOR 691 | $ENDCMP 692 | # 693 | $CMP 74LS540 694 | D 8 bits Buffer/Line driver Inverter, 3 state Out 695 | K BUFFER BUS TTL 3State 696 | $ENDCMP 697 | # 698 | $CMP 74LS541 699 | D 8bits Buffer/Line Driver 3 state Out 700 | K TTL BUFFER 3State BUS 701 | $ENDCMP 702 | # 703 | $CMP 74LS55 704 | D AND-NOR ( S = / (ABCD + EFGH) ) 705 | K TTL ANDNOR 706 | $ENDCMP 707 | # 708 | $CMP 74LS573 709 | D 8 bits Latch 3 state Out 710 | K TTL DFF DFF8 LATCH 3State 711 | F 74xx/74hc573.pdf 712 | $ENDCMP 713 | # 714 | $CMP 74LS574 715 | D 8 bits Register, 3 state Out 716 | K TTL REG DFF DFF8 3State 717 | $ENDCMP 718 | # 719 | $CMP 74LS595 720 | D 8 bits serial in // out Shift Register 3 State Out 721 | K TTL SR 3State 722 | $ENDCMP 723 | # 724 | $CMP 74LS596 725 | D 8 bits serial in // out Shift Register Open Collect. 726 | K HCMOS SR OpenCol 727 | $ENDCMP 728 | # 729 | $CMP 74LS688 730 | D 8 bits Comparator 731 | K TTL DECOD Arith 732 | $ENDCMP 733 | # 734 | $CMP 74LS73 735 | D Dual JK FlipFlop, reset 736 | K TTL JK JKFF 737 | $ENDCMP 738 | # 739 | $CMP 74LS74 740 | D Dual D FlipFlop, Set & Reset 741 | K TTL DFF 742 | F 74xx/74hc_hct74.pdf 743 | $ENDCMP 744 | # 745 | $CMP 74LS75 746 | D 4 bits Latch 747 | K TTL DFF Latch 748 | $ENDCMP 749 | # 750 | $CMP 74LS76 751 | D Dual JK FlipFlop, Set & Reset 752 | K TTL JK JKFF 753 | $ENDCMP 754 | # 755 | $CMP 74LS77 756 | D 4 bits Latch 757 | K TTL DFF Latch 758 | $ENDCMP 759 | # 760 | $CMP 74LS78 761 | D Dual JK FlipFlop, preset , common clock & reset 762 | K TTL JK JKFF 763 | $ENDCMP 764 | # 765 | $CMP 74LS83 766 | D 4 bits Full Adder 767 | K TTL ADD ARITH ALU 768 | $ENDCMP 769 | # 770 | $CMP 74LS85 771 | D 4 bits Comparateur 772 | K TTL COMP ARITH 773 | $ENDCMP 774 | # 775 | $CMP 74LS86 776 | D Quad XOR 2 inputs 777 | K TTL XOR2 778 | F 74xx/74ls86.pdf 779 | $ENDCMP 780 | # 781 | $CMP 74LS90 782 | D BCD Counter ( div 2 & div 5 ) 783 | K TTL CNT CNT4 784 | $ENDCMP 785 | # 786 | $CMP 74LS91 787 | D 8 bits Serial Register 788 | K TTL SR SR8 789 | $ENDCMP 790 | # 791 | $CMP 74LS92 792 | D Divide by 12 counter 793 | K TTL CNT CNT4 794 | $ENDCMP 795 | # 796 | $CMP 74LS93 797 | D Divide by 2 & 8 counter 798 | K TTL CNT CNT4 799 | $ENDCMP 800 | # 801 | $CMP 74LS95 802 | D Shift Register 5 bits ( // in // out ) 803 | K TTL SR SR4 804 | $ENDCMP 805 | # 806 | $CMP 74LV14 807 | D Hex Inverseur 808 | K TTL not inv 809 | $ENDCMP 810 | # 811 | $CMP 74ls670 812 | D 4 x 4 Register Files 3 State Out 813 | K TTL Register 3State 814 | $ENDCMP 815 | # 816 | #End Doc Library 817 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host pcbnew 4.0.5) 2 | 3 | (general 4 | (links 14) 5 | (no_connects 0) 6 | (area 110.414999 82.474999 160.730001 129.0574) 7 | (thickness 1.6) 8 | (drawings 6) 9 | (tracks 60) 10 | (zones 0) 11 | (modules 2) 12 | (nets 17) 13 | ) 14 | 15 | (page A4) 16 | (layers 17 | (0 F.Cu signal) 18 | (31 B.Cu signal) 19 | (32 B.Adhes user) 20 | (33 F.Adhes user) 21 | (34 B.Paste user) 22 | (35 F.Paste user) 23 | (36 B.SilkS user) 24 | (37 F.SilkS user) 25 | (38 B.Mask user) 26 | (39 F.Mask user) 27 | (40 Dwgs.User user) 28 | (41 Cmts.User user) 29 | (42 Eco1.User user) 30 | (43 Eco2.User user) 31 | (44 Edge.Cuts user) 32 | (45 Margin user) 33 | (46 B.CrtYd user) 34 | (47 F.CrtYd user) 35 | (48 B.Fab user) 36 | (49 F.Fab user) 37 | ) 38 | 39 | (setup 40 | (last_trace_width 0.762) 41 | (trace_clearance 0.1524) 42 | (zone_clearance 0.508) 43 | (zone_45_only no) 44 | (trace_min 0.1524) 45 | (segment_width 0.2) 46 | (edge_width 0.15) 47 | (via_size 0.6858) 48 | (via_drill 0.3302) 49 | (via_min_size 0.6858) 50 | (via_min_drill 0.3302) 51 | (uvia_size 0.762) 52 | (uvia_drill 0.1) 53 | (uvias_allowed no) 54 | (uvia_min_size 0) 55 | (uvia_min_drill 0) 56 | (pcb_text_width 0.3) 57 | (pcb_text_size 1.5 1.5) 58 | (mod_edge_width 0.15) 59 | (mod_text_size 1 1) 60 | (mod_text_width 0.15) 61 | (pad_size 1.524 1.524) 62 | (pad_drill 0.762) 63 | (pad_to_mask_clearance 0.2) 64 | (aux_axis_origin 0 0) 65 | (visible_elements FFFFFF7F) 66 | (pcbplotparams 67 | (layerselection 0x010f0_80000001) 68 | (usegerberextensions false) 69 | (excludeedgelayer true) 70 | (linewidth 0.100000) 71 | (plotframeref false) 72 | (viasonmask false) 73 | (mode 1) 74 | (useauxorigin false) 75 | (hpglpennumber 1) 76 | (hpglpenspeed 20) 77 | (hpglpendiameter 15) 78 | (hpglpenoverlay 2) 79 | (psnegative false) 80 | (psa4output false) 81 | (plotreference true) 82 | (plotvalue false) 83 | (plotinvisibletext false) 84 | (padsonsilk false) 85 | (subtractmaskfromsilk true) 86 | (outputformat 1) 87 | (mirror false) 88 | (drillshape 0) 89 | (scaleselection 1) 90 | (outputdirectory GERBERS)) 91 | ) 92 | 93 | (net 0 "") 94 | (net 1 "Net-(U1-Pad8)") 95 | (net 2 "Net-(U1-Pad7)") 96 | (net 3 "Net-(U1-Pad6)") 97 | (net 4 "Net-(U1-Pad5)") 98 | (net 5 "Net-(U1-Pad4)") 99 | (net 6 "Net-(U1-Pad3)") 100 | (net 7 GND) 101 | (net 8 "Net-(U1-Pad1)") 102 | (net 9 /VCC) 103 | (net 10 "Net-(U1-Pad15)") 104 | (net 11 "Net-(U1-Pad14)") 105 | (net 12 "Net-(U1-Pad13)") 106 | (net 13 "Net-(U1-Pad12)") 107 | (net 14 "Net-(U1-Pad11)") 108 | (net 15 "Net-(U1-Pad10)") 109 | (net 16 "Net-(U1-Pad9)") 110 | 111 | (net_class Default "This is the default net class." 112 | (clearance 0.1524) 113 | (trace_width 0.762) 114 | (via_dia 0.6858) 115 | (via_drill 0.3302) 116 | (uvia_dia 0.762) 117 | (uvia_drill 0.1) 118 | (add_net /VCC) 119 | (add_net GND) 120 | (add_net "Net-(U1-Pad1)") 121 | (add_net "Net-(U1-Pad10)") 122 | (add_net "Net-(U1-Pad11)") 123 | (add_net "Net-(U1-Pad12)") 124 | (add_net "Net-(U1-Pad13)") 125 | (add_net "Net-(U1-Pad14)") 126 | (add_net "Net-(U1-Pad15)") 127 | (add_net "Net-(U1-Pad3)") 128 | (add_net "Net-(U1-Pad4)") 129 | (add_net "Net-(U1-Pad5)") 130 | (add_net "Net-(U1-Pad6)") 131 | (add_net "Net-(U1-Pad7)") 132 | (add_net "Net-(U1-Pad8)") 133 | (add_net "Net-(U1-Pad9)") 134 | ) 135 | 136 | (module Pin_Headers:Pin_Header_Straight_1x14 (layer F.Cu) (tedit 586A49D4) (tstamp 5846E1EC) 137 | (at 115.57 88.9) 138 | (descr "Through hole pin header") 139 | (tags "pin header") 140 | (path /5846DFFC) 141 | (fp_text reference U2 (at -2.54 0) (layer F.SilkS) 142 | (effects (font (size 1 1) (thickness 0.15))) 143 | ) 144 | (fp_text value ILI9341_24_Touch (at -2.54 9.525 90) (layer F.Fab) 145 | (effects (font (size 1 1) (thickness 0.15))) 146 | ) 147 | (fp_line (start -1.75 -1.75) (end -1.75 34.8) (layer F.CrtYd) (width 0.05)) 148 | (fp_line (start 1.75 -1.75) (end 1.75 34.8) (layer F.CrtYd) (width 0.05)) 149 | (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) 150 | (fp_line (start -1.75 34.8) (end 1.75 34.8) (layer F.CrtYd) (width 0.05)) 151 | (fp_line (start -1.27 1.27) (end -1.27 34.29) (layer F.SilkS) (width 0.15)) 152 | (fp_line (start -1.27 34.29) (end 1.27 34.29) (layer F.SilkS) (width 0.15)) 153 | (fp_line (start 1.27 34.29) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) 154 | (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) 155 | (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) 156 | (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) 157 | (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) 158 | (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 159 | (net 6 "Net-(U1-Pad3)")) 160 | (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 161 | (net 12 "Net-(U1-Pad13)")) 162 | (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 163 | (net 11 "Net-(U1-Pad14)")) 164 | (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 165 | (net 5 "Net-(U1-Pad4)")) 166 | (pad 5 thru_hole oval (at 0 10.16) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 167 | (net 13 "Net-(U1-Pad12)")) 168 | (pad 6 thru_hole oval (at 0 12.7) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 169 | (net 12 "Net-(U1-Pad13)")) 170 | (pad 7 thru_hole oval (at 0 15.24) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 171 | (net 10 "Net-(U1-Pad15)")) 172 | (pad 8 thru_hole oval (at 0 17.78) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 173 | (net 13 "Net-(U1-Pad12)")) 174 | (pad 9 thru_hole oval (at 0 20.32) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 175 | (net 11 "Net-(U1-Pad14)")) 176 | (pad 10 thru_hole oval (at 0 22.86) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 177 | (net 4 "Net-(U1-Pad5)")) 178 | (pad 11 thru_hole oval (at 0 25.4) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 179 | (net 16 "Net-(U1-Pad9)")) 180 | (pad 12 thru_hole oval (at 0 27.94) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 181 | (net 3 "Net-(U1-Pad6)")) 182 | (pad 13 thru_hole oval (at 0 30.48) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 183 | (net 7 GND)) 184 | (pad 14 thru_hole oval (at 0 33.02) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 185 | (net 9 /VCC)) 186 | (model Pin_Headers.3dshapes/Pin_Header_Straight_1x14.wrl 187 | (at (xyz 0 -0.65 0)) 188 | (scale (xyz 1 1 1)) 189 | (rotate (xyz 0 0 90)) 190 | ) 191 | ) 192 | 193 | (module WemosD1Mini:D1_mini_board (layer B.Cu) (tedit 586A42E4) (tstamp 5846E1DA) 194 | (at 142.24 109.22 180) 195 | (path /5846DA55) 196 | (fp_text reference U1 (at 1.27 -18.81 180) (layer F.SilkS) 197 | (effects (font (size 1 1) (thickness 0.15))) 198 | ) 199 | (fp_text value WeMos_mini (at 1.27 12.065 180) (layer F.Fab) 200 | (effects (font (size 1 1) (thickness 0.15))) 201 | ) 202 | (fp_text user WeMos (at 0 15.24 180) (layer F.SilkS) 203 | (effects (font (size 3 3) (thickness 0.15))) 204 | ) 205 | (fp_line (start -6.35 -3.81) (end -6.35 10.16) (layer F.SilkS) (width 0.15)) 206 | (fp_line (start -6.35 10.16) (end 6.35 10.16) (layer F.SilkS) (width 0.15)) 207 | (fp_line (start 6.35 10.16) (end 6.35 -3.81) (layer F.SilkS) (width 0.15)) 208 | (fp_line (start 6.35 -3.81) (end -6.35 -3.81) (layer F.SilkS) (width 0.15)) 209 | (fp_line (start -8.89 -5.08) (end 8.89 -5.08) (layer F.SilkS) (width 0.15)) 210 | (fp_line (start 8.89 -5.08) (end 8.89 17.78) (layer F.SilkS) (width 0.15)) 211 | (fp_line (start 8.89 17.78) (end -8.89 17.78) (layer F.SilkS) (width 0.15)) 212 | (fp_line (start -8.89 17.78) (end -8.89 -5.08) (layer F.SilkS) (width 0.15)) 213 | (fp_line (start 10.817472 -16.277228) (end 5.00618 -16.277228) (layer F.SilkS) (width 0.1)) 214 | (fp_line (start 5.00618 -16.277228) (end 4.979849 -14.993795) (layer F.SilkS) (width 0.1)) 215 | (fp_line (start 4.979849 -14.993795) (end -3.851373 -15.000483) (layer F.SilkS) (width 0.1)) 216 | (fp_line (start -3.851373 -15.000483) (end -3.849397 -16.202736) (layer F.SilkS) (width 0.1)) 217 | (fp_line (start -3.849397 -16.202736) (end -12.930193 -16.176658) (layer F.SilkS) (width 0.1)) 218 | (fp_line (start -12.930193 -16.176658) (end -12.916195 14.993493) (layer F.SilkS) (width 0.1)) 219 | (fp_line (start -12.916195 14.993493) (end -12.683384 15.596286) (layer F.SilkS) (width 0.1)) 220 | (fp_line (start -12.683384 15.596286) (end -12.399901 16.141167) (layer F.SilkS) (width 0.1)) 221 | (fp_line (start -12.399901 16.141167) (end -12.065253 16.627577) (layer F.SilkS) (width 0.1)) 222 | (fp_line (start -12.065253 16.627577) (end -11.678953 17.054952) (layer F.SilkS) (width 0.1)) 223 | (fp_line (start -11.678953 17.054952) (end -11.240512 17.422741) (layer F.SilkS) (width 0.1)) 224 | (fp_line (start -11.240512 17.422741) (end -10.74944 17.730377) (layer F.SilkS) (width 0.1)) 225 | (fp_line (start -10.74944 17.730377) (end -10.20525 17.97731) (layer F.SilkS) (width 0.1)) 226 | (fp_line (start -10.20525 17.97731) (end -9.607453 18.162976) (layer F.SilkS) (width 0.1)) 227 | (fp_line (start -9.607453 18.162976) (end 9.43046 18.191734) (layer F.SilkS) (width 0.1)) 228 | (fp_line (start 9.43046 18.191734) (end 10.049824 17.957741) (layer F.SilkS) (width 0.1)) 229 | (fp_line (start 10.049824 17.957741) (end 10.638018 17.673258) (layer F.SilkS) (width 0.1)) 230 | (fp_line (start 10.638018 17.673258) (end 11.181445 17.323743) (layer F.SilkS) (width 0.1)) 231 | (fp_line (start 11.181445 17.323743) (end 11.666503 16.894658) (layer F.SilkS) (width 0.1)) 232 | (fp_line (start 11.666503 16.894658) (end 12.079595 16.37146) (layer F.SilkS) (width 0.1)) 233 | (fp_line (start 12.079595 16.37146) (end 12.407122 15.739613) (layer F.SilkS) (width 0.1)) 234 | (fp_line (start 12.407122 15.739613) (end 12.635482 14.984575) (layer F.SilkS) (width 0.1)) 235 | (fp_line (start 12.635482 14.984575) (end 12.751078 14.091807) (layer F.SilkS) (width 0.1)) 236 | (fp_line (start 12.751078 14.091807) (end 12.776026 -8.463285) (layer F.SilkS) (width 0.1)) 237 | (fp_line (start 12.776026 -8.463285) (end 10.83248 -9.424181) (layer F.SilkS) (width 0.1)) 238 | (fp_line (start 10.83248 -9.424181) (end 10.802686 -16.232524) (layer F.SilkS) (width 0.1)) 239 | (fp_line (start -3.17965 -10.051451) (end 3.959931 -10.051451) (layer F.SilkS) (width 0.1)) 240 | (fp_line (start 3.959931 -10.051451) (end 3.959931 -15.865188) (layer F.SilkS) (width 0.1)) 241 | (fp_line (start 3.959931 -15.865188) (end -3.17965 -15.865188) (layer F.SilkS) (width 0.1)) 242 | (fp_line (start -3.17965 -15.865188) (end -3.17965 -10.051451) (layer F.SilkS) (width 0.1)) 243 | (fp_line (start 10.7436 -9.402349) (end 9.191378 -9.402349) (layer F.SilkS) (width 0.1)) 244 | (fp_line (start 9.191378 -9.402349) (end 8.662211 -9.931515) (layer F.SilkS) (width 0.1)) 245 | (fp_line (start 8.662211 -9.931515) (end 7.40985 -9.931515) (layer F.SilkS) (width 0.1)) 246 | (fp_line (start 7.40985 -9.931515) (end 7.40985 -14.993876) (layer F.SilkS) (width 0.1)) 247 | (fp_line (start 7.40985 -14.993876) (end 8.697489 -14.993876) (layer F.SilkS) (width 0.1)) 248 | (fp_line (start 8.697489 -14.993876) (end 9.226656 -15.487765) (layer F.SilkS) (width 0.1)) 249 | (fp_line (start 9.226656 -15.487765) (end 10.796517 -15.487765) (layer F.SilkS) (width 0.1)) 250 | (fp_line (start 10.796517 -15.487765) (end 10.7436 -9.402349) (layer F.SilkS) (width 0.1)) 251 | (fp_line (start 10.778878 -11.483738) (end 11.431517 -11.483738) (layer F.SilkS) (width 0.1)) 252 | (fp_line (start 11.431517 -11.483738) (end 11.431517 -13.476932) (layer F.SilkS) (width 0.1)) 253 | (fp_line (start 11.431517 -13.476932) (end 10.814156 -13.476932) (layer F.SilkS) (width 0.1)) 254 | (pad 8 thru_hole circle (at -11.43 10.16 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 255 | (net 1 "Net-(U1-Pad8)")) 256 | (pad 7 thru_hole circle (at -11.43 7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 257 | (net 2 "Net-(U1-Pad7)")) 258 | (pad 6 thru_hole circle (at -11.43 5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 259 | (net 3 "Net-(U1-Pad6)")) 260 | (pad 5 thru_hole circle (at -11.43 2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 261 | (net 4 "Net-(U1-Pad5)")) 262 | (pad 4 thru_hole circle (at -11.43 0 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 263 | (net 5 "Net-(U1-Pad4)")) 264 | (pad 3 thru_hole circle (at -11.43 -2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 265 | (net 6 "Net-(U1-Pad3)")) 266 | (pad 2 thru_hole circle (at -11.43 -5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 267 | (net 7 GND)) 268 | (pad 1 thru_hole circle (at -11.43 -7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 269 | (net 8 "Net-(U1-Pad1)")) 270 | (pad 16 thru_hole circle (at 11.43 -7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 271 | (net 9 /VCC)) 272 | (pad 15 thru_hole circle (at 11.43 -5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 273 | (net 10 "Net-(U1-Pad15)")) 274 | (pad 14 thru_hole circle (at 11.43 -2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 275 | (net 11 "Net-(U1-Pad14)")) 276 | (pad 13 thru_hole circle (at 11.43 0 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 277 | (net 12 "Net-(U1-Pad13)")) 278 | (pad 12 thru_hole circle (at 11.43 2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 279 | (net 13 "Net-(U1-Pad12)")) 280 | (pad 11 thru_hole circle (at 11.43 5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 281 | (net 14 "Net-(U1-Pad11)")) 282 | (pad 10 thru_hole circle (at 11.43 7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 283 | (net 15 "Net-(U1-Pad10)")) 284 | (pad 9 thru_hole circle (at 11.43 10.16 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 285 | (net 16 "Net-(U1-Pad9)")) 286 | ) 287 | 288 | (gr_text "ILI9341 Touch" (at 118.11 109.22 90) (layer F.SilkS) 289 | (effects (font (size 1.5 1.5) (thickness 0.3))) 290 | ) 291 | (gr_line (start 110.49 82.55) (end 160.655 82.55) (angle 90) (layer Edge.Cuts) (width 0.15)) 292 | (gr_text "ILI9341 XPT2046 WiFi Touch Screen\nby blog.squix.org - 02-JAN-2017" (at 134.62 85.09) (layer F.SilkS) 293 | (effects (font (size 1.5 1.5) (thickness 0.3))) 294 | ) 295 | (gr_line (start 160.655 125.095) (end 160.655 82.55) (angle 90) (layer Edge.Cuts) (width 0.15)) 296 | (gr_line (start 110.49 125.095) (end 160.655 125.095) (angle 90) (layer Edge.Cuts) (width 0.15)) 297 | (gr_line (start 110.49 82.55) (end 110.49 125.095) (angle 90) (layer Edge.Cuts) (width 0.15)) 298 | 299 | (segment (start 115.57 116.84) (end 118.11 116.84) (width 0.762) (layer B.Cu) (net 3)) 300 | (segment (start 154.94 104.14) (end 153.67 104.14) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A47A2)) 301 | (segment (start 156.21 105.41) (end 154.94 104.14) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A479E)) 302 | (segment (start 156.21 118.11) (end 156.21 105.41) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A479C)) 303 | (segment (start 153.67 120.65) (end 156.21 118.11) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A478F)) 304 | (segment (start 121.92 120.65) (end 153.67 120.65) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A478D)) 305 | (segment (start 118.11 116.84) (end 121.92 120.65) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A4784)) 306 | (segment (start 115.57 111.76) (end 113.03 111.76) (width 0.762) (layer F.Cu) (net 4)) 307 | (segment (start 132.08 85.09) (end 153.67 106.68) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48D3)) 308 | (segment (start 114.3 85.09) (end 132.08 85.09) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48CB)) 309 | (segment (start 111.76 87.63) (end 114.3 85.09) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48CA)) 310 | (segment (start 111.76 110.49) (end 111.76 87.63) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48C4)) 311 | (segment (start 113.03 111.76) (end 111.76 110.49) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48C2)) 312 | (segment (start 115.57 96.52) (end 140.97 96.52) (width 0.762) (layer F.Cu) (net 5)) 313 | (segment (start 140.97 96.52) (end 153.67 109.22) (width 0.762) (layer F.Cu) (net 5) (tstamp 586A486B)) 314 | (segment (start 153.67 111.76) (end 151.13 111.76) (width 0.762) (layer B.Cu) (net 6)) 315 | (segment (start 128.27 88.9) (end 115.57 88.9) (width 0.762) (layer B.Cu) (net 6) (tstamp 586A47CA)) 316 | (segment (start 151.13 111.76) (end 128.27 88.9) (width 0.762) (layer B.Cu) (net 6) (tstamp 586A47C5)) 317 | (segment (start 115.57 119.38) (end 113.03 119.38) (width 0.762) (layer F.Cu) (net 7)) 318 | (segment (start 149.86 114.3) (end 153.67 114.3) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4743)) 319 | (segment (start 148.59 115.57) (end 149.86 114.3) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A473F)) 320 | (segment (start 139.7 124.46) (end 148.59 115.57) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4738)) 321 | (segment (start 113.03 124.46) (end 139.7 124.46) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4733)) 322 | (segment (start 111.76 123.19) (end 113.03 124.46) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4732)) 323 | (segment (start 111.76 120.65) (end 111.76 123.19) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4730)) 324 | (segment (start 113.03 119.38) (end 111.76 120.65) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A472D)) 325 | (segment (start 115.57 121.92) (end 125.73 121.92) (width 0.762) (layer F.Cu) (net 9)) 326 | (segment (start 125.73 121.92) (end 130.81 116.84) (width 0.762) (layer F.Cu) (net 9) (tstamp 586A4717)) 327 | (segment (start 115.57 104.14) (end 119.38 104.14) (width 0.762) (layer B.Cu) (net 10)) 328 | (segment (start 129.54 114.3) (end 130.81 114.3) (width 0.762) (layer B.Cu) (net 10) (tstamp 586A484C)) 329 | (segment (start 119.38 104.14) (end 129.54 114.3) (width 0.762) (layer B.Cu) (net 10) (tstamp 586A4849)) 330 | (segment (start 115.57 109.22) (end 114.3 109.22) (width 0.762) (layer F.Cu) (net 11)) 331 | (segment (start 114.3 93.98) (end 115.57 93.98) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48BE)) 332 | (segment (start 113.03 95.25) (end 114.3 93.98) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48BC)) 333 | (segment (start 113.03 107.95) (end 113.03 95.25) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48B8)) 334 | (segment (start 114.3 109.22) (end 113.03 107.95) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48B6)) 335 | (segment (start 115.57 109.22) (end 124.46 109.22) (width 0.762) (layer F.Cu) (net 11)) 336 | (segment (start 127 111.76) (end 130.81 111.76) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A4886)) 337 | (segment (start 124.46 109.22) (end 127 111.76) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A4882)) 338 | (segment (start 115.57 101.6) (end 120.65 101.6) (width 0.762) (layer B.Cu) (net 12)) 339 | (segment (start 120.65 101.6) (end 128.27 109.22) (width 0.762) (layer B.Cu) (net 12) (tstamp 586A47E9)) 340 | (segment (start 128.27 109.22) (end 130.81 109.22) (width 0.762) (layer B.Cu) (net 12) (tstamp 586A47F2)) 341 | (segment (start 115.57 91.44) (end 120.65 91.44) (width 0.762) (layer B.Cu) (net 12)) 342 | (segment (start 120.65 91.44) (end 120.65 101.6) (width 0.762) (layer B.Cu) (net 12) (tstamp 5847110C)) 343 | (segment (start 126.0475 102.5525) (end 126.0475 103.1875) (width 0.762) (layer F.Cu) (net 13)) 344 | (segment (start 129.54 106.68) (end 130.81 106.68) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A480A)) 345 | (segment (start 126.0475 103.1875) (end 129.54 106.68) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A4802)) 346 | (segment (start 126.365 102.87) (end 126.0475 102.5525) (width 0.762) (layer F.Cu) (net 13)) 347 | (segment (start 126.0475 102.5525) (end 122.555 99.06) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A4800)) 348 | (segment (start 122.555 99.06) (end 115.57 99.06) (width 0.762) (layer F.Cu) (net 13) (tstamp 58470FA8)) 349 | (segment (start 115.57 106.68) (end 122.555 106.68) (width 0.762) (layer F.Cu) (net 13)) 350 | (segment (start 122.555 106.68) (end 126.365 102.87) (width 0.762) (layer F.Cu) (net 13) (tstamp 58470F9C)) 351 | (segment (start 115.57 114.3) (end 119.38 114.3) (width 0.762) (layer B.Cu) (net 16)) 352 | (segment (start 133.35 99.06) (end 130.81 99.06) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A483D)) 353 | (segment (start 134.62 100.33) (end 133.35 99.06) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4837)) 354 | (segment (start 134.62 116.84) (end 134.62 100.33) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4832)) 355 | (segment (start 132.08 119.38) (end 134.62 116.84) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A482E)) 356 | (segment (start 130.81 119.38) (end 132.08 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A482B)) 357 | (segment (start 124.46 119.38) (end 130.81 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4827)) 358 | (segment (start 119.38 114.3) (end 124.46 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4825)) 359 | 360 | ) 361 | -------------------------------------------------------------------------------- /kicad/MeetingRoomDisplayConnector.kicad_pcb-bak: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host pcbnew 4.0.5) 2 | 3 | (general 4 | (links 14) 5 | (no_connects 0) 6 | (area 110.414999 82.474999 160.730001 125.2474) 7 | (thickness 1.6) 8 | (drawings 6) 9 | (tracks 60) 10 | (zones 0) 11 | (modules 2) 12 | (nets 17) 13 | ) 14 | 15 | (page A4) 16 | (layers 17 | (0 F.Cu signal) 18 | (31 B.Cu signal) 19 | (32 B.Adhes user) 20 | (33 F.Adhes user) 21 | (34 B.Paste user) 22 | (35 F.Paste user) 23 | (36 B.SilkS user) 24 | (37 F.SilkS user) 25 | (38 B.Mask user) 26 | (39 F.Mask user) 27 | (40 Dwgs.User user) 28 | (41 Cmts.User user) 29 | (42 Eco1.User user) 30 | (43 Eco2.User user) 31 | (44 Edge.Cuts user) 32 | (45 Margin user) 33 | (46 B.CrtYd user) 34 | (47 F.CrtYd user) 35 | (48 B.Fab user) 36 | (49 F.Fab user) 37 | ) 38 | 39 | (setup 40 | (last_trace_width 0.762) 41 | (trace_clearance 0.1524) 42 | (zone_clearance 0.508) 43 | (zone_45_only no) 44 | (trace_min 0.1524) 45 | (segment_width 0.2) 46 | (edge_width 0.15) 47 | (via_size 0.6858) 48 | (via_drill 0.3302) 49 | (via_min_size 0.6858) 50 | (via_min_drill 0.3302) 51 | (uvia_size 0.762) 52 | (uvia_drill 0.1) 53 | (uvias_allowed no) 54 | (uvia_min_size 0) 55 | (uvia_min_drill 0) 56 | (pcb_text_width 0.3) 57 | (pcb_text_size 1.5 1.5) 58 | (mod_edge_width 0.15) 59 | (mod_text_size 1 1) 60 | (mod_text_width 0.15) 61 | (pad_size 1.524 1.524) 62 | (pad_drill 0.762) 63 | (pad_to_mask_clearance 0.2) 64 | (aux_axis_origin 0 0) 65 | (visible_elements FFFFFF7F) 66 | (pcbplotparams 67 | (layerselection 0x010f0_80000001) 68 | (usegerberextensions false) 69 | (excludeedgelayer true) 70 | (linewidth 0.100000) 71 | (plotframeref false) 72 | (viasonmask false) 73 | (mode 1) 74 | (useauxorigin false) 75 | (hpglpennumber 1) 76 | (hpglpenspeed 20) 77 | (hpglpendiameter 15) 78 | (hpglpenoverlay 2) 79 | (psnegative false) 80 | (psa4output false) 81 | (plotreference true) 82 | (plotvalue false) 83 | (plotinvisibletext false) 84 | (padsonsilk false) 85 | (subtractmaskfromsilk true) 86 | (outputformat 1) 87 | (mirror false) 88 | (drillshape 0) 89 | (scaleselection 1) 90 | (outputdirectory GERBERS)) 91 | ) 92 | 93 | (net 0 "") 94 | (net 1 "Net-(U1-Pad8)") 95 | (net 2 "Net-(U1-Pad7)") 96 | (net 3 "Net-(U1-Pad6)") 97 | (net 4 "Net-(U1-Pad5)") 98 | (net 5 "Net-(U1-Pad4)") 99 | (net 6 "Net-(U1-Pad3)") 100 | (net 7 GND) 101 | (net 8 "Net-(U1-Pad1)") 102 | (net 9 /VCC) 103 | (net 10 "Net-(U1-Pad15)") 104 | (net 11 "Net-(U1-Pad14)") 105 | (net 12 "Net-(U1-Pad13)") 106 | (net 13 "Net-(U1-Pad12)") 107 | (net 14 "Net-(U1-Pad11)") 108 | (net 15 "Net-(U1-Pad10)") 109 | (net 16 "Net-(U1-Pad9)") 110 | 111 | (net_class Default "This is the default net class." 112 | (clearance 0.1524) 113 | (trace_width 0.762) 114 | (via_dia 0.6858) 115 | (via_drill 0.3302) 116 | (uvia_dia 0.762) 117 | (uvia_drill 0.1) 118 | (add_net /VCC) 119 | (add_net GND) 120 | (add_net "Net-(U1-Pad1)") 121 | (add_net "Net-(U1-Pad10)") 122 | (add_net "Net-(U1-Pad11)") 123 | (add_net "Net-(U1-Pad12)") 124 | (add_net "Net-(U1-Pad13)") 125 | (add_net "Net-(U1-Pad14)") 126 | (add_net "Net-(U1-Pad15)") 127 | (add_net "Net-(U1-Pad3)") 128 | (add_net "Net-(U1-Pad4)") 129 | (add_net "Net-(U1-Pad5)") 130 | (add_net "Net-(U1-Pad6)") 131 | (add_net "Net-(U1-Pad7)") 132 | (add_net "Net-(U1-Pad8)") 133 | (add_net "Net-(U1-Pad9)") 134 | ) 135 | 136 | (module Pin_Headers:Pin_Header_Straight_1x14 (layer F.Cu) (tedit 586A49D4) (tstamp 5846E1EC) 137 | (at 115.57 88.9) 138 | (descr "Through hole pin header") 139 | (tags "pin header") 140 | (path /5846DFFC) 141 | (fp_text reference U2 (at -2.54 0) (layer F.SilkS) 142 | (effects (font (size 1 1) (thickness 0.15))) 143 | ) 144 | (fp_text value ILI9341_24_Touch (at -2.54 9.525 90) (layer F.Fab) 145 | (effects (font (size 1 1) (thickness 0.15))) 146 | ) 147 | (fp_line (start -1.75 -1.75) (end -1.75 34.8) (layer F.CrtYd) (width 0.05)) 148 | (fp_line (start 1.75 -1.75) (end 1.75 34.8) (layer F.CrtYd) (width 0.05)) 149 | (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) 150 | (fp_line (start -1.75 34.8) (end 1.75 34.8) (layer F.CrtYd) (width 0.05)) 151 | (fp_line (start -1.27 1.27) (end -1.27 34.29) (layer F.SilkS) (width 0.15)) 152 | (fp_line (start -1.27 34.29) (end 1.27 34.29) (layer F.SilkS) (width 0.15)) 153 | (fp_line (start 1.27 34.29) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) 154 | (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) 155 | (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) 156 | (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) 157 | (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) 158 | (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 159 | (net 6 "Net-(U1-Pad3)")) 160 | (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 161 | (net 12 "Net-(U1-Pad13)")) 162 | (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 163 | (net 11 "Net-(U1-Pad14)")) 164 | (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 165 | (net 5 "Net-(U1-Pad4)")) 166 | (pad 5 thru_hole oval (at 0 10.16) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 167 | (net 13 "Net-(U1-Pad12)")) 168 | (pad 6 thru_hole oval (at 0 12.7) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 169 | (net 12 "Net-(U1-Pad13)")) 170 | (pad 7 thru_hole oval (at 0 15.24) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 171 | (net 10 "Net-(U1-Pad15)")) 172 | (pad 8 thru_hole oval (at 0 17.78) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 173 | (net 13 "Net-(U1-Pad12)")) 174 | (pad 9 thru_hole oval (at 0 20.32) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 175 | (net 11 "Net-(U1-Pad14)")) 176 | (pad 10 thru_hole oval (at 0 22.86) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 177 | (net 4 "Net-(U1-Pad5)")) 178 | (pad 11 thru_hole oval (at 0 25.4) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 179 | (net 16 "Net-(U1-Pad9)")) 180 | (pad 12 thru_hole oval (at 0 27.94) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 181 | (net 3 "Net-(U1-Pad6)")) 182 | (pad 13 thru_hole oval (at 0 30.48) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 183 | (net 7 GND)) 184 | (pad 14 thru_hole oval (at 0 33.02) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask) 185 | (net 9 /VCC)) 186 | (model Pin_Headers.3dshapes/Pin_Header_Straight_1x14.wrl 187 | (at (xyz 0 -0.65 0)) 188 | (scale (xyz 1 1 1)) 189 | (rotate (xyz 0 0 90)) 190 | ) 191 | ) 192 | 193 | (module WemosD1Mini:D1_mini_board (layer B.Cu) (tedit 586A42E4) (tstamp 5846E1DA) 194 | (at 142.24 109.22 180) 195 | (path /5846DA55) 196 | (fp_text reference U1 (at 1.27 -18.81 180) (layer F.SilkS) 197 | (effects (font (size 1 1) (thickness 0.15))) 198 | ) 199 | (fp_text value WeMos_mini (at 1.27 12.065 180) (layer F.Fab) 200 | (effects (font (size 1 1) (thickness 0.15))) 201 | ) 202 | (fp_text user WeMos (at 0 15.24 180) (layer F.SilkS) 203 | (effects (font (size 3 3) (thickness 0.15))) 204 | ) 205 | (fp_line (start -6.35 -3.81) (end -6.35 10.16) (layer F.SilkS) (width 0.15)) 206 | (fp_line (start -6.35 10.16) (end 6.35 10.16) (layer F.SilkS) (width 0.15)) 207 | (fp_line (start 6.35 10.16) (end 6.35 -3.81) (layer F.SilkS) (width 0.15)) 208 | (fp_line (start 6.35 -3.81) (end -6.35 -3.81) (layer F.SilkS) (width 0.15)) 209 | (fp_line (start -8.89 -5.08) (end 8.89 -5.08) (layer F.SilkS) (width 0.15)) 210 | (fp_line (start 8.89 -5.08) (end 8.89 17.78) (layer F.SilkS) (width 0.15)) 211 | (fp_line (start 8.89 17.78) (end -8.89 17.78) (layer F.SilkS) (width 0.15)) 212 | (fp_line (start -8.89 17.78) (end -8.89 -5.08) (layer F.SilkS) (width 0.15)) 213 | (fp_line (start 10.817472 -16.277228) (end 5.00618 -16.277228) (layer F.SilkS) (width 0.1)) 214 | (fp_line (start 5.00618 -16.277228) (end 4.979849 -14.993795) (layer F.SilkS) (width 0.1)) 215 | (fp_line (start 4.979849 -14.993795) (end -3.851373 -15.000483) (layer F.SilkS) (width 0.1)) 216 | (fp_line (start -3.851373 -15.000483) (end -3.849397 -16.202736) (layer F.SilkS) (width 0.1)) 217 | (fp_line (start -3.849397 -16.202736) (end -12.930193 -16.176658) (layer F.SilkS) (width 0.1)) 218 | (fp_line (start -12.930193 -16.176658) (end -12.916195 14.993493) (layer F.SilkS) (width 0.1)) 219 | (fp_line (start -12.916195 14.993493) (end -12.683384 15.596286) (layer F.SilkS) (width 0.1)) 220 | (fp_line (start -12.683384 15.596286) (end -12.399901 16.141167) (layer F.SilkS) (width 0.1)) 221 | (fp_line (start -12.399901 16.141167) (end -12.065253 16.627577) (layer F.SilkS) (width 0.1)) 222 | (fp_line (start -12.065253 16.627577) (end -11.678953 17.054952) (layer F.SilkS) (width 0.1)) 223 | (fp_line (start -11.678953 17.054952) (end -11.240512 17.422741) (layer F.SilkS) (width 0.1)) 224 | (fp_line (start -11.240512 17.422741) (end -10.74944 17.730377) (layer F.SilkS) (width 0.1)) 225 | (fp_line (start -10.74944 17.730377) (end -10.20525 17.97731) (layer F.SilkS) (width 0.1)) 226 | (fp_line (start -10.20525 17.97731) (end -9.607453 18.162976) (layer F.SilkS) (width 0.1)) 227 | (fp_line (start -9.607453 18.162976) (end 9.43046 18.191734) (layer F.SilkS) (width 0.1)) 228 | (fp_line (start 9.43046 18.191734) (end 10.049824 17.957741) (layer F.SilkS) (width 0.1)) 229 | (fp_line (start 10.049824 17.957741) (end 10.638018 17.673258) (layer F.SilkS) (width 0.1)) 230 | (fp_line (start 10.638018 17.673258) (end 11.181445 17.323743) (layer F.SilkS) (width 0.1)) 231 | (fp_line (start 11.181445 17.323743) (end 11.666503 16.894658) (layer F.SilkS) (width 0.1)) 232 | (fp_line (start 11.666503 16.894658) (end 12.079595 16.37146) (layer F.SilkS) (width 0.1)) 233 | (fp_line (start 12.079595 16.37146) (end 12.407122 15.739613) (layer F.SilkS) (width 0.1)) 234 | (fp_line (start 12.407122 15.739613) (end 12.635482 14.984575) (layer F.SilkS) (width 0.1)) 235 | (fp_line (start 12.635482 14.984575) (end 12.751078 14.091807) (layer F.SilkS) (width 0.1)) 236 | (fp_line (start 12.751078 14.091807) (end 12.776026 -8.463285) (layer F.SilkS) (width 0.1)) 237 | (fp_line (start 12.776026 -8.463285) (end 10.83248 -9.424181) (layer F.SilkS) (width 0.1)) 238 | (fp_line (start 10.83248 -9.424181) (end 10.802686 -16.232524) (layer F.SilkS) (width 0.1)) 239 | (fp_line (start -3.17965 -10.051451) (end 3.959931 -10.051451) (layer F.SilkS) (width 0.1)) 240 | (fp_line (start 3.959931 -10.051451) (end 3.959931 -15.865188) (layer F.SilkS) (width 0.1)) 241 | (fp_line (start 3.959931 -15.865188) (end -3.17965 -15.865188) (layer F.SilkS) (width 0.1)) 242 | (fp_line (start -3.17965 -15.865188) (end -3.17965 -10.051451) (layer F.SilkS) (width 0.1)) 243 | (fp_line (start 10.7436 -9.402349) (end 9.191378 -9.402349) (layer F.SilkS) (width 0.1)) 244 | (fp_line (start 9.191378 -9.402349) (end 8.662211 -9.931515) (layer F.SilkS) (width 0.1)) 245 | (fp_line (start 8.662211 -9.931515) (end 7.40985 -9.931515) (layer F.SilkS) (width 0.1)) 246 | (fp_line (start 7.40985 -9.931515) (end 7.40985 -14.993876) (layer F.SilkS) (width 0.1)) 247 | (fp_line (start 7.40985 -14.993876) (end 8.697489 -14.993876) (layer F.SilkS) (width 0.1)) 248 | (fp_line (start 8.697489 -14.993876) (end 9.226656 -15.487765) (layer F.SilkS) (width 0.1)) 249 | (fp_line (start 9.226656 -15.487765) (end 10.796517 -15.487765) (layer F.SilkS) (width 0.1)) 250 | (fp_line (start 10.796517 -15.487765) (end 10.7436 -9.402349) (layer F.SilkS) (width 0.1)) 251 | (fp_line (start 10.778878 -11.483738) (end 11.431517 -11.483738) (layer F.SilkS) (width 0.1)) 252 | (fp_line (start 11.431517 -11.483738) (end 11.431517 -13.476932) (layer F.SilkS) (width 0.1)) 253 | (fp_line (start 11.431517 -13.476932) (end 10.814156 -13.476932) (layer F.SilkS) (width 0.1)) 254 | (pad 8 thru_hole circle (at -11.43 10.16 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 255 | (net 1 "Net-(U1-Pad8)")) 256 | (pad 7 thru_hole circle (at -11.43 7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 257 | (net 2 "Net-(U1-Pad7)")) 258 | (pad 6 thru_hole circle (at -11.43 5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 259 | (net 3 "Net-(U1-Pad6)")) 260 | (pad 5 thru_hole circle (at -11.43 2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 261 | (net 4 "Net-(U1-Pad5)")) 262 | (pad 4 thru_hole circle (at -11.43 0 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 263 | (net 5 "Net-(U1-Pad4)")) 264 | (pad 3 thru_hole circle (at -11.43 -2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 265 | (net 6 "Net-(U1-Pad3)")) 266 | (pad 2 thru_hole circle (at -11.43 -5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 267 | (net 7 GND)) 268 | (pad 1 thru_hole circle (at -11.43 -7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 269 | (net 8 "Net-(U1-Pad1)")) 270 | (pad 16 thru_hole circle (at 11.43 -7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 271 | (net 9 /VCC)) 272 | (pad 15 thru_hole circle (at 11.43 -5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 273 | (net 10 "Net-(U1-Pad15)")) 274 | (pad 14 thru_hole circle (at 11.43 -2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 275 | (net 11 "Net-(U1-Pad14)")) 276 | (pad 13 thru_hole circle (at 11.43 0 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 277 | (net 12 "Net-(U1-Pad13)")) 278 | (pad 12 thru_hole circle (at 11.43 2.54 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 279 | (net 13 "Net-(U1-Pad12)")) 280 | (pad 11 thru_hole circle (at 11.43 5.08 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 281 | (net 14 "Net-(U1-Pad11)")) 282 | (pad 10 thru_hole circle (at 11.43 7.62 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 283 | (net 15 "Net-(U1-Pad10)")) 284 | (pad 9 thru_hole circle (at 11.43 10.16 180) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask B.SilkS) 285 | (net 16 "Net-(U1-Pad9)")) 286 | ) 287 | 288 | (gr_text "ILI9341 Touch" (at 118.11 109.22 90) (layer F.SilkS) 289 | (effects (font (size 1.5 1.5) (thickness 0.3))) 290 | ) 291 | (gr_line (start 110.49 82.55) (end 160.655 82.55) (angle 90) (layer Edge.Cuts) (width 0.15)) 292 | (gr_text "ILI9341 XPT2046 WiFi Touch Screen\nby blog.squix.org - 02-JAN-2017" (at 134.62 85.09) (layer F.SilkS) 293 | (effects (font (size 1.5 1.5) (thickness 0.3))) 294 | ) 295 | (gr_line (start 160.655 125.095) (end 160.655 82.55) (angle 90) (layer Edge.Cuts) (width 0.15)) 296 | (gr_line (start 110.49 125.095) (end 160.655 125.095) (angle 90) (layer Edge.Cuts) (width 0.15)) 297 | (gr_line (start 110.49 82.55) (end 110.49 125.095) (angle 90) (layer Edge.Cuts) (width 0.15)) 298 | 299 | (segment (start 115.57 116.84) (end 118.11 116.84) (width 0.762) (layer B.Cu) (net 3)) 300 | (segment (start 154.94 104.14) (end 153.67 104.14) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A47A2)) 301 | (segment (start 156.21 105.41) (end 154.94 104.14) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A479E)) 302 | (segment (start 156.21 118.11) (end 156.21 105.41) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A479C)) 303 | (segment (start 153.67 120.65) (end 156.21 118.11) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A478F)) 304 | (segment (start 121.92 120.65) (end 153.67 120.65) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A478D)) 305 | (segment (start 118.11 116.84) (end 121.92 120.65) (width 0.762) (layer B.Cu) (net 3) (tstamp 586A4784)) 306 | (segment (start 115.57 111.76) (end 113.03 111.76) (width 0.762) (layer F.Cu) (net 4)) 307 | (segment (start 132.08 85.09) (end 153.67 106.68) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48D3)) 308 | (segment (start 114.3 85.09) (end 132.08 85.09) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48CB)) 309 | (segment (start 111.76 87.63) (end 114.3 85.09) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48CA)) 310 | (segment (start 111.76 110.49) (end 111.76 87.63) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48C4)) 311 | (segment (start 113.03 111.76) (end 111.76 110.49) (width 0.762) (layer F.Cu) (net 4) (tstamp 586A48C2)) 312 | (segment (start 115.57 96.52) (end 140.97 96.52) (width 0.762) (layer F.Cu) (net 5)) 313 | (segment (start 140.97 96.52) (end 153.67 109.22) (width 0.762) (layer F.Cu) (net 5) (tstamp 586A486B)) 314 | (segment (start 153.67 111.76) (end 151.13 111.76) (width 0.762) (layer B.Cu) (net 6)) 315 | (segment (start 128.27 88.9) (end 115.57 88.9) (width 0.762) (layer B.Cu) (net 6) (tstamp 586A47CA)) 316 | (segment (start 151.13 111.76) (end 128.27 88.9) (width 0.762) (layer B.Cu) (net 6) (tstamp 586A47C5)) 317 | (segment (start 115.57 119.38) (end 113.03 119.38) (width 0.762) (layer F.Cu) (net 7)) 318 | (segment (start 149.86 114.3) (end 153.67 114.3) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4743)) 319 | (segment (start 148.59 115.57) (end 149.86 114.3) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A473F)) 320 | (segment (start 139.7 124.46) (end 148.59 115.57) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4738)) 321 | (segment (start 113.03 124.46) (end 139.7 124.46) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4733)) 322 | (segment (start 111.76 123.19) (end 113.03 124.46) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4732)) 323 | (segment (start 111.76 120.65) (end 111.76 123.19) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A4730)) 324 | (segment (start 113.03 119.38) (end 111.76 120.65) (width 0.762) (layer F.Cu) (net 7) (tstamp 586A472D)) 325 | (segment (start 115.57 121.92) (end 125.73 121.92) (width 0.762) (layer F.Cu) (net 9)) 326 | (segment (start 125.73 121.92) (end 130.81 116.84) (width 0.762) (layer F.Cu) (net 9) (tstamp 586A4717)) 327 | (segment (start 115.57 104.14) (end 119.38 104.14) (width 0.762) (layer B.Cu) (net 10)) 328 | (segment (start 129.54 114.3) (end 130.81 114.3) (width 0.762) (layer B.Cu) (net 10) (tstamp 586A484C)) 329 | (segment (start 119.38 104.14) (end 129.54 114.3) (width 0.762) (layer B.Cu) (net 10) (tstamp 586A4849)) 330 | (segment (start 115.57 109.22) (end 114.3 109.22) (width 0.762) (layer F.Cu) (net 11)) 331 | (segment (start 114.3 93.98) (end 115.57 93.98) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48BE)) 332 | (segment (start 113.03 95.25) (end 114.3 93.98) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48BC)) 333 | (segment (start 113.03 107.95) (end 113.03 95.25) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48B8)) 334 | (segment (start 114.3 109.22) (end 113.03 107.95) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A48B6)) 335 | (segment (start 115.57 109.22) (end 124.46 109.22) (width 0.762) (layer F.Cu) (net 11)) 336 | (segment (start 127 111.76) (end 130.81 111.76) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A4886)) 337 | (segment (start 124.46 109.22) (end 127 111.76) (width 0.762) (layer F.Cu) (net 11) (tstamp 586A4882)) 338 | (segment (start 115.57 101.6) (end 120.65 101.6) (width 0.762) (layer B.Cu) (net 12)) 339 | (segment (start 120.65 101.6) (end 128.27 109.22) (width 0.762) (layer B.Cu) (net 12) (tstamp 586A47E9)) 340 | (segment (start 128.27 109.22) (end 130.81 109.22) (width 0.762) (layer B.Cu) (net 12) (tstamp 586A47F2)) 341 | (segment (start 115.57 91.44) (end 120.65 91.44) (width 0.762) (layer B.Cu) (net 12)) 342 | (segment (start 120.65 91.44) (end 120.65 101.6) (width 0.762) (layer B.Cu) (net 12) (tstamp 5847110C)) 343 | (segment (start 126.0475 102.5525) (end 126.0475 103.1875) (width 0.762) (layer F.Cu) (net 13)) 344 | (segment (start 129.54 106.68) (end 130.81 106.68) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A480A)) 345 | (segment (start 126.0475 103.1875) (end 129.54 106.68) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A4802)) 346 | (segment (start 126.365 102.87) (end 126.0475 102.5525) (width 0.762) (layer F.Cu) (net 13)) 347 | (segment (start 126.0475 102.5525) (end 122.555 99.06) (width 0.762) (layer F.Cu) (net 13) (tstamp 586A4800)) 348 | (segment (start 122.555 99.06) (end 115.57 99.06) (width 0.762) (layer F.Cu) (net 13) (tstamp 58470FA8)) 349 | (segment (start 115.57 106.68) (end 122.555 106.68) (width 0.762) (layer F.Cu) (net 13)) 350 | (segment (start 122.555 106.68) (end 126.365 102.87) (width 0.762) (layer F.Cu) (net 13) (tstamp 58470F9C)) 351 | (segment (start 115.57 114.3) (end 119.38 114.3) (width 0.762) (layer B.Cu) (net 16)) 352 | (segment (start 133.35 99.06) (end 130.81 99.06) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A483D)) 353 | (segment (start 134.62 100.33) (end 133.35 99.06) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4837)) 354 | (segment (start 134.62 116.84) (end 134.62 100.33) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4832)) 355 | (segment (start 132.08 119.38) (end 134.62 116.84) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A482E)) 356 | (segment (start 130.81 119.38) (end 132.08 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A482B)) 357 | (segment (start 124.46 119.38) (end 130.81 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4827)) 358 | (segment (start 119.38 114.3) (end 124.46 119.38) (width 0.762) (layer B.Cu) (net 16) (tstamp 586A4825)) 359 | 360 | ) 361 | -------------------------------------------------------------------------------- /ILI9341.cpp: -------------------------------------------------------------------------------- 1 | /*************************************************** 2 | This is our library for the Adafruit ILI9341 Breakout and Shield 3 | ----> http://www.adafruit.com/products/1651 4 | 5 | Check out the links above for our tutorials and wiring diagrams 6 | These displays use SPI to communicate, 4 or 5 pins are required to 7 | interface (RST is optional) 8 | Adafruit invests time and resources providing this open source code, 9 | please support Adafruit and open-source hardware by purchasing 10 | products from Adafruit! 11 | 12 | Written by Limor Fried/Ladyada for Adafruit Industries. 13 | MIT license, all text above must be included in any redistribution 14 | 15 | Modified 09 May 2015 by Markus Sattler - rewrite the code add ESP8266 support and many optimizations now 220% fastet (320% total) 16 | ****************************************************/ 17 | 18 | #include "ILI9341.h" 19 | #ifdef ESP8266 20 | #include 21 | #else 22 | #include 23 | #endif 24 | #include 25 | #include "pins_arduino.h" 26 | #include "wiring_private.h" 27 | #include 28 | 29 | #ifdef ESP8266 30 | #define hwSPI true 31 | #endif 32 | 33 | #define writeCmdDataTmp(cmd, ...) { \ 34 | const uint8_t tmp##cmd##_[] = { __VA_ARGS__ }; \ 35 | writeCmdData(cmd, (uint8_t *) &tmp##cmd##_[0], sizeof(tmp##cmd##_)); \ 36 | } 37 | 38 | 39 | #ifndef ESP8266 40 | // Constructor when using software SPI. All output pins are configurable. 41 | Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi, 42 | int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { 43 | _cs = cs; 44 | _dc = dc; 45 | _mosi = mosi; 46 | _miso = miso; 47 | _sclk = sclk; 48 | _rst = rst; 49 | hwSPI = false; 50 | } 51 | #endif 52 | 53 | // Constructor when using hardware SPI. Faster, but must use SPI pins 54 | // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.) 55 | #if defined(ILI9341_USE_HW_CS) || defined(ILI9341_USE_NO_CS) 56 | Adafruit_ILI9341::Adafruit_ILI9341(int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { 57 | _dc = dc; 58 | _rst = rst; 59 | hwSPI = true; 60 | #ifdef ESP8266 61 | _dcMask = digitalPinToBitMask(_dc); 62 | _rstMask = digitalPinToBitMask(_rst); 63 | #else 64 | _mosi = _sclk = 0; 65 | #endif 66 | } 67 | #else 68 | Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { 69 | _cs = cs; 70 | _dc = dc; 71 | _rst = rst; 72 | #ifdef ESP8266 73 | _csMask = digitalPinToBitMask(_cs); 74 | _dcMask = digitalPinToBitMask(_dc); 75 | _rstMask = digitalPinToBitMask(_rst); 76 | #else 77 | hwSPI = true; 78 | _mosi = _sclk = 0; 79 | #endif 80 | } 81 | #endif 82 | 83 | 84 | #ifdef ESP8266 85 | void Adafruit_ILI9341::spiwrite16(uint16_t c) { 86 | SPI.write16(c, true); 87 | } 88 | #endif 89 | 90 | void Adafruit_ILI9341::spiwrite(uint8_t c) { 91 | 92 | //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", "); 93 | #ifndef ESP8266 94 | if (hwSPI) { 95 | #endif 96 | #if defined (__AVR__) 97 | uint8_t backupSPCR = SPCR; 98 | SPCR = mySPCR; 99 | SPDR = c; 100 | while(!(SPSR & _BV(SPIF))); 101 | SPCR = backupSPCR; 102 | #elif defined(TEENSYDUINO) || defined(ESP8266) 103 | SPI.write(c); 104 | #elif defined (__arm__) 105 | SPI.setClockDivider(11); // 8-ish MHz (full! speed!) 106 | SPI.setBitOrder(MSBFIRST); 107 | SPI.setDataMode(SPI_MODE0); 108 | SPI.transfer(c); 109 | #endif 110 | #ifndef ESP8266 111 | } else { 112 | // Fast SPI bitbang swiped from LPD8806 library 113 | for(uint8_t bit = 0x80; bit; bit >>= 1) { 114 | if(c & bit) { 115 | //digitalWrite(_mosi, HIGH); 116 | *mosiport |= mosipinmask; 117 | } else { 118 | //digitalWrite(_mosi, LOW); 119 | *mosiport &= ~mosipinmask; 120 | } 121 | //digitalWrite(_sclk, HIGH); 122 | *clkport |= clkpinmask; 123 | //digitalWrite(_sclk, LOW); 124 | *clkport &= ~clkpinmask; 125 | } 126 | } 127 | #endif 128 | } 129 | 130 | void Adafruit_ILI9341::spiwriteBytes(uint8_t * data, uint32_t size) { 131 | #ifdef ESP8266 132 | SPI.writeBytes(data, size); 133 | #else 134 | while(size--) { 135 | spiwrite(*data); 136 | data++; 137 | } 138 | #endif 139 | } 140 | 141 | void Adafruit_ILI9341::spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat) { 142 | #ifdef ESP8266 143 | SPI.writePattern(data, size, repeat); 144 | #else 145 | uint8_t * ptr; 146 | uint8_t i; 147 | while(repeat--) { 148 | ptr = data; 149 | i = size; 150 | while(i--) { 151 | spiwrite(*ptr); 152 | ptr++; 153 | } 154 | } 155 | #endif 156 | } 157 | 158 | 159 | inline void Adafruit_ILI9341::spiCsLow(void) { 160 | #ifdef ILI9341_USE_DIGITAL_WRITE 161 | digitalWrite(_cs, LOW); 162 | #else 163 | #ifdef ESP8266 164 | #if !defined(ILI9341_USE_HW_CS) && !defined(ILI9341_USE_NO_CS) 165 | GPOC = _csMask; 166 | #endif 167 | #else 168 | *csport &= ~cspinmask; 169 | #endif 170 | #endif 171 | } 172 | 173 | inline void Adafruit_ILI9341::spiCsHigh(void) { 174 | #ifdef ILI9341_USE_DIGITAL_WRITE 175 | digitalWrite(_cs, HIGH); 176 | #else 177 | #ifdef ESP8266 178 | #if !defined(ILI9341_USE_HW_CS) && !defined(ILI9341_USE_NO_CS) 179 | GPOS = _csMask; 180 | #endif 181 | #else 182 | *csport |= cspinmask; 183 | #endif 184 | #endif 185 | } 186 | 187 | inline void Adafruit_ILI9341::spiDcLow(void){ 188 | #ifdef ILI9341_USE_DIGITAL_WRITE 189 | digitalWrite(_dc, LOW); 190 | #else 191 | #ifdef ESP8266 192 | #ifndef USE_HW_CS 193 | GPOC = _dcMask; 194 | #endif 195 | #else 196 | *dcport &= ~dcpinmask; 197 | #endif 198 | #endif 199 | } 200 | 201 | inline void Adafruit_ILI9341::spiDcHigh(void) { 202 | #ifdef ILI9341_USE_DIGITAL_WRITE 203 | digitalWrite(_dc, HIGH); 204 | #else 205 | #ifdef ESP8266 206 | GPOS = _dcMask; 207 | #else 208 | *dcport |= dcpinmask; 209 | #endif 210 | #endif 211 | } 212 | 213 | void Adafruit_ILI9341::writecommand(uint8_t c) { 214 | spiDcLow(); 215 | spiCsLow(); 216 | 217 | spiwrite(c); 218 | 219 | spiCsHigh(); 220 | } 221 | 222 | void Adafruit_ILI9341::writedata(uint8_t c) { 223 | spiDcHigh(); 224 | spiCsLow(); 225 | 226 | spiwrite(c); 227 | 228 | spiCsHigh(); 229 | } 230 | 231 | void Adafruit_ILI9341::writedata(uint8_t * data, uint8_t size) { 232 | spiDcHigh(); 233 | spiCsLow(); 234 | 235 | spiwriteBytes(data, size); 236 | 237 | spiCsHigh(); 238 | } 239 | 240 | void Adafruit_ILI9341::writeCmdData(uint8_t cmd, uint8_t * data, uint8_t size) { 241 | spiDcLow(); 242 | spiCsLow(); 243 | 244 | spiwrite(cmd); 245 | 246 | spiDcHigh(); 247 | 248 | spiwriteBytes(data, size); 249 | 250 | spiCsHigh(); 251 | } 252 | 253 | uint16_t Adafruit_ILI9341::getHeight(void) { 254 | return _height; 255 | } 256 | 257 | uint16_t Adafruit_ILI9341::getWidth(void){ 258 | return _width; 259 | } 260 | 261 | // If the SPI library has transaction support, these functions 262 | // establish settings and protect from interference from other 263 | // libraries. Otherwise, they simply do nothing. 264 | #ifdef SPI_HAS_TRANSACTION 265 | #ifndef ILI9341_SPEED 266 | #ifdef ESP8266 267 | SPISettings spiSettings = SPISettings(ESP8266_CLOCK, MSBFIRST, SPI_MODE0); 268 | #else 269 | SPISettings spiSettings = SPISettings(8000000, MSBFIRST, SPI_MODE0); 270 | #endif 271 | #else 272 | SPISettings spiSettings = SPISettings(ILI9341_SPEED, MSBFIRST, SPI_MODE0); 273 | #endif 274 | static inline void spi_begin(void) __attribute__((always_inline)); 275 | static inline void spi_begin(void) { 276 | SPI.beginTransaction(spiSettings); 277 | } 278 | static inline void spi_end(void) __attribute__((always_inline)); 279 | static inline void spi_end(void) { 280 | SPI.endTransaction(); 281 | } 282 | #else 283 | #define spi_begin() 284 | #define spi_end() 285 | #endif 286 | 287 | // Rather than a bazillion writecommand() and writedata() calls, screen 288 | // initialization commands and arguments are organized in these tables 289 | // stored in PROGMEM. The table may look bulky, but that's mostly the 290 | // formatting -- storage-wise this is hundreds of bytes more compact 291 | // than the equivalent code. Companion function follows. 292 | #define DELAY 0x80 293 | 294 | 295 | // Companion code to the above tables. Reads and issues 296 | // a series of LCD commands stored in PROGMEM byte array. 297 | void Adafruit_ILI9341::commandList(uint8_t *addr) { 298 | 299 | uint8_t numCommands, numArgs; 300 | uint16_t ms; 301 | 302 | numCommands = pgm_read_byte(addr++); // Number of commands to follow 303 | while(numCommands--) { // For each command... 304 | writecommand(pgm_read_byte(addr++)); // Read, issue command 305 | numArgs = pgm_read_byte(addr++); // Number of args to follow 306 | ms = numArgs & DELAY; // If hibit set, delay follows args 307 | numArgs &= ~DELAY; // Mask out delay bit 308 | while(numArgs--) { // For each argument... 309 | writedata(pgm_read_byte(addr++)); // Read, issue argument 310 | } 311 | 312 | if(ms) { 313 | ms = pgm_read_byte(addr++); // Read post-command delay time (ms) 314 | if(ms == 255) ms = 500; // If 255, delay for 500 ms 315 | delay(ms); 316 | } 317 | } 318 | } 319 | 320 | 321 | void Adafruit_ILI9341::begin(void) { 322 | if (_rst > NOT_A_PIN) { 323 | pinMode(_rst, OUTPUT); 324 | digitalWrite(_rst, LOW); 325 | } 326 | 327 | pinMode(_dc, OUTPUT); 328 | #ifndef USE_HW_CS 329 | pinMode(_cs, OUTPUT); 330 | #endif 331 | #ifndef ESP8266 332 | #ifndef ILI9341_USE_DIGITAL_WRITE 333 | csport = portOutputRegister(digitalPinToPort(_cs)); 334 | cspinmask = digitalPinToBitMask(_cs); 335 | dcport = portOutputRegister(digitalPinToPort(_dc)); 336 | dcpinmask = digitalPinToBitMask(_dc); 337 | #endif 338 | if(hwSPI) { // Using hardware SPI 339 | #endif 340 | #if defined (__AVR__) 341 | SPI.begin(); 342 | SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) 343 | SPI.setBitOrder(MSBFIRST); 344 | SPI.setDataMode(SPI_MODE0); 345 | mySPCR = SPCR; 346 | #elif defined(TEENSYDUINO) 347 | SPI.begin(); 348 | SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) 349 | SPI.setBitOrder(MSBFIRST); 350 | SPI.setDataMode(SPI_MODE0); 351 | #elif defined (__arm__) 352 | SPI.begin(); 353 | SPI.setClockDivider(11); // 8-ish MHz (full! speed!) 354 | SPI.setBitOrder(MSBFIRST); 355 | SPI.setDataMode(SPI_MODE0); 356 | #elif defined (ESP8266) 357 | SPI.begin(); 358 | #ifdef USE_HW_CS 359 | SPI.setHwCs(true); 360 | #endif 361 | #endif 362 | #ifndef ESP8266 363 | } else { 364 | pinMode(_sclk, OUTPUT); 365 | pinMode(_mosi, OUTPUT); 366 | pinMode(_miso, INPUT); 367 | clkport = portOutputRegister(digitalPinToPort(_sclk)); 368 | clkpinmask = digitalPinToBitMask(_sclk); 369 | mosiport = portOutputRegister(digitalPinToPort(_mosi)); 370 | mosipinmask = digitalPinToBitMask(_mosi); 371 | *clkport &= ~clkpinmask; 372 | *mosiport &= ~mosipinmask; 373 | } 374 | #endif 375 | // toggle RST low to reset 376 | if (_rst > NOT_A_PIN) { 377 | digitalWrite(_rst, HIGH); 378 | delay(5); 379 | digitalWrite(_rst, LOW); 380 | delay(20); 381 | digitalWrite(_rst, HIGH); 382 | delay(150); 383 | } 384 | 385 | /* 386 | uint8_t x = readcommand8(ILI9341_RDMODE); 387 | Serial.print("\nDisplay Power Mode: 0x"); Serial.println(x, HEX); 388 | x = readcommand8(ILI9341_RDMADCTL); 389 | Serial.print("\nMADCTL Mode: 0x"); Serial.println(x, HEX); 390 | x = readcommand8(ILI9341_RDPIXFMT); 391 | Serial.print("\nPixel Format: 0x"); Serial.println(x, HEX); 392 | x = readcommand8(ILI9341_RDIMGFMT); 393 | Serial.print("\nImage Format: 0x"); Serial.println(x, HEX); 394 | x = readcommand8(ILI9341_RDSELFDIAG); 395 | Serial.print("\nSelf Diagnostic: 0x"); Serial.println(x, HEX); 396 | */ 397 | //if(cmdList) commandList(cmdList); 398 | 399 | if (hwSPI) spi_begin(); 400 | 401 | writeCmdDataTmp(0xEF, 0x03, 0x80, 0x02); 402 | writeCmdDataTmp(0xCF, 0x00, 0XC1, 0X30); 403 | writeCmdDataTmp(0xED, 0x64, 0x03, 0X12, 0X81); 404 | writeCmdDataTmp(0xE8, 0x85, 0x00, 0x78); 405 | writeCmdDataTmp(0xCB, 0x39, 0x2C, 0x00, 0x34, 0x02); 406 | writeCmdDataTmp(0xF7, 0x20); 407 | writeCmdDataTmp(0xEA, 0x00, 0x00); 408 | 409 | //Powercontrol 410 | //VRH[5:0] 411 | writeCmdDataTmp(ILI9341_PWCTR1, 0x23); 412 | 413 | //Powercontrol 414 | //SAP[2:0];BT[3:0] 415 | writeCmdDataTmp(ILI9341_PWCTR2, 0x10); 416 | 417 | //VCMcontrol 418 | writeCmdDataTmp(ILI9341_VMCTR1, 0x3e, 0x28); 419 | 420 | //VCMcontrol2 421 | writeCmdDataTmp(ILI9341_VMCTR2, 0x86); 422 | 423 | //MemoryAccessControl 424 | writeCmdDataTmp(ILI9341_MADCTL, 0x48); 425 | 426 | writeCmdDataTmp(ILI9341_PIXFMT, 0x55); 427 | writeCmdDataTmp(ILI9341_FRMCTR1, 0x00, 0x18); 428 | 429 | //DisplayFunctionControl 430 | writeCmdDataTmp(ILI9341_DFUNCTR, 0x08, 0x82, 0x27); 431 | 432 | //3GammaFunctionDisable 433 | writeCmdDataTmp(0xF2, 0x00); 434 | 435 | //Gammacurveselected 436 | writeCmdDataTmp(ILI9341_GAMMASET, 0x01); 437 | 438 | //SetGamma 439 | writeCmdDataTmp(ILI9341_GMCTRP1, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00); 440 | writeCmdDataTmp(ILI9341_GMCTRN1, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F); 441 | 442 | writecommand(ILI9341_SLPOUT); //Exit Sleep 443 | if (hwSPI) spi_end(); 444 | delay(120); 445 | if (hwSPI) spi_begin(); 446 | writecommand(ILI9341_DISPON); //Display on 447 | if (hwSPI) spi_end(); 448 | 449 | } 450 | 451 | 452 | void Adafruit_ILI9341::area_update_start(uint32_t x, uint32_t y, uint32_t w, uint32_t h) { 453 | spiCsLow(); 454 | setAddrWindow_(x, y, x + w - 1, y + h - 1); 455 | } 456 | 457 | void Adafruit_ILI9341::area_update_data(uint8_t *data, uint32_t pixel){ 458 | spiwriteBytes(&data[0], (pixel*2)); 459 | } 460 | 461 | void Adafruit_ILI9341::area_update_end(void){ 462 | spiCsHigh(); 463 | } 464 | 465 | void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { 466 | spiCsLow(); 467 | setAddrWindow_(x0, y0, x1, y1); 468 | spiCsHigh(); 469 | } 470 | 471 | void Adafruit_ILI9341::setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { 472 | 473 | uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 }; 474 | uint8_t buffP[] = { (uint8_t) (y0 >> 8), (uint8_t) y0, (uint8_t) (y1 >> 8), (uint8_t) y1 }; 475 | 476 | spiDcLow(); 477 | spiwrite(ILI9341_CASET); 478 | spiDcHigh(); 479 | spiwriteBytes(&buffC[0], sizeof(buffC)); 480 | 481 | spiDcLow(); 482 | spiwrite(ILI9341_PASET); 483 | spiDcHigh(); 484 | spiwriteBytes(&buffP[0], sizeof(buffP)); 485 | 486 | spiDcLow(); 487 | spiwrite(ILI9341_RAMWR); 488 | spiDcHigh(); 489 | 490 | } 491 | 492 | 493 | void Adafruit_ILI9341::pushColor(uint16_t color) { 494 | if (hwSPI) spi_begin(); 495 | 496 | spiDcHigh(); 497 | spiCsLow(); 498 | 499 | #ifdef ESP8266 500 | spiwrite16(color); 501 | #else 502 | spiwrite(color >> 8); 503 | spiwrite(color); 504 | #endif 505 | 506 | spiCsHigh(); 507 | 508 | if (hwSPI) spi_end(); 509 | } 510 | 511 | void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) { 512 | 513 | if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) { 514 | return; 515 | } 516 | 517 | if(hwSPI) { 518 | spi_begin(); 519 | } 520 | 521 | spiCsLow(); 522 | 523 | setAddrWindow_(x, y, x + 1, y + 1); 524 | 525 | #ifdef ESP8266 526 | spiwrite16(color); 527 | #else 528 | spiwrite(color >> 8); 529 | spiwrite(color); 530 | #endif 531 | 532 | spiCsHigh(); 533 | 534 | if(hwSPI) { 535 | spi_end(); 536 | } 537 | } 538 | 539 | 540 | void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { 541 | 542 | // Rudimentary clipping 543 | if((x >= _width) || (y >= _height)) return; 544 | if((y + h - 1) >= _height) h = _height - y; 545 | 546 | if(hwSPI) { 547 | spi_begin(); 548 | } 549 | 550 | spiCsLow(); 551 | 552 | setAddrWindow_(x, y, x, (y + h - 1)); 553 | 554 | uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; 555 | spiwritePattern(&colorBin[0], 2, h); 556 | 557 | spiCsHigh(); 558 | 559 | if(hwSPI) { 560 | spi_end(); 561 | } 562 | } 563 | 564 | void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { 565 | 566 | // Rudimentary clipping 567 | if((x >= _width) || (y >= _height)) return; 568 | if((x+w-1) >= _width) w = _width-x; 569 | 570 | if(hwSPI) { 571 | spi_begin(); 572 | } 573 | 574 | spiDcHigh(); 575 | spiCsLow(); 576 | 577 | setAddrWindow_(x, y, (x + w - 1), y); 578 | 579 | uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; 580 | spiwritePattern(&colorBin[0], 2, w); 581 | 582 | spiCsHigh(); 583 | 584 | if(hwSPI) { 585 | spi_end(); 586 | } 587 | } 588 | 589 | void Adafruit_ILI9341::fillScreen(uint16_t color) { 590 | fillRect(0, 0, _width, _height, color); 591 | } 592 | 593 | // fill a rectangle 594 | void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { 595 | 596 | // rudimentary clipping (drawChar w/big text requires this) 597 | if((x >= _width) || (y >= _height)) 598 | return; 599 | if((x + w - 1) >= _width) 600 | w = _width - x; 601 | if((y + h - 1) >= _height) 602 | h = _height - y; 603 | 604 | if(hwSPI) { 605 | spi_begin(); 606 | } 607 | 608 | spiCsLow(); 609 | 610 | setAddrWindow_(x, y, (x + w - 1), (y + h - 1)); 611 | 612 | uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; 613 | spiwritePattern(&colorBin[0], 2, (w * h)); 614 | 615 | spiCsHigh(); 616 | 617 | if(hwSPI) { 618 | spi_end(); 619 | } 620 | } 621 | 622 | 623 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color 624 | uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) { 625 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); 626 | } 627 | 628 | 629 | #define MADCTL_MY 0x80 630 | #define MADCTL_MX 0x40 631 | #define MADCTL_MV 0x20 632 | #define MADCTL_ML 0x10 633 | #define MADCTL_RGB 0x00 634 | #define MADCTL_BGR 0x08 635 | #define MADCTL_MH 0x04 636 | 637 | void Adafruit_ILI9341::setRotation(uint8_t m) { 638 | 639 | if (hwSPI) spi_begin(); 640 | writecommand(ILI9341_MADCTL); 641 | rotation = m % 4; // can't be higher than 3 642 | switch (rotation) { 643 | case 0: 644 | writedata(MADCTL_MX | MADCTL_BGR); 645 | _width = ILI9341_TFTWIDTH; 646 | _height = ILI9341_TFTHEIGHT; 647 | break; 648 | case 1: 649 | writedata(MADCTL_MV | MADCTL_BGR); 650 | _width = ILI9341_TFTHEIGHT; 651 | _height = ILI9341_TFTWIDTH; 652 | break; 653 | case 2: 654 | writedata(MADCTL_MY | MADCTL_BGR); 655 | _width = ILI9341_TFTWIDTH; 656 | _height = ILI9341_TFTHEIGHT; 657 | break; 658 | case 3: 659 | writedata(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); 660 | _width = ILI9341_TFTHEIGHT; 661 | _height = ILI9341_TFTWIDTH; 662 | break; 663 | } 664 | if (hwSPI) spi_end(); 665 | } 666 | 667 | 668 | void Adafruit_ILI9341::invertDisplay(boolean i) { 669 | if (hwSPI) spi_begin(); 670 | writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); 671 | if (hwSPI) spi_end(); 672 | } 673 | 674 | 675 | ////////// stuff not actively being used, but kept for posterity 676 | 677 | 678 | uint8_t Adafruit_ILI9341::spiread(void) { 679 | uint8_t r = 0; 680 | 681 | if (hwSPI) { 682 | #if defined (__AVR__) 683 | uint8_t backupSPCR = SPCR; 684 | SPCR = mySPCR; 685 | SPDR = 0x00; 686 | while(!(SPSR & _BV(SPIF))); 687 | r = SPDR; 688 | SPCR = backupSPCR; 689 | #elif defined(TEENSYDUINO) 690 | r = SPI.transfer(0x00); 691 | #elif defined (__arm__) 692 | SPI.setClockDivider(11); // 8-ish MHz (full! speed!) 693 | SPI.setBitOrder(MSBFIRST); 694 | SPI.setDataMode(SPI_MODE0); 695 | r = SPI.transfer(0x00); 696 | #else 697 | r = SPI.transfer(0x00); 698 | #endif 699 | } else { 700 | #ifndef ESP8266 701 | for (uint8_t i=0; i<8; i++) { 702 | digitalWrite(_sclk, LOW); 703 | digitalWrite(_sclk, HIGH); 704 | r <<= 1; 705 | if (digitalRead(_miso)) 706 | r |= 0x1; 707 | } 708 | #endif 709 | } 710 | //Serial.print("read: 0x"); Serial.print(r, HEX); 711 | 712 | return r; 713 | } 714 | 715 | uint8_t Adafruit_ILI9341::readdata(void) { 716 | if(hwSPI) spi_begin(); 717 | spiCsLow(); 718 | spiDcLow(); 719 | uint8_t r = spiread(); 720 | spiCsHigh(); 721 | if(hwSPI) spi_end(); 722 | return r; 723 | } 724 | 725 | uint8_t Adafruit_ILI9341::readcommand8(uint8_t c, uint8_t index) { 726 | if(hwSPI) spi_begin(); 727 | 728 | spiCsLow(); 729 | spiDcLow(); 730 | 731 | spiwrite(0xD9); // woo sekret command? 732 | spiDcHigh(); 733 | spiwrite(0x10 + index); 734 | 735 | #ifndef ESP8266 736 | digitalWrite(_sclk, LOW); 737 | #endif 738 | 739 | spiDcLow(); 740 | spiwrite(c); 741 | 742 | spiDcHigh(); 743 | uint8_t r = spiread(); 744 | spiCsHigh(); 745 | 746 | if(hwSPI) spi_end(); 747 | return r; 748 | } 749 | 750 | /* 751 | 752 | uint16_t Adafruit_ILI9341::readcommand16(uint8_t c) { 753 | digitalWrite(_dc, LOW); 754 | if (_cs) 755 | digitalWrite(_cs, LOW); 756 | 757 | spiwrite(c); 758 | pinMode(_sid, INPUT); // input! 759 | uint16_t r = spiread(); 760 | r <<= 8; 761 | r |= spiread(); 762 | if (_cs) 763 | digitalWrite(_cs, HIGH); 764 | 765 | pinMode(_sid, OUTPUT); // back to output 766 | return r; 767 | } 768 | 769 | uint32_t Adafruit_ILI9341::readcommand32(uint8_t c) { 770 | digitalWrite(_dc, LOW); 771 | if (_cs) 772 | digitalWrite(_cs, LOW); 773 | spiwrite(c); 774 | pinMode(_sid, INPUT); // input! 775 | 776 | dummyclock(); 777 | dummyclock(); 778 | 779 | uint32_t r = spiread(); 780 | r <<= 8; 781 | r |= spiread(); 782 | r <<= 8; 783 | r |= spiread(); 784 | r <<= 8; 785 | r |= spiread(); 786 | if (_cs) 787 | digitalWrite(_cs, HIGH); 788 | 789 | pinMode(_sid, OUTPUT); // back to output 790 | return r; 791 | } 792 | 793 | */ 794 | -------------------------------------------------------------------------------- /kicad/GERBERS/MeetingRoomDisplayConnector-F.SilkS.gbr: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Legend,Top* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.5) date 2017 January 02, Monday 13:47:43* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11C,0.300000*% 11 | %ADD12C,0.150000*% 12 | %ADD13R,2.432000X2.127200*% 13 | %ADD14O,2.432000X2.127200*% 14 | %ADD15C,2.200000*% 15 | G04 APERTURE END LIST* 16 | D10* 17 | D11* 18 | X118788571Y-116862856D02* 19 | X117288571Y-116862856D01* 20 | X118788571Y-115434284D02* 21 | X118788571Y-116148570D01* 22 | X117288571Y-116148570D01* 23 | X118788571Y-114934284D02* 24 | X117288571Y-114934284D01* 25 | X118788571Y-114148570D02* 26 | X118788571Y-113862855D01* 27 | X118717143Y-113719998D01* 28 | X118645714Y-113648570D01* 29 | X118431429Y-113505712D01* 30 | X118145714Y-113434284D01* 31 | X117574286Y-113434284D01* 32 | X117431429Y-113505712D01* 33 | X117360000Y-113577141D01* 34 | X117288571Y-113719998D01* 35 | X117288571Y-114005712D01* 36 | X117360000Y-114148570D01* 37 | X117431429Y-114219998D01* 38 | X117574286Y-114291427D01* 39 | X117931429Y-114291427D01* 40 | X118074286Y-114219998D01* 41 | X118145714Y-114148570D01* 42 | X118217143Y-114005712D01* 43 | X118217143Y-113719998D01* 44 | X118145714Y-113577141D01* 45 | X118074286Y-113505712D01* 46 | X117931429Y-113434284D01* 47 | X117288571Y-112934284D02* 48 | X117288571Y-112005713D01* 49 | X117860000Y-112505713D01* 50 | X117860000Y-112291427D01* 51 | X117931429Y-112148570D01* 52 | X118002857Y-112077141D01* 53 | X118145714Y-112005713D01* 54 | X118502857Y-112005713D01* 55 | X118645714Y-112077141D01* 56 | X118717143Y-112148570D01* 57 | X118788571Y-112291427D01* 58 | X118788571Y-112719999D01* 59 | X118717143Y-112862856D01* 60 | X118645714Y-112934284D01* 61 | X117788571Y-110719999D02* 62 | X118788571Y-110719999D01* 63 | X117217143Y-111077142D02* 64 | X118288571Y-111434285D01* 65 | X118288571Y-110505713D01* 66 | X118788571Y-109148571D02* 67 | X118788571Y-110005714D01* 68 | X118788571Y-109577142D02* 69 | X117288571Y-109577142D01* 70 | X117502857Y-109719999D01* 71 | X117645714Y-109862857D01* 72 | X117717143Y-110005714D01* 73 | X117288571Y-107577143D02* 74 | X117288571Y-106720000D01* 75 | X118788571Y-107148571D02* 76 | X117288571Y-107148571D01* 77 | X118788571Y-106005714D02* 78 | X118717143Y-106148572D01* 79 | X118645714Y-106220000D01* 80 | X118502857Y-106291429D01* 81 | X118074286Y-106291429D01* 82 | X117931429Y-106220000D01* 83 | X117860000Y-106148572D01* 84 | X117788571Y-106005714D01* 85 | X117788571Y-105791429D01* 86 | X117860000Y-105648572D01* 87 | X117931429Y-105577143D01* 88 | X118074286Y-105505714D01* 89 | X118502857Y-105505714D01* 90 | X118645714Y-105577143D01* 91 | X118717143Y-105648572D01* 92 | X118788571Y-105791429D01* 93 | X118788571Y-106005714D01* 94 | X117788571Y-104220000D02* 95 | X118788571Y-104220000D01* 96 | X117788571Y-104862857D02* 97 | X118574286Y-104862857D01* 98 | X118717143Y-104791429D01* 99 | X118788571Y-104648571D01* 100 | X118788571Y-104434286D01* 101 | X118717143Y-104291429D01* 102 | X118645714Y-104220000D01* 103 | X118717143Y-102862857D02* 104 | X118788571Y-103005714D01* 105 | X118788571Y-103291428D01* 106 | X118717143Y-103434286D01* 107 | X118645714Y-103505714D01* 108 | X118502857Y-103577143D01* 109 | X118074286Y-103577143D01* 110 | X117931429Y-103505714D01* 111 | X117860000Y-103434286D01* 112 | X117788571Y-103291428D01* 113 | X117788571Y-103005714D01* 114 | X117860000Y-102862857D01* 115 | X118788571Y-102220000D02* 116 | X117288571Y-102220000D01* 117 | X118788571Y-101577143D02* 118 | X118002857Y-101577143D01* 119 | X117860000Y-101648572D01* 120 | X117788571Y-101791429D01* 121 | X117788571Y-102005714D01* 122 | X117860000Y-102148572D01* 123 | X117931429Y-102220000D01* 124 | X114370003Y-84493571D02* 125 | X114370003Y-82993571D01* 126 | X115798575Y-84493571D02* 127 | X115084289Y-84493571D01* 128 | X115084289Y-82993571D01* 129 | X116298575Y-84493571D02* 130 | X116298575Y-82993571D01* 131 | X117084289Y-84493571D02* 132 | X117370004Y-84493571D01* 133 | X117512861Y-84422143D01* 134 | X117584289Y-84350714D01* 135 | X117727147Y-84136429D01* 136 | X117798575Y-83850714D01* 137 | X117798575Y-83279286D01* 138 | X117727147Y-83136429D01* 139 | X117655718Y-83065000D01* 140 | X117512861Y-82993571D01* 141 | X117227147Y-82993571D01* 142 | X117084289Y-83065000D01* 143 | X117012861Y-83136429D01* 144 | X116941432Y-83279286D01* 145 | X116941432Y-83636429D01* 146 | X117012861Y-83779286D01* 147 | X117084289Y-83850714D01* 148 | X117227147Y-83922143D01* 149 | X117512861Y-83922143D01* 150 | X117655718Y-83850714D01* 151 | X117727147Y-83779286D01* 152 | X117798575Y-83636429D01* 153 | X118298575Y-82993571D02* 154 | X119227146Y-82993571D01* 155 | X118727146Y-83565000D01* 156 | X118941432Y-83565000D01* 157 | X119084289Y-83636429D01* 158 | X119155718Y-83707857D01* 159 | X119227146Y-83850714D01* 160 | X119227146Y-84207857D01* 161 | X119155718Y-84350714D01* 162 | X119084289Y-84422143D01* 163 | X118941432Y-84493571D01* 164 | X118512860Y-84493571D01* 165 | X118370003Y-84422143D01* 166 | X118298575Y-84350714D01* 167 | X120512860Y-83493571D02* 168 | X120512860Y-84493571D01* 169 | X120155717Y-82922143D02* 170 | X119798574Y-83993571D01* 171 | X120727146Y-83993571D01* 172 | X122084288Y-84493571D02* 173 | X121227145Y-84493571D01* 174 | X121655717Y-84493571D02* 175 | X121655717Y-82993571D01* 176 | X121512860Y-83207857D01* 177 | X121370002Y-83350714D01* 178 | X121227145Y-83422143D01* 179 | X123727145Y-82993571D02* 180 | X124727145Y-84493571D01* 181 | X124727145Y-82993571D02* 182 | X123727145Y-84493571D01* 183 | X125298573Y-84493571D02* 184 | X125298573Y-82993571D01* 185 | X125870001Y-82993571D01* 186 | X126012859Y-83065000D01* 187 | X126084287Y-83136429D01* 188 | X126155716Y-83279286D01* 189 | X126155716Y-83493571D01* 190 | X126084287Y-83636429D01* 191 | X126012859Y-83707857D01* 192 | X125870001Y-83779286D01* 193 | X125298573Y-83779286D01* 194 | X126584287Y-82993571D02* 195 | X127441430Y-82993571D01* 196 | X127012859Y-84493571D02* 197 | X127012859Y-82993571D01* 198 | X127870001Y-83136429D02* 199 | X127941430Y-83065000D01* 200 | X128084287Y-82993571D01* 201 | X128441430Y-82993571D01* 202 | X128584287Y-83065000D01* 203 | X128655716Y-83136429D01* 204 | X128727144Y-83279286D01* 205 | X128727144Y-83422143D01* 206 | X128655716Y-83636429D01* 207 | X127798573Y-84493571D01* 208 | X128727144Y-84493571D01* 209 | X129655715Y-82993571D02* 210 | X129798572Y-82993571D01* 211 | X129941429Y-83065000D01* 212 | X130012858Y-83136429D01* 213 | X130084287Y-83279286D01* 214 | X130155715Y-83565000D01* 215 | X130155715Y-83922143D01* 216 | X130084287Y-84207857D01* 217 | X130012858Y-84350714D01* 218 | X129941429Y-84422143D01* 219 | X129798572Y-84493571D01* 220 | X129655715Y-84493571D01* 221 | X129512858Y-84422143D01* 222 | X129441429Y-84350714D01* 223 | X129370001Y-84207857D01* 224 | X129298572Y-83922143D01* 225 | X129298572Y-83565000D01* 226 | X129370001Y-83279286D01* 227 | X129441429Y-83136429D01* 228 | X129512858Y-83065000D01* 229 | X129655715Y-82993571D01* 230 | X131441429Y-83493571D02* 231 | X131441429Y-84493571D01* 232 | X131084286Y-82922143D02* 233 | X130727143Y-83993571D01* 234 | X131655715Y-83993571D01* 235 | X132870000Y-82993571D02* 236 | X132584286Y-82993571D01* 237 | X132441429Y-83065000D01* 238 | X132370000Y-83136429D01* 239 | X132227143Y-83350714D01* 240 | X132155714Y-83636429D01* 241 | X132155714Y-84207857D01* 242 | X132227143Y-84350714D01* 243 | X132298571Y-84422143D01* 244 | X132441429Y-84493571D01* 245 | X132727143Y-84493571D01* 246 | X132870000Y-84422143D01* 247 | X132941429Y-84350714D01* 248 | X133012857Y-84207857D01* 249 | X133012857Y-83850714D01* 250 | X132941429Y-83707857D01* 251 | X132870000Y-83636429D01* 252 | X132727143Y-83565000D01* 253 | X132441429Y-83565000D01* 254 | X132298571Y-83636429D01* 255 | X132227143Y-83707857D01* 256 | X132155714Y-83850714D01* 257 | X134655714Y-82993571D02* 258 | X135012857Y-84493571D01* 259 | X135298571Y-83422143D01* 260 | X135584285Y-84493571D01* 261 | X135941428Y-82993571D01* 262 | X136512857Y-84493571D02* 263 | X136512857Y-83493571D01* 264 | X136512857Y-82993571D02* 265 | X136441428Y-83065000D01* 266 | X136512857Y-83136429D01* 267 | X136584285Y-83065000D01* 268 | X136512857Y-82993571D01* 269 | X136512857Y-83136429D01* 270 | X137727143Y-83707857D02* 271 | X137227143Y-83707857D01* 272 | X137227143Y-84493571D02* 273 | X137227143Y-82993571D01* 274 | X137941429Y-82993571D01* 275 | X138512857Y-84493571D02* 276 | X138512857Y-83493571D01* 277 | X138512857Y-82993571D02* 278 | X138441428Y-83065000D01* 279 | X138512857Y-83136429D01* 280 | X138584285Y-83065000D01* 281 | X138512857Y-82993571D01* 282 | X138512857Y-83136429D01* 283 | X140155714Y-82993571D02* 284 | X141012857Y-82993571D01* 285 | X140584286Y-84493571D02* 286 | X140584286Y-82993571D01* 287 | X141727143Y-84493571D02* 288 | X141584285Y-84422143D01* 289 | X141512857Y-84350714D01* 290 | X141441428Y-84207857D01* 291 | X141441428Y-83779286D01* 292 | X141512857Y-83636429D01* 293 | X141584285Y-83565000D01* 294 | X141727143Y-83493571D01* 295 | X141941428Y-83493571D01* 296 | X142084285Y-83565000D01* 297 | X142155714Y-83636429D01* 298 | X142227143Y-83779286D01* 299 | X142227143Y-84207857D01* 300 | X142155714Y-84350714D01* 301 | X142084285Y-84422143D01* 302 | X141941428Y-84493571D01* 303 | X141727143Y-84493571D01* 304 | X143512857Y-83493571D02* 305 | X143512857Y-84493571D01* 306 | X142870000Y-83493571D02* 307 | X142870000Y-84279286D01* 308 | X142941428Y-84422143D01* 309 | X143084286Y-84493571D01* 310 | X143298571Y-84493571D01* 311 | X143441428Y-84422143D01* 312 | X143512857Y-84350714D01* 313 | X144870000Y-84422143D02* 314 | X144727143Y-84493571D01* 315 | X144441429Y-84493571D01* 316 | X144298571Y-84422143D01* 317 | X144227143Y-84350714D01* 318 | X144155714Y-84207857D01* 319 | X144155714Y-83779286D01* 320 | X144227143Y-83636429D01* 321 | X144298571Y-83565000D01* 322 | X144441429Y-83493571D01* 323 | X144727143Y-83493571D01* 324 | X144870000Y-83565000D01* 325 | X145512857Y-84493571D02* 326 | X145512857Y-82993571D01* 327 | X146155714Y-84493571D02* 328 | X146155714Y-83707857D01* 329 | X146084285Y-83565000D01* 330 | X145941428Y-83493571D01* 331 | X145727143Y-83493571D01* 332 | X145584285Y-83565000D01* 333 | X145512857Y-83636429D01* 334 | X147941428Y-84422143D02* 335 | X148155714Y-84493571D01* 336 | X148512857Y-84493571D01* 337 | X148655714Y-84422143D01* 338 | X148727143Y-84350714D01* 339 | X148798571Y-84207857D01* 340 | X148798571Y-84065000D01* 341 | X148727143Y-83922143D01* 342 | X148655714Y-83850714D01* 343 | X148512857Y-83779286D01* 344 | X148227143Y-83707857D01* 345 | X148084285Y-83636429D01* 346 | X148012857Y-83565000D01* 347 | X147941428Y-83422143D01* 348 | X147941428Y-83279286D01* 349 | X148012857Y-83136429D01* 350 | X148084285Y-83065000D01* 351 | X148227143Y-82993571D01* 352 | X148584285Y-82993571D01* 353 | X148798571Y-83065000D01* 354 | X150084285Y-84422143D02* 355 | X149941428Y-84493571D01* 356 | X149655714Y-84493571D01* 357 | X149512856Y-84422143D01* 358 | X149441428Y-84350714D01* 359 | X149369999Y-84207857D01* 360 | X149369999Y-83779286D01* 361 | X149441428Y-83636429D01* 362 | X149512856Y-83565000D01* 363 | X149655714Y-83493571D01* 364 | X149941428Y-83493571D01* 365 | X150084285Y-83565000D01* 366 | X150727142Y-84493571D02* 367 | X150727142Y-83493571D01* 368 | X150727142Y-83779286D02* 369 | X150798570Y-83636429D01* 370 | X150869999Y-83565000D01* 371 | X151012856Y-83493571D01* 372 | X151155713Y-83493571D01* 373 | X152227141Y-84422143D02* 374 | X152084284Y-84493571D01* 375 | X151798570Y-84493571D01* 376 | X151655713Y-84422143D01* 377 | X151584284Y-84279286D01* 378 | X151584284Y-83707857D01* 379 | X151655713Y-83565000D01* 380 | X151798570Y-83493571D01* 381 | X152084284Y-83493571D01* 382 | X152227141Y-83565000D01* 383 | X152298570Y-83707857D01* 384 | X152298570Y-83850714D01* 385 | X151584284Y-83993571D01* 386 | X153512855Y-84422143D02* 387 | X153369998Y-84493571D01* 388 | X153084284Y-84493571D01* 389 | X152941427Y-84422143D01* 390 | X152869998Y-84279286D01* 391 | X152869998Y-83707857D01* 392 | X152941427Y-83565000D01* 393 | X153084284Y-83493571D01* 394 | X153369998Y-83493571D01* 395 | X153512855Y-83565000D01* 396 | X153584284Y-83707857D01* 397 | X153584284Y-83850714D01* 398 | X152869998Y-83993571D01* 399 | X154227141Y-83493571D02* 400 | X154227141Y-84493571D01* 401 | X154227141Y-83636429D02* 402 | X154298569Y-83565000D01* 403 | X154441427Y-83493571D01* 404 | X154655712Y-83493571D01* 405 | X154798569Y-83565000D01* 406 | X154869998Y-83707857D01* 407 | X154869998Y-84493571D01* 408 | X115048572Y-87043571D02* 409 | X115048572Y-85543571D01* 410 | X115048572Y-86115000D02* 411 | X115191429Y-86043571D01* 412 | X115477143Y-86043571D01* 413 | X115620000Y-86115000D01* 414 | X115691429Y-86186429D01* 415 | X115762858Y-86329286D01* 416 | X115762858Y-86757857D01* 417 | X115691429Y-86900714D01* 418 | X115620000Y-86972143D01* 419 | X115477143Y-87043571D01* 420 | X115191429Y-87043571D01* 421 | X115048572Y-86972143D01* 422 | X116262858Y-86043571D02* 423 | X116620001Y-87043571D01* 424 | X116977143Y-86043571D02* 425 | X116620001Y-87043571D01* 426 | X116477143Y-87400714D01* 427 | X116405715Y-87472143D01* 428 | X116262858Y-87543571D01* 429 | X118691429Y-87043571D02* 430 | X118691429Y-85543571D01* 431 | X118691429Y-86115000D02* 432 | X118834286Y-86043571D01* 433 | X119120000Y-86043571D01* 434 | X119262857Y-86115000D01* 435 | X119334286Y-86186429D01* 436 | X119405715Y-86329286D01* 437 | X119405715Y-86757857D01* 438 | X119334286Y-86900714D01* 439 | X119262857Y-86972143D01* 440 | X119120000Y-87043571D01* 441 | X118834286Y-87043571D01* 442 | X118691429Y-86972143D01* 443 | X120262858Y-87043571D02* 444 | X120120000Y-86972143D01* 445 | X120048572Y-86829286D01* 446 | X120048572Y-85543571D01* 447 | X121048572Y-87043571D02* 448 | X120905714Y-86972143D01* 449 | X120834286Y-86900714D01* 450 | X120762857Y-86757857D01* 451 | X120762857Y-86329286D01* 452 | X120834286Y-86186429D01* 453 | X120905714Y-86115000D01* 454 | X121048572Y-86043571D01* 455 | X121262857Y-86043571D01* 456 | X121405714Y-86115000D01* 457 | X121477143Y-86186429D01* 458 | X121548572Y-86329286D01* 459 | X121548572Y-86757857D01* 460 | X121477143Y-86900714D01* 461 | X121405714Y-86972143D01* 462 | X121262857Y-87043571D01* 463 | X121048572Y-87043571D01* 464 | X122834286Y-86043571D02* 465 | X122834286Y-87257857D01* 466 | X122762857Y-87400714D01* 467 | X122691429Y-87472143D01* 468 | X122548572Y-87543571D01* 469 | X122334286Y-87543571D01* 470 | X122191429Y-87472143D01* 471 | X122834286Y-86972143D02* 472 | X122691429Y-87043571D01* 473 | X122405715Y-87043571D01* 474 | X122262857Y-86972143D01* 475 | X122191429Y-86900714D01* 476 | X122120000Y-86757857D01* 477 | X122120000Y-86329286D01* 478 | X122191429Y-86186429D01* 479 | X122262857Y-86115000D01* 480 | X122405715Y-86043571D01* 481 | X122691429Y-86043571D01* 482 | X122834286Y-86115000D01* 483 | X123548572Y-86900714D02* 484 | X123620000Y-86972143D01* 485 | X123548572Y-87043571D01* 486 | X123477143Y-86972143D01* 487 | X123548572Y-86900714D01* 488 | X123548572Y-87043571D01* 489 | X124191429Y-86972143D02* 490 | X124334286Y-87043571D01* 491 | X124620001Y-87043571D01* 492 | X124762858Y-86972143D01* 493 | X124834286Y-86829286D01* 494 | X124834286Y-86757857D01* 495 | X124762858Y-86615000D01* 496 | X124620001Y-86543571D01* 497 | X124405715Y-86543571D01* 498 | X124262858Y-86472143D01* 499 | X124191429Y-86329286D01* 500 | X124191429Y-86257857D01* 501 | X124262858Y-86115000D01* 502 | X124405715Y-86043571D01* 503 | X124620001Y-86043571D01* 504 | X124762858Y-86115000D01* 505 | X126120001Y-86043571D02* 506 | X126120001Y-87543571D01* 507 | X126120001Y-86972143D02* 508 | X125977144Y-87043571D01* 509 | X125691430Y-87043571D01* 510 | X125548572Y-86972143D01* 511 | X125477144Y-86900714D01* 512 | X125405715Y-86757857D01* 513 | X125405715Y-86329286D01* 514 | X125477144Y-86186429D01* 515 | X125548572Y-86115000D01* 516 | X125691430Y-86043571D01* 517 | X125977144Y-86043571D01* 518 | X126120001Y-86115000D01* 519 | X127477144Y-86043571D02* 520 | X127477144Y-87043571D01* 521 | X126834287Y-86043571D02* 522 | X126834287Y-86829286D01* 523 | X126905715Y-86972143D01* 524 | X127048573Y-87043571D01* 525 | X127262858Y-87043571D01* 526 | X127405715Y-86972143D01* 527 | X127477144Y-86900714D01* 528 | X128191430Y-87043571D02* 529 | X128191430Y-86043571D01* 530 | X128191430Y-85543571D02* 531 | X128120001Y-85615000D01* 532 | X128191430Y-85686429D01* 533 | X128262858Y-85615000D01* 534 | X128191430Y-85543571D01* 535 | X128191430Y-85686429D01* 536 | X128762859Y-87043571D02* 537 | X129548573Y-86043571D01* 538 | X128762859Y-86043571D02* 539 | X129548573Y-87043571D01* 540 | X130120002Y-86900714D02* 541 | X130191430Y-86972143D01* 542 | X130120002Y-87043571D01* 543 | X130048573Y-86972143D01* 544 | X130120002Y-86900714D01* 545 | X130120002Y-87043571D01* 546 | X131048574Y-87043571D02* 547 | X130905716Y-86972143D01* 548 | X130834288Y-86900714D01* 549 | X130762859Y-86757857D01* 550 | X130762859Y-86329286D01* 551 | X130834288Y-86186429D01* 552 | X130905716Y-86115000D01* 553 | X131048574Y-86043571D01* 554 | X131262859Y-86043571D01* 555 | X131405716Y-86115000D01* 556 | X131477145Y-86186429D01* 557 | X131548574Y-86329286D01* 558 | X131548574Y-86757857D01* 559 | X131477145Y-86900714D01* 560 | X131405716Y-86972143D01* 561 | X131262859Y-87043571D01* 562 | X131048574Y-87043571D01* 563 | X132191431Y-87043571D02* 564 | X132191431Y-86043571D01* 565 | X132191431Y-86329286D02* 566 | X132262859Y-86186429D01* 567 | X132334288Y-86115000D01* 568 | X132477145Y-86043571D01* 569 | X132620002Y-86043571D01* 570 | X133762859Y-86043571D02* 571 | X133762859Y-87257857D01* 572 | X133691430Y-87400714D01* 573 | X133620002Y-87472143D01* 574 | X133477145Y-87543571D01* 575 | X133262859Y-87543571D01* 576 | X133120002Y-87472143D01* 577 | X133762859Y-86972143D02* 578 | X133620002Y-87043571D01* 579 | X133334288Y-87043571D01* 580 | X133191430Y-86972143D01* 581 | X133120002Y-86900714D01* 582 | X133048573Y-86757857D01* 583 | X133048573Y-86329286D01* 584 | X133120002Y-86186429D01* 585 | X133191430Y-86115000D01* 586 | X133334288Y-86043571D01* 587 | X133620002Y-86043571D01* 588 | X133762859Y-86115000D01* 589 | X135620002Y-86472143D02* 590 | X136762859Y-86472143D01* 591 | X138905716Y-85543571D02* 592 | X139048573Y-85543571D01* 593 | X139191430Y-85615000D01* 594 | X139262859Y-85686429D01* 595 | X139334288Y-85829286D01* 596 | X139405716Y-86115000D01* 597 | X139405716Y-86472143D01* 598 | X139334288Y-86757857D01* 599 | X139262859Y-86900714D01* 600 | X139191430Y-86972143D01* 601 | X139048573Y-87043571D01* 602 | X138905716Y-87043571D01* 603 | X138762859Y-86972143D01* 604 | X138691430Y-86900714D01* 605 | X138620002Y-86757857D01* 606 | X138548573Y-86472143D01* 607 | X138548573Y-86115000D01* 608 | X138620002Y-85829286D01* 609 | X138691430Y-85686429D01* 610 | X138762859Y-85615000D01* 611 | X138905716Y-85543571D01* 612 | X139977144Y-85686429D02* 613 | X140048573Y-85615000D01* 614 | X140191430Y-85543571D01* 615 | X140548573Y-85543571D01* 616 | X140691430Y-85615000D01* 617 | X140762859Y-85686429D01* 618 | X140834287Y-85829286D01* 619 | X140834287Y-85972143D01* 620 | X140762859Y-86186429D01* 621 | X139905716Y-87043571D01* 622 | X140834287Y-87043571D01* 623 | X141477144Y-86472143D02* 624 | X142620001Y-86472143D01* 625 | X143762858Y-85543571D02* 626 | X143762858Y-86615000D01* 627 | X143691430Y-86829286D01* 628 | X143548573Y-86972143D01* 629 | X143334287Y-87043571D01* 630 | X143191430Y-87043571D01* 631 | X144405715Y-86615000D02* 632 | X145120001Y-86615000D01* 633 | X144262858Y-87043571D02* 634 | X144762858Y-85543571D01* 635 | X145262858Y-87043571D01* 636 | X145762858Y-87043571D02* 637 | X145762858Y-85543571D01* 638 | X146620001Y-87043571D01* 639 | X146620001Y-85543571D01* 640 | X147334287Y-86472143D02* 641 | X148477144Y-86472143D01* 642 | X149120001Y-85686429D02* 643 | X149191430Y-85615000D01* 644 | X149334287Y-85543571D01* 645 | X149691430Y-85543571D01* 646 | X149834287Y-85615000D01* 647 | X149905716Y-85686429D01* 648 | X149977144Y-85829286D01* 649 | X149977144Y-85972143D01* 650 | X149905716Y-86186429D01* 651 | X149048573Y-87043571D01* 652 | X149977144Y-87043571D01* 653 | X150905715Y-85543571D02* 654 | X151048572Y-85543571D01* 655 | X151191429Y-85615000D01* 656 | X151262858Y-85686429D01* 657 | X151334287Y-85829286D01* 658 | X151405715Y-86115000D01* 659 | X151405715Y-86472143D01* 660 | X151334287Y-86757857D01* 661 | X151262858Y-86900714D01* 662 | X151191429Y-86972143D01* 663 | X151048572Y-87043571D01* 664 | X150905715Y-87043571D01* 665 | X150762858Y-86972143D01* 666 | X150691429Y-86900714D01* 667 | X150620001Y-86757857D01* 668 | X150548572Y-86472143D01* 669 | X150548572Y-86115000D01* 670 | X150620001Y-85829286D01* 671 | X150691429Y-85686429D01* 672 | X150762858Y-85615000D01* 673 | X150905715Y-85543571D01* 674 | X152834286Y-87043571D02* 675 | X151977143Y-87043571D01* 676 | X152405715Y-87043571D02* 677 | X152405715Y-85543571D01* 678 | X152262858Y-85757857D01* 679 | X152120000Y-85900714D01* 680 | X151977143Y-85972143D01* 681 | X153334286Y-85543571D02* 682 | X154334286Y-85543571D01* 683 | X153691429Y-87043571D01* 684 | D12* 685 | X114300000Y-90170000D02* 686 | X114300000Y-123190000D01* 687 | X114300000Y-123190000D02* 688 | X116840000Y-123190000D01* 689 | X116840000Y-123190000D02* 690 | X116840000Y-90170000D01* 691 | X117120000Y-87350000D02* 692 | X117120000Y-88900000D01* 693 | X116840000Y-90170000D02* 694 | X114300000Y-90170000D01* 695 | X114020000Y-88900000D02* 696 | X114020000Y-87350000D01* 697 | X114020000Y-87350000D02* 698 | X117120000Y-87350000D01* 699 | X148590000Y-113030000D02* 700 | X148590000Y-99060000D01* 701 | X148590000Y-99060000D02* 702 | X135890000Y-99060000D01* 703 | X135890000Y-99060000D02* 704 | X135890000Y-113030000D01* 705 | X135890000Y-113030000D02* 706 | X148590000Y-113030000D01* 707 | X151130000Y-114300000D02* 708 | X133350000Y-114300000D01* 709 | X133350000Y-114300000D02* 710 | X133350000Y-91440000D01* 711 | X133350000Y-91440000D02* 712 | X151130000Y-91440000D01* 713 | X151130000Y-91440000D02* 714 | X151130000Y-114300000D01* 715 | D10* 716 | X131422528Y-125497228D02* 717 | X137233820Y-125497228D01* 718 | X137233820Y-125497228D02* 719 | X137260151Y-124213795D01* 720 | X137260151Y-124213795D02* 721 | X146091373Y-124220483D01* 722 | X146091373Y-124220483D02* 723 | X146089397Y-125422736D01* 724 | X146089397Y-125422736D02* 725 | X155170193Y-125396658D01* 726 | X155170193Y-125396658D02* 727 | X155156195Y-94226507D01* 728 | X155156195Y-94226507D02* 729 | X154923384Y-93623714D01* 730 | X154923384Y-93623714D02* 731 | X154639901Y-93078833D01* 732 | X154639901Y-93078833D02* 733 | X154305253Y-92592423D01* 734 | X154305253Y-92592423D02* 735 | X153918953Y-92165048D01* 736 | X153918953Y-92165048D02* 737 | X153480512Y-91797259D01* 738 | X153480512Y-91797259D02* 739 | X152989440Y-91489623D01* 740 | X152989440Y-91489623D02* 741 | X152445250Y-91242690D01* 742 | X152445250Y-91242690D02* 743 | X151847453Y-91057024D01* 744 | X151847453Y-91057024D02* 745 | X132809540Y-91028266D01* 746 | X132809540Y-91028266D02* 747 | X132190176Y-91262259D01* 748 | X132190176Y-91262259D02* 749 | X131601982Y-91546742D01* 750 | X131601982Y-91546742D02* 751 | X131058555Y-91896257D01* 752 | X131058555Y-91896257D02* 753 | X130573497Y-92325342D01* 754 | X130573497Y-92325342D02* 755 | X130160405Y-92848540D01* 756 | X130160405Y-92848540D02* 757 | X129832878Y-93480387D01* 758 | X129832878Y-93480387D02* 759 | X129604518Y-94235425D01* 760 | X129604518Y-94235425D02* 761 | X129488922Y-95128193D01* 762 | X129488922Y-95128193D02* 763 | X129463974Y-117683285D01* 764 | X129463974Y-117683285D02* 765 | X131407520Y-118644181D01* 766 | X131407520Y-118644181D02* 767 | X131437314Y-125452524D01* 768 | X145419650Y-119271451D02* 769 | X138280069Y-119271451D01* 770 | X138280069Y-119271451D02* 771 | X138280069Y-125085188D01* 772 | X138280069Y-125085188D02* 773 | X145419650Y-125085188D01* 774 | X145419650Y-125085188D02* 775 | X145419650Y-119271451D01* 776 | X131496400Y-118622349D02* 777 | X133048622Y-118622349D01* 778 | X133048622Y-118622349D02* 779 | X133577789Y-119151515D01* 780 | X133577789Y-119151515D02* 781 | X134830150Y-119151515D01* 782 | X134830150Y-119151515D02* 783 | X134830150Y-124213876D01* 784 | X134830150Y-124213876D02* 785 | X133542511Y-124213876D01* 786 | X133542511Y-124213876D02* 787 | X133013344Y-124707765D01* 788 | X133013344Y-124707765D02* 789 | X131443483Y-124707765D01* 790 | X131443483Y-124707765D02* 791 | X131496400Y-118622349D01* 792 | X131461122Y-120703738D02* 793 | X130808483Y-120703738D01* 794 | X130808483Y-120703738D02* 795 | X130808483Y-122696932D01* 796 | X130808483Y-122696932D02* 797 | X131425844Y-122696932D01* 798 | D12* 799 | X112268095Y-88352381D02* 800 | X112268095Y-89161905D01* 801 | X112315714Y-89257143D01* 802 | X112363333Y-89304762D01* 803 | X112458571Y-89352381D01* 804 | X112649048Y-89352381D01* 805 | X112744286Y-89304762D01* 806 | X112791905Y-89257143D01* 807 | X112839524Y-89161905D01* 808 | X112839524Y-88352381D01* 809 | X113268095Y-88447619D02* 810 | X113315714Y-88400000D01* 811 | X113410952Y-88352381D01* 812 | X113649048Y-88352381D01* 813 | X113744286Y-88400000D01* 814 | X113791905Y-88447619D01* 815 | X113839524Y-88542857D01* 816 | X113839524Y-88638095D01* 817 | X113791905Y-88780952D01* 818 | X113220476Y-89352381D01* 819 | X113839524Y-89352381D01* 820 | X140208095Y-127482381D02* 821 | X140208095Y-128291905D01* 822 | X140255714Y-128387143D01* 823 | X140303333Y-128434762D01* 824 | X140398571Y-128482381D01* 825 | X140589048Y-128482381D01* 826 | X140684286Y-128434762D01* 827 | X140731905Y-128387143D01* 828 | X140779524Y-128291905D01* 829 | X140779524Y-127482381D01* 830 | X141779524Y-128482381D02* 831 | X141208095Y-128482381D01* 832 | X141493809Y-128482381D02* 833 | X141493809Y-127482381D01* 834 | X141398571Y-127625238D01* 835 | X141303333Y-127720476D01* 836 | X141208095Y-127768095D01* 837 | X135382857Y-92337143D02* 838 | X136097143Y-95337143D01* 839 | X136668572Y-93194286D01* 840 | X137240000Y-95337143D01* 841 | X137954286Y-92337143D01* 842 | X140240000Y-95194286D02* 843 | X139954286Y-95337143D01* 844 | X139382857Y-95337143D01* 845 | X139097143Y-95194286D01* 846 | X138954286Y-94908571D01* 847 | X138954286Y-93765714D01* 848 | X139097143Y-93480000D01* 849 | X139382857Y-93337143D01* 850 | X139954286Y-93337143D01* 851 | X140240000Y-93480000D01* 852 | X140382857Y-93765714D01* 853 | X140382857Y-94051429D01* 854 | X138954286Y-94337143D01* 855 | X141668572Y-95337143D02* 856 | X141668572Y-92337143D01* 857 | X142668572Y-94480000D01* 858 | X143668572Y-92337143D01* 859 | X143668572Y-95337143D01* 860 | X145525714Y-95337143D02* 861 | X145240000Y-95194286D01* 862 | X145097143Y-95051429D01* 863 | X144954286Y-94765714D01* 864 | X144954286Y-93908571D01* 865 | X145097143Y-93622857D01* 866 | X145240000Y-93480000D01* 867 | X145525714Y-93337143D01* 868 | X145954286Y-93337143D01* 869 | X146240000Y-93480000D01* 870 | X146382857Y-93622857D01* 871 | X146525714Y-93908571D01* 872 | X146525714Y-94765714D01* 873 | X146382857Y-95051429D01* 874 | X146240000Y-95194286D01* 875 | X145954286Y-95337143D01* 876 | X145525714Y-95337143D01* 877 | X147668572Y-95194286D02* 878 | X147954286Y-95337143D01* 879 | X148525714Y-95337143D01* 880 | X148811429Y-95194286D01* 881 | X148954286Y-94908571D01* 882 | X148954286Y-94765714D01* 883 | X148811429Y-94480000D01* 884 | X148525714Y-94337143D01* 885 | X148097143Y-94337143D01* 886 | X147811429Y-94194286D01* 887 | X147668572Y-93908571D01* 888 | X147668572Y-93765714D01* 889 | X147811429Y-93480000D01* 890 | X148097143Y-93337143D01* 891 | X148525714Y-93337143D01* 892 | X148811429Y-93480000D01* 893 | %LPC*% 894 | D13* 895 | X115570000Y-88900000D03* 896 | D14* 897 | X115570000Y-91440000D03* 898 | X115570000Y-93980000D03* 899 | X115570000Y-96520000D03* 900 | X115570000Y-99060000D03* 901 | X115570000Y-101600000D03* 902 | X115570000Y-104140000D03* 903 | X115570000Y-106680000D03* 904 | X115570000Y-109220000D03* 905 | X115570000Y-111760000D03* 906 | X115570000Y-114300000D03* 907 | X115570000Y-116840000D03* 908 | X115570000Y-119380000D03* 909 | X115570000Y-121920000D03* 910 | D15* 911 | X153670000Y-99060000D03* 912 | X153670000Y-101600000D03* 913 | X153670000Y-104140000D03* 914 | X153670000Y-106680000D03* 915 | X153670000Y-109220000D03* 916 | X153670000Y-111760000D03* 917 | X153670000Y-114300000D03* 918 | X153670000Y-116840000D03* 919 | X130810000Y-116840000D03* 920 | X130810000Y-114300000D03* 921 | X130810000Y-111760000D03* 922 | X130810000Y-109220000D03* 923 | X130810000Y-106680000D03* 924 | X130810000Y-104140000D03* 925 | X130810000Y-101600000D03* 926 | X130810000Y-99060000D03* 927 | M02* 928 | --------------------------------------------------------------------------------