├── Case ├── Case_v01.skp └── Case_v01.stl ├── Documentation ├── BOM.md ├── Datasheets │ ├── 1463993415RFM95_96_97_98W.pdf │ ├── ADTS6, ADTSM, AKTSC6 Series.pdf │ ├── BSS123-D.PDF │ ├── LCD.webp │ ├── LPT1109DS-HL-05-4.1-12-R.pdf │ ├── RFM95_96_97_98W.pdf │ ├── SX1276_settings_for_LoRaWAN_v2p2.pdf │ ├── TL1105.pdf │ ├── cr-a-as.pdf │ ├── cr.pdf │ ├── js.pdf │ ├── okDatasheet.pdf │ ├── pico-datasheet.pdf │ ├── pts645.pdf │ └── stps340.pdf ├── Parts.xlsx └── sources.txt ├── Hardware ├── PICOmputer - PCB1.png ├── PICOmputer - PCB2.png ├── PICOmputer - Schematic.png └── PICOmputer charging bottom cover PCB │ ├── Picomputer Gerber.zip │ ├── backcover2bottom.GBL │ ├── backcover2bottom.GBO │ ├── backcover2bottom.GBP │ ├── backcover2bottom.GBS │ ├── backcover2bottom.GML │ ├── backcover2bottom.GTL │ ├── backcover2bottom.GTO │ ├── backcover2bottom.GTP │ ├── backcover2bottom.GTS │ ├── backcover2bottom.TXT │ ├── backcover2bottom.brd │ ├── backcover2bottom.dri │ ├── backcover2bottom.gpi │ ├── backcover2bottom.sch │ └── bottom.brd ├── Pictures Armachat HW ├── 0001.jpg ├── 0002.jpg ├── 0003.jpg ├── 0004.jpg ├── 0005.jpg ├── 0006.jpg ├── 0007.jpg ├── 0008.jpg └── 0009.jpg ├── Pictures PICOmputer HW ├── IMG_20211107_234416.jpg ├── IMG_20211107_234438.jpg ├── IMG_20211107_234456.jpg ├── IMG_20211107_234626.jpg ├── IMG_20211107_234819.jpg ├── IMG_20211107_234841.jpg └── IMG_20211107_234850.jpg ├── README.md └── Software ├── Armachat.py ├── Flopy.py ├── bmps ├── Armachat Logo 120.bmp ├── Armachat Logo 80.bmp ├── bobricius.bmp ├── desktop.bmp ├── font.bmp ├── test.bmp ├── winamp.bmp └── world.bmp ├── boot.py ├── calculator.py ├── code.py ├── desktop.py ├── editor.py ├── fonts ├── gohu-14.pcf ├── gomme-20.pcf ├── neep-24.pcf └── pavlova-16.pcf ├── game_princess.py ├── graf-sin.py ├── icons ├── Abacus.bmp ├── Flag.bmp ├── Games.bmp ├── Home.bmp ├── Keyboard.bmp ├── Multimedia.bmp ├── Phone.bmp ├── Tax.bmp ├── Thermometer.bmp ├── Time.bmp ├── Turtle.bmp └── icons.bmp ├── lib ├── adafruit_bitmap_font │ ├── bdf.mpy │ ├── bitmap_font.mpy │ ├── glyph_cache.mpy │ ├── pcf.mpy │ └── ttf.mpy ├── adafruit_button.mpy ├── adafruit_cursorcontrol │ ├── cursorcontrol.mpy │ └── cursorcontrol_cursormanager.mpy ├── adafruit_display_notification │ └── apple.mpy ├── adafruit_display_shapes │ ├── circle.mpy │ ├── line.mpy │ ├── multisparkline.mpy │ ├── polygon.mpy │ ├── rect.mpy │ ├── roundrect.mpy │ ├── sparkline.mpy │ └── triangle.mpy ├── adafruit_display_text │ ├── __init__.mpy │ ├── bitmap_label.mpy │ ├── label.mpy │ └── scrolling_label.mpy ├── adafruit_displayio_layout │ ├── layouts │ │ ├── grid_layout.mpy │ │ ├── page_layout.mpy │ │ └── tab_layout.mpy │ └── widgets │ │ ├── cartesian.mpy │ │ ├── control.mpy │ │ ├── easing.mpy │ │ ├── flip_input.mpy │ │ ├── icon_animated.mpy │ │ ├── icon_widget.mpy │ │ ├── switch_round.mpy │ │ └── widget.mpy ├── adafruit_ds3231.mpy ├── adafruit_gps.mpy ├── adafruit_hid │ ├── consumer_control.mpy │ ├── consumer_control_code.mpy │ ├── keyboard.mpy │ ├── keyboard_layout_base.mpy │ ├── keyboard_layout_us.mpy │ ├── keycode.mpy │ └── mouse.mpy ├── adafruit_imageload │ ├── __init__.mpy │ ├── bmp │ │ ├── __init__.mpy │ │ ├── indexed.mpy │ │ └── negative_height_check.mpy │ ├── displayio_types.mpy │ ├── gif.mpy │ ├── png.mpy │ ├── pnm │ │ ├── __init__.mpy │ │ ├── pbm_ascii.mpy │ │ ├── pbm_binary.mpy │ │ ├── pgm │ │ │ ├── __init__.mpy │ │ │ ├── ascii.mpy │ │ │ └── binary.mpy │ │ ├── ppm_ascii.mpy │ │ └── ppm_binary.mpy │ └── tilegrid_inflator.mpy ├── adafruit_matrixkeypad.mpy ├── adafruit_simple_text_display.py ├── adafruit_slideshow.mpy ├── adafruit_ssd1306.mpy ├── adafruit_st7735.mpy ├── adafruit_st7735r.mpy ├── adafruit_st7789.mpy ├── adafruit_ticks.mpy ├── adafruit_turtle.mpy ├── adafruit_waveform │ ├── sine.mpy │ └── square.mpy ├── armachat_lora.py ├── config.py └── picomputer.py ├── mp3.py ├── mp3 └── new.mp3 ├── photoframe.py ├── tilegame_assets ├── __init__.py ├── castle_sprite_sheet.bmp ├── fun_facts.py ├── lady.bmp ├── map0.csv ├── map1.csv ├── princess.bmp ├── princess16.bmp ├── ranger.bmp ├── sprite_sheet.bmp ├── states.py ├── text_helper.py ├── tiles.py ├── town.bmp └── town16.bmp └── turtle.py /Case/Case_v01.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Case/Case_v01.skp -------------------------------------------------------------------------------- /Documentation/BOM.md: -------------------------------------------------------------------------------- 1 | All prices are in US Dollars. 2 | - 3 | 4 | 5 | 6 |   |   |   |   |   |   | Totals | 75 |   | $    54.64 7 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- 8 |   |   |   |   |   |   |   |   |   |   9 | Line | Req/Optional | Description | MFG | MFG P/N | Supplier | Supplier P/N | QTY | EA | EXT 10 | 1 | Required | Set of Armachat PCBs | Peter Bobrovsky Misenko |   | Tindie | armachat-lora-messenger-with-raspberry-pi-pico | 1 | $    19.98 | $    19.98 11 | 2 | Required | Raspberry PICO | Raspberry Pi | SC0915 | Digi-Key | 2648-SC0915CT-ND | 1 | $       4.00 | $       4.00 12 | 3 | Required | RFM95W - radio module with frequency for your country | DUOWEISI |   | AliExpress | DUOWEISI Module Store | 1 | $       3.40 | $       3.40 13 | 4 | Required | 2.0" IPS screen - 12PIN 320x240 ST7789V | DUOWEISI |   | AliExpress | DUOWEISI Module Store | 1 | $       5.60 | $       5.60 14 | 5 | Required | DTS63K - tactile switch 7mm height, 1N (100gf) | C&K | PTS645SL702 LFS | Digi-Key | CKN9071-ND | 30 | $       0.16 | $       4.76 15 | 6 | Required+Optional | BSS123 - Transistor (N-MOSFET) |   |   | AliExpress | Fantasy Electronics CO., Ltd | 2 | $       0.01 | $       0.03 16 | 7 | Required | 10R 0603 - Resistor | Bourns Inc. | CR0603-FX-10R0ELF | Digi-Key | CR0603-FX-10R0ELFCT-ND | 1 | $       0.01 | $       0.01 17 | 8 | Required+Optional | 4k7 0603 - Resistor | Bourns Inc. | CR0603-FX-4701ELF | Digi-Key | CR0603-FX-4701ELFCT-ND | 2 | $       0.01 | $       0.01 18 | 9 | Required | LPT1109DS - Piezo | Cre-sound Electronics | LPT1109DS-HL-05-4.1-12-R | TME Electronics | LPT1109DS-HL-05 | 1 | $       0.73 | $       0.73 19 | 10 | Optional | JS202011CQN C&K or MSS-2235 NINIGI - Slide Switch | C&K | JS202011AQN | Digi-Key | 401-2000-ND | 1 | $       0.52 | $       0.52 20 | 11 | Optional | 100R 0603 - Resistor | Bourns Inc. | CR0603AFX-1000EAS | Digi-Key | CR0603AFX-1000EASCT-ND | 1 | $       0.02 | $       0.02 21 | 12 | Optional | led 0802 - Side LED | Citizen | CL-270S-WS-SD-TS | Digi-Key | 1642-1500-1-ND | 30 | $       0.23 | $       6.95 22 | 13 | Not Indicated | Antenna connector - Edge-Launch SMA Connector for 1.6mm / 0.062" Thick PCBs |   |   | Adafruit | 1865 | 1 | $       2.50 | $       2.50 23 | 14 | Not Indicated | Diode Schottky 40 V 3A Surface Mount SMAflat Notch | STMicroelectronics | STPS340AFN | Digi-Key | 497-STPS340AFNCT-ND | 1 | $       0.38 | $       0.38 24 | 15 | Not Indicated | LoRa Antenna (SMA) |   |   | Amazon | B091PRHPTJ | 1 | $       5.75 | $       5.75 25 | -------------------------------------------------------------------------------- /Documentation/Datasheets/1463993415RFM95_96_97_98W.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/1463993415RFM95_96_97_98W.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/ADTS6, ADTSM, AKTSC6 Series.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/ADTS6, ADTSM, AKTSC6 Series.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/BSS123-D.PDF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/BSS123-D.PDF -------------------------------------------------------------------------------- /Documentation/Datasheets/LCD.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/LCD.webp -------------------------------------------------------------------------------- /Documentation/Datasheets/LPT1109DS-HL-05-4.1-12-R.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/LPT1109DS-HL-05-4.1-12-R.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/RFM95_96_97_98W.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/RFM95_96_97_98W.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/SX1276_settings_for_LoRaWAN_v2p2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/SX1276_settings_for_LoRaWAN_v2p2.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/TL1105.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/TL1105.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/cr-a-as.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/cr-a-as.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/cr.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/cr.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/js.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/js.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/okDatasheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/okDatasheet.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/pico-datasheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/pico-datasheet.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/pts645.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/pts645.pdf -------------------------------------------------------------------------------- /Documentation/Datasheets/stps340.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Datasheets/stps340.pdf -------------------------------------------------------------------------------- /Documentation/Parts.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Documentation/Parts.xlsx -------------------------------------------------------------------------------- /Documentation/sources.txt: -------------------------------------------------------------------------------- 1 | https://wiki.dragino.com/index.php?title=LoRa_Questions 2 | The RF96 mark means this module is the HopeRF RFM95W-868-S2 or RFM95W-915-S2 module. Both modules use the Semtech SX1276 IC on it. 3 | 4 | https://github.com/martynwheeler/u-lora 5 | ulora 6 | -------------------------------------------------------------------------------- /Hardware/PICOmputer - PCB1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Hardware/PICOmputer - PCB1.png -------------------------------------------------------------------------------- /Hardware/PICOmputer - PCB2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Hardware/PICOmputer - PCB2.png -------------------------------------------------------------------------------- /Hardware/PICOmputer - Schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Hardware/PICOmputer - Schematic.png -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/Picomputer Gerber.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Hardware/PICOmputer charging bottom cover PCB/Picomputer Gerber.zip -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.GBP: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX25Y25*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.00000*% 11 | D10* 12 | X0022650Y0018900D02* 13 | X0401400Y0018900D01* 14 | X0401399Y0018899D02* 15 | X0401581Y0018900D01* 16 | X0401763Y0018905D01* 17 | X0401944Y0018915D01* 18 | X0402125Y0018929D01* 19 | X0402306Y0018947D01* 20 | X0402486Y0018970D01* 21 | X0402666Y0018997D01* 22 | X0402845Y0019029D01* 23 | X0403023Y0019065D01* 24 | X0403200Y0019105D01* 25 | X0403376Y0019150D01* 26 | X0403551Y0019198D01* 27 | X0403725Y0019252D01* 28 | X0403897Y0019309D01* 29 | X0404068Y0019370D01* 30 | X0404237Y0019436D01* 31 | X0404405Y0019506D01* 32 | X0404571Y0019580D01* 33 | X0404735Y0019658D01* 34 | X0404897Y0019740D01* 35 | X0405057Y0019826D01* 36 | X0405215Y0019915D01* 37 | X0405371Y0020009D01* 38 | X0405524Y0020106D01* 39 | X0405675Y0020207D01* 40 | X0405824Y0020312D01* 41 | X0405970Y0020421D01* 42 | X0406113Y0020532D01* 43 | X0406253Y0020648D01* 44 | X0406391Y0020766D01* 45 | X0406525Y0020888D01* 46 | X0406657Y0021014D01* 47 | X0406785Y0021142D01* 48 | X0406911Y0021274D01* 49 | X0407033Y0021408D01* 50 | X0407151Y0021546D01* 51 | X0407267Y0021686D01* 52 | X0407378Y0021829D01* 53 | X0407487Y0021975D01* 54 | X0407592Y0022124D01* 55 | X0407693Y0022275D01* 56 | X0407790Y0022428D01* 57 | X0407884Y0022584D01* 58 | X0407973Y0022742D01* 59 | X0408059Y0022902D01* 60 | X0408141Y0023064D01* 61 | X0408219Y0023228D01* 62 | X0408293Y0023394D01* 63 | X0408363Y0023562D01* 64 | X0408429Y0023731D01* 65 | X0408490Y0023902D01* 66 | X0408547Y0024074D01* 67 | X0408601Y0024248D01* 68 | X0408649Y0024423D01* 69 | X0408694Y0024599D01* 70 | X0408734Y0024776D01* 71 | X0408770Y0024954D01* 72 | X0408802Y0025133D01* 73 | X0408829Y0025313D01* 74 | X0408852Y0025493D01* 75 | X0408870Y0025674D01* 76 | X0408884Y0025855D01* 77 | X0408894Y0026036D01* 78 | X0408899Y0026218D01* 79 | X0408900Y0026400D01* 80 | X0408900Y0283900D01* 81 | X0408901Y0283900D02* 82 | X0408900Y0284083D01* 83 | X0408894Y0284266D01* 84 | X0408884Y0284449D01* 85 | X0408869Y0284631D01* 86 | X0408850Y0284813D01* 87 | X0408827Y0284994D01* 88 | X0408799Y0285175D01* 89 | X0408766Y0285355D01* 90 | X0408729Y0285535D01* 91 | X0408688Y0285713D01* 92 | X0408643Y0285890D01* 93 | X0408593Y0286066D01* 94 | X0408539Y0286241D01* 95 | X0408481Y0286414D01* 96 | X0408418Y0286586D01* 97 | X0408351Y0286756D01* 98 | X0408281Y0286925D01* 99 | X0408206Y0287092D01* 100 | X0408127Y0287257D01* 101 | X0408044Y0287420D01* 102 | X0407957Y0287581D01* 103 | X0407866Y0287740D01* 104 | X0407771Y0287896D01* 105 | X0407672Y0288050D01* 106 | X0407570Y0288202D01* 107 | X0407464Y0288351D01* 108 | X0407355Y0288498D01* 109 | X0407242Y0288642D01* 110 | X0407125Y0288783D01* 111 | X0407005Y0288921D01* 112 | X0406882Y0289056D01* 113 | X0406755Y0289188D01* 114 | X0406625Y0289317D01* 115 | X0406492Y0289442D01* 116 | X0406356Y0289565D01* 117 | X0406217Y0289684D01* 118 | X0406076Y0289800D01* 119 | X0405931Y0289912D01* 120 | X0405784Y0290020D01* 121 | X0405634Y0290125D01* 122 | X0405482Y0290227D01* 123 | X0405327Y0290324D01* 124 | X0405170Y0290418D01* 125 | X0405010Y0290508D01* 126 | X0404849Y0290594D01* 127 | X0404685Y0290676D01* 128 | X0404520Y0290753D01* 129 | X0404352Y0290827D01* 130 | X0404183Y0290897D01* 131 | X0404013Y0290963D01* 132 | X0403840Y0291024D01* 133 | X0403666Y0291081D01* 134 | X0403491Y0291134D01* 135 | X0403315Y0291183D01* 136 | X0403137Y0291227D01* 137 | X0402959Y0291267D01* 138 | X0402779Y0291302D01* 139 | X0402599Y0291334D01* 140 | X0402418Y0291360D01* 141 | X0402237Y0291383D01* 142 | X0402054Y0291401D01* 143 | X0401872Y0291414D01* 144 | X0401689Y0291423D01* 145 | X0401506Y0291427D01* 146 | X0401323Y0291427D01* 147 | X0401141Y0291423D01* 148 | X0400958Y0291414D01* 149 | X0400775Y0291401D01* 150 | X0400775Y0291400D02* 151 | X0022650Y0291400D01* 152 | X0022650Y0291401D02* 153 | X0022468Y0291400D01* 154 | X0022286Y0291395D01* 155 | X0022105Y0291385D01* 156 | X0021924Y0291371D01* 157 | X0021743Y0291353D01* 158 | X0021563Y0291330D01* 159 | X0021383Y0291303D01* 160 | X0021204Y0291271D01* 161 | X0021026Y0291235D01* 162 | X0020849Y0291195D01* 163 | X0020673Y0291150D01* 164 | X0020498Y0291102D01* 165 | X0020324Y0291048D01* 166 | X0020152Y0290991D01* 167 | X0019981Y0290930D01* 168 | X0019812Y0290864D01* 169 | X0019644Y0290794D01* 170 | X0019478Y0290720D01* 171 | X0019314Y0290642D01* 172 | X0019152Y0290560D01* 173 | X0018992Y0290474D01* 174 | X0018834Y0290385D01* 175 | X0018678Y0290291D01* 176 | X0018525Y0290194D01* 177 | X0018374Y0290093D01* 178 | X0018225Y0289988D01* 179 | X0018079Y0289879D01* 180 | X0017936Y0289768D01* 181 | X0017796Y0289652D01* 182 | X0017658Y0289534D01* 183 | X0017524Y0289412D01* 184 | X0017392Y0289286D01* 185 | X0017264Y0289158D01* 186 | X0017138Y0289026D01* 187 | X0017016Y0288892D01* 188 | X0016898Y0288754D01* 189 | X0016782Y0288614D01* 190 | X0016671Y0288471D01* 191 | X0016562Y0288325D01* 192 | X0016457Y0288176D01* 193 | X0016356Y0288025D01* 194 | X0016259Y0287872D01* 195 | X0016165Y0287716D01* 196 | X0016076Y0287558D01* 197 | X0015990Y0287398D01* 198 | X0015908Y0287236D01* 199 | X0015830Y0287072D01* 200 | X0015756Y0286906D01* 201 | X0015686Y0286738D01* 202 | X0015620Y0286569D01* 203 | X0015559Y0286398D01* 204 | X0015502Y0286226D01* 205 | X0015448Y0286052D01* 206 | X0015400Y0285877D01* 207 | X0015355Y0285701D01* 208 | X0015315Y0285524D01* 209 | X0015279Y0285346D01* 210 | X0015247Y0285167D01* 211 | X0015220Y0284987D01* 212 | X0015197Y0284807D01* 213 | X0015179Y0284626D01* 214 | X0015165Y0284445D01* 215 | X0015155Y0284264D01* 216 | X0015150Y0284082D01* 217 | X0015149Y0283900D01* 218 | X0015150Y0283900D02* 219 | X0015150Y0026400D01* 220 | X0015150Y0026399D02* 221 | X0015144Y0026224D01* 222 | X0015143Y0026049D01* 223 | X0015146Y0025873D01* 224 | X0015154Y0025698D01* 225 | X0015165Y0025523D01* 226 | X0015181Y0025349D01* 227 | X0015201Y0025174D01* 228 | X0015225Y0025001D01* 229 | X0015254Y0024828D01* 230 | X0015287Y0024655D01* 231 | X0015324Y0024484D01* 232 | X0015365Y0024314D01* 233 | X0015410Y0024144D01* 234 | X0015460Y0023976D01* 235 | X0015513Y0023809D01* 236 | X0015571Y0023643D01* 237 | X0015632Y0023479D01* 238 | X0015698Y0023316D01* 239 | X0015767Y0023155D01* 240 | X0015841Y0022996D01* 241 | X0015918Y0022839D01* 242 | X0015999Y0022683D01* 243 | X0016084Y0022530D01* 244 | X0016173Y0022378D01* 245 | X0016265Y0022229D01* 246 | X0016361Y0022082D01* 247 | X0016460Y0021938D01* 248 | X0016563Y0021796D01* 249 | X0016669Y0021656D01* 250 | X0016779Y0021519D01* 251 | X0016892Y0021385D01* 252 | X0017008Y0021254D01* 253 | X0017128Y0021126D01* 254 | X0017250Y0021000D01* 255 | X0017376Y0020878D01* 256 | X0017504Y0020758D01* 257 | X0017635Y0020642D01* 258 | X0017769Y0020529D01* 259 | X0017906Y0020419D01* 260 | X0018046Y0020313D01* 261 | X0018188Y0020210D01* 262 | X0018332Y0020111D01* 263 | X0018479Y0020015D01* 264 | X0018628Y0019923D01* 265 | X0018780Y0019834D01* 266 | X0018933Y0019749D01* 267 | X0019089Y0019668D01* 268 | X0019246Y0019591D01* 269 | X0019405Y0019517D01* 270 | X0019566Y0019448D01* 271 | X0019729Y0019382D01* 272 | X0019893Y0019321D01* 273 | X0020059Y0019263D01* 274 | X0020226Y0019210D01* 275 | X0020394Y0019160D01* 276 | X0020564Y0019115D01* 277 | X0020734Y0019074D01* 278 | X0020905Y0019037D01* 279 | X0021078Y0019004D01* 280 | X0021251Y0018975D01* 281 | X0021424Y0018951D01* 282 | X0021599Y0018931D01* 283 | X0021773Y0018915D01* 284 | X0021948Y0018904D01* 285 | X0022123Y0018896D01* 286 | X0022299Y0018893D01* 287 | X0022474Y0018894D01* 288 | X0022649Y0018900D01* 289 | X0101863Y0245632D02* 290 | X0101865Y0245757D01* 291 | X0101871Y0245882D01* 292 | X0101881Y0246006D01* 293 | X0101895Y0246130D01* 294 | X0101912Y0246254D01* 295 | X0101934Y0246377D01* 296 | X0101960Y0246499D01* 297 | X0101989Y0246621D01* 298 | X0102022Y0246741D01* 299 | X0102060Y0246860D01* 300 | X0102100Y0246979D01* 301 | X0102145Y0247095D01* 302 | X0102193Y0247210D01* 303 | X0102245Y0247324D01* 304 | X0102301Y0247436D01* 305 | X0102360Y0247546D01* 306 | X0102422Y0247654D01* 307 | X0102488Y0247761D01* 308 | X0102557Y0247865D01* 309 | X0102630Y0247966D01* 310 | X0102705Y0248066D01* 311 | X0102784Y0248163D01* 312 | X0102866Y0248257D01* 313 | X0102951Y0248349D01* 314 | X0103038Y0248438D01* 315 | X0103129Y0248524D01* 316 | X0103222Y0248607D01* 317 | X0103318Y0248688D01* 318 | X0103416Y0248765D01* 319 | X0103516Y0248839D01* 320 | X0103619Y0248910D01* 321 | X0103724Y0248977D01* 322 | X0103832Y0249042D01* 323 | X0103941Y0249102D01* 324 | X0104052Y0249160D01* 325 | X0104165Y0249213D01* 326 | X0104279Y0249263D01* 327 | X0104395Y0249310D01* 328 | X0104512Y0249352D01* 329 | X0104631Y0249391D01* 330 | X0104751Y0249427D01* 331 | X0104872Y0249458D01* 332 | X0104994Y0249486D01* 333 | X0105116Y0249509D01* 334 | X0105240Y0249529D01* 335 | X0105364Y0249545D01* 336 | X0105488Y0249557D01* 337 | X0105613Y0249565D01* 338 | X0105738Y0249569D01* 339 | X0105862Y0249569D01* 340 | X0105987Y0249565D01* 341 | X0106112Y0249557D01* 342 | X0106236Y0249545D01* 343 | X0106360Y0249529D01* 344 | X0106484Y0249509D01* 345 | X0106606Y0249486D01* 346 | X0106728Y0249458D01* 347 | X0106849Y0249427D01* 348 | X0106969Y0249391D01* 349 | X0107088Y0249352D01* 350 | X0107205Y0249310D01* 351 | X0107321Y0249263D01* 352 | X0107435Y0249213D01* 353 | X0107548Y0249160D01* 354 | X0107659Y0249102D01* 355 | X0107769Y0249042D01* 356 | X0107876Y0248977D01* 357 | X0107981Y0248910D01* 358 | X0108084Y0248839D01* 359 | X0108184Y0248765D01* 360 | X0108282Y0248688D01* 361 | X0108378Y0248607D01* 362 | X0108471Y0248524D01* 363 | X0108562Y0248438D01* 364 | X0108649Y0248349D01* 365 | X0108734Y0248257D01* 366 | X0108816Y0248163D01* 367 | X0108895Y0248066D01* 368 | X0108970Y0247966D01* 369 | X0109043Y0247865D01* 370 | X0109112Y0247761D01* 371 | X0109178Y0247654D01* 372 | X0109240Y0247546D01* 373 | X0109299Y0247436D01* 374 | X0109355Y0247324D01* 375 | X0109407Y0247210D01* 376 | X0109455Y0247095D01* 377 | X0109500Y0246979D01* 378 | X0109540Y0246860D01* 379 | X0109578Y0246741D01* 380 | X0109611Y0246621D01* 381 | X0109640Y0246499D01* 382 | X0109666Y0246377D01* 383 | X0109688Y0246254D01* 384 | X0109705Y0246130D01* 385 | X0109719Y0246006D01* 386 | X0109729Y0245882D01* 387 | X0109735Y0245757D01* 388 | X0109737Y0245632D01* 389 | X0109735Y0245507D01* 390 | X0109729Y0245382D01* 391 | X0109719Y0245258D01* 392 | X0109705Y0245134D01* 393 | X0109688Y0245010D01* 394 | X0109666Y0244887D01* 395 | X0109640Y0244765D01* 396 | X0109611Y0244643D01* 397 | X0109578Y0244523D01* 398 | X0109540Y0244404D01* 399 | X0109500Y0244285D01* 400 | X0109455Y0244169D01* 401 | X0109407Y0244054D01* 402 | X0109355Y0243940D01* 403 | X0109299Y0243828D01* 404 | X0109240Y0243718D01* 405 | X0109178Y0243610D01* 406 | X0109112Y0243503D01* 407 | X0109043Y0243399D01* 408 | X0108970Y0243298D01* 409 | X0108895Y0243198D01* 410 | X0108816Y0243101D01* 411 | X0108734Y0243007D01* 412 | X0108649Y0242915D01* 413 | X0108562Y0242826D01* 414 | X0108471Y0242740D01* 415 | X0108378Y0242657D01* 416 | X0108282Y0242576D01* 417 | X0108184Y0242499D01* 418 | X0108084Y0242425D01* 419 | X0107981Y0242354D01* 420 | X0107876Y0242287D01* 421 | X0107768Y0242222D01* 422 | X0107659Y0242162D01* 423 | X0107548Y0242104D01* 424 | X0107435Y0242051D01* 425 | X0107321Y0242001D01* 426 | X0107205Y0241954D01* 427 | X0107088Y0241912D01* 428 | X0106969Y0241873D01* 429 | X0106849Y0241837D01* 430 | X0106728Y0241806D01* 431 | X0106606Y0241778D01* 432 | X0106484Y0241755D01* 433 | X0106360Y0241735D01* 434 | X0106236Y0241719D01* 435 | X0106112Y0241707D01* 436 | X0105987Y0241699D01* 437 | X0105862Y0241695D01* 438 | X0105738Y0241695D01* 439 | X0105613Y0241699D01* 440 | X0105488Y0241707D01* 441 | X0105364Y0241719D01* 442 | X0105240Y0241735D01* 443 | X0105116Y0241755D01* 444 | X0104994Y0241778D01* 445 | X0104872Y0241806D01* 446 | X0104751Y0241837D01* 447 | X0104631Y0241873D01* 448 | X0104512Y0241912D01* 449 | X0104395Y0241954D01* 450 | X0104279Y0242001D01* 451 | X0104165Y0242051D01* 452 | X0104052Y0242104D01* 453 | X0103941Y0242162D01* 454 | X0103831Y0242222D01* 455 | X0103724Y0242287D01* 456 | X0103619Y0242354D01* 457 | X0103516Y0242425D01* 458 | X0103416Y0242499D01* 459 | X0103318Y0242576D01* 460 | X0103222Y0242657D01* 461 | X0103129Y0242740D01* 462 | X0103038Y0242826D01* 463 | X0102951Y0242915D01* 464 | X0102866Y0243007D01* 465 | X0102784Y0243101D01* 466 | X0102705Y0243198D01* 467 | X0102630Y0243298D01* 468 | X0102557Y0243399D01* 469 | X0102488Y0243503D01* 470 | X0102422Y0243610D01* 471 | X0102360Y0243718D01* 472 | X0102301Y0243828D01* 473 | X0102245Y0243940D01* 474 | X0102193Y0244054D01* 475 | X0102145Y0244169D01* 476 | X0102100Y0244285D01* 477 | X0102060Y0244404D01* 478 | X0102022Y0244523D01* 479 | X0101989Y0244643D01* 480 | X0101960Y0244765D01* 481 | X0101934Y0244887D01* 482 | X0101912Y0245010D01* 483 | X0101895Y0245134D01* 484 | X0101881Y0245258D01* 485 | X0101871Y0245382D01* 486 | X0101865Y0245507D01* 487 | X0101863Y0245632D01* 488 | X0311863Y0245632D02* 489 | X0311865Y0245757D01* 490 | X0311871Y0245882D01* 491 | X0311881Y0246006D01* 492 | X0311895Y0246130D01* 493 | X0311912Y0246254D01* 494 | X0311934Y0246377D01* 495 | X0311960Y0246499D01* 496 | X0311989Y0246621D01* 497 | X0312022Y0246741D01* 498 | X0312060Y0246860D01* 499 | X0312100Y0246979D01* 500 | X0312145Y0247095D01* 501 | X0312193Y0247210D01* 502 | X0312245Y0247324D01* 503 | X0312301Y0247436D01* 504 | X0312360Y0247546D01* 505 | X0312422Y0247654D01* 506 | X0312488Y0247761D01* 507 | X0312557Y0247865D01* 508 | X0312630Y0247966D01* 509 | X0312705Y0248066D01* 510 | X0312784Y0248163D01* 511 | X0312866Y0248257D01* 512 | X0312951Y0248349D01* 513 | X0313038Y0248438D01* 514 | X0313129Y0248524D01* 515 | X0313222Y0248607D01* 516 | X0313318Y0248688D01* 517 | X0313416Y0248765D01* 518 | X0313516Y0248839D01* 519 | X0313619Y0248910D01* 520 | X0313724Y0248977D01* 521 | X0313832Y0249042D01* 522 | X0313941Y0249102D01* 523 | X0314052Y0249160D01* 524 | X0314165Y0249213D01* 525 | X0314279Y0249263D01* 526 | X0314395Y0249310D01* 527 | X0314512Y0249352D01* 528 | X0314631Y0249391D01* 529 | X0314751Y0249427D01* 530 | X0314872Y0249458D01* 531 | X0314994Y0249486D01* 532 | X0315116Y0249509D01* 533 | X0315240Y0249529D01* 534 | X0315364Y0249545D01* 535 | X0315488Y0249557D01* 536 | X0315613Y0249565D01* 537 | X0315738Y0249569D01* 538 | X0315862Y0249569D01* 539 | X0315987Y0249565D01* 540 | X0316112Y0249557D01* 541 | X0316236Y0249545D01* 542 | X0316360Y0249529D01* 543 | X0316484Y0249509D01* 544 | X0316606Y0249486D01* 545 | X0316728Y0249458D01* 546 | X0316849Y0249427D01* 547 | X0316969Y0249391D01* 548 | X0317088Y0249352D01* 549 | X0317205Y0249310D01* 550 | X0317321Y0249263D01* 551 | X0317435Y0249213D01* 552 | X0317548Y0249160D01* 553 | X0317659Y0249102D01* 554 | X0317769Y0249042D01* 555 | X0317876Y0248977D01* 556 | X0317981Y0248910D01* 557 | X0318084Y0248839D01* 558 | X0318184Y0248765D01* 559 | X0318282Y0248688D01* 560 | X0318378Y0248607D01* 561 | X0318471Y0248524D01* 562 | X0318562Y0248438D01* 563 | X0318649Y0248349D01* 564 | X0318734Y0248257D01* 565 | X0318816Y0248163D01* 566 | X0318895Y0248066D01* 567 | X0318970Y0247966D01* 568 | X0319043Y0247865D01* 569 | X0319112Y0247761D01* 570 | X0319178Y0247654D01* 571 | X0319240Y0247546D01* 572 | X0319299Y0247436D01* 573 | X0319355Y0247324D01* 574 | X0319407Y0247210D01* 575 | X0319455Y0247095D01* 576 | X0319500Y0246979D01* 577 | X0319540Y0246860D01* 578 | X0319578Y0246741D01* 579 | X0319611Y0246621D01* 580 | X0319640Y0246499D01* 581 | X0319666Y0246377D01* 582 | X0319688Y0246254D01* 583 | X0319705Y0246130D01* 584 | X0319719Y0246006D01* 585 | X0319729Y0245882D01* 586 | X0319735Y0245757D01* 587 | X0319737Y0245632D01* 588 | X0319735Y0245507D01* 589 | X0319729Y0245382D01* 590 | X0319719Y0245258D01* 591 | X0319705Y0245134D01* 592 | X0319688Y0245010D01* 593 | X0319666Y0244887D01* 594 | X0319640Y0244765D01* 595 | X0319611Y0244643D01* 596 | X0319578Y0244523D01* 597 | X0319540Y0244404D01* 598 | X0319500Y0244285D01* 599 | X0319455Y0244169D01* 600 | X0319407Y0244054D01* 601 | X0319355Y0243940D01* 602 | X0319299Y0243828D01* 603 | X0319240Y0243718D01* 604 | X0319178Y0243610D01* 605 | X0319112Y0243503D01* 606 | X0319043Y0243399D01* 607 | X0318970Y0243298D01* 608 | X0318895Y0243198D01* 609 | X0318816Y0243101D01* 610 | X0318734Y0243007D01* 611 | X0318649Y0242915D01* 612 | X0318562Y0242826D01* 613 | X0318471Y0242740D01* 614 | X0318378Y0242657D01* 615 | X0318282Y0242576D01* 616 | X0318184Y0242499D01* 617 | X0318084Y0242425D01* 618 | X0317981Y0242354D01* 619 | X0317876Y0242287D01* 620 | X0317768Y0242222D01* 621 | X0317659Y0242162D01* 622 | X0317548Y0242104D01* 623 | X0317435Y0242051D01* 624 | X0317321Y0242001D01* 625 | X0317205Y0241954D01* 626 | X0317088Y0241912D01* 627 | X0316969Y0241873D01* 628 | X0316849Y0241837D01* 629 | X0316728Y0241806D01* 630 | X0316606Y0241778D01* 631 | X0316484Y0241755D01* 632 | X0316360Y0241735D01* 633 | X0316236Y0241719D01* 634 | X0316112Y0241707D01* 635 | X0315987Y0241699D01* 636 | X0315862Y0241695D01* 637 | X0315738Y0241695D01* 638 | X0315613Y0241699D01* 639 | X0315488Y0241707D01* 640 | X0315364Y0241719D01* 641 | X0315240Y0241735D01* 642 | X0315116Y0241755D01* 643 | X0314994Y0241778D01* 644 | X0314872Y0241806D01* 645 | X0314751Y0241837D01* 646 | X0314631Y0241873D01* 647 | X0314512Y0241912D01* 648 | X0314395Y0241954D01* 649 | X0314279Y0242001D01* 650 | X0314165Y0242051D01* 651 | X0314052Y0242104D01* 652 | X0313941Y0242162D01* 653 | X0313831Y0242222D01* 654 | X0313724Y0242287D01* 655 | X0313619Y0242354D01* 656 | X0313516Y0242425D01* 657 | X0313416Y0242499D01* 658 | X0313318Y0242576D01* 659 | X0313222Y0242657D01* 660 | X0313129Y0242740D01* 661 | X0313038Y0242826D01* 662 | X0312951Y0242915D01* 663 | X0312866Y0243007D01* 664 | X0312784Y0243101D01* 665 | X0312705Y0243198D01* 666 | X0312630Y0243298D01* 667 | X0312557Y0243399D01* 668 | X0312488Y0243503D01* 669 | X0312422Y0243610D01* 670 | X0312360Y0243718D01* 671 | X0312301Y0243828D01* 672 | X0312245Y0243940D01* 673 | X0312193Y0244054D01* 674 | X0312145Y0244169D01* 675 | X0312100Y0244285D01* 676 | X0312060Y0244404D01* 677 | X0312022Y0244523D01* 678 | X0311989Y0244643D01* 679 | X0311960Y0244765D01* 680 | X0311934Y0244887D01* 681 | X0311912Y0245010D01* 682 | X0311895Y0245134D01* 683 | X0311881Y0245258D01* 684 | X0311871Y0245382D01* 685 | X0311865Y0245507D01* 686 | X0311863Y0245632D01* 687 | M02* 688 | -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.GML: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX25Y25*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.00000*% 11 | D10* 12 | X0022650Y0018900D02* 13 | X0401400Y0018900D01* 14 | X0401399Y0018899D02* 15 | X0401581Y0018900D01* 16 | X0401763Y0018905D01* 17 | X0401944Y0018915D01* 18 | X0402125Y0018929D01* 19 | X0402306Y0018947D01* 20 | X0402486Y0018970D01* 21 | X0402666Y0018997D01* 22 | X0402845Y0019029D01* 23 | X0403023Y0019065D01* 24 | X0403200Y0019105D01* 25 | X0403376Y0019150D01* 26 | X0403551Y0019198D01* 27 | X0403725Y0019252D01* 28 | X0403897Y0019309D01* 29 | X0404068Y0019370D01* 30 | X0404237Y0019436D01* 31 | X0404405Y0019506D01* 32 | X0404571Y0019580D01* 33 | X0404735Y0019658D01* 34 | X0404897Y0019740D01* 35 | X0405057Y0019826D01* 36 | X0405215Y0019915D01* 37 | X0405371Y0020009D01* 38 | X0405524Y0020106D01* 39 | X0405675Y0020207D01* 40 | X0405824Y0020312D01* 41 | X0405970Y0020421D01* 42 | X0406113Y0020532D01* 43 | X0406253Y0020648D01* 44 | X0406391Y0020766D01* 45 | X0406525Y0020888D01* 46 | X0406657Y0021014D01* 47 | X0406785Y0021142D01* 48 | X0406911Y0021274D01* 49 | X0407033Y0021408D01* 50 | X0407151Y0021546D01* 51 | X0407267Y0021686D01* 52 | X0407378Y0021829D01* 53 | X0407487Y0021975D01* 54 | X0407592Y0022124D01* 55 | X0407693Y0022275D01* 56 | X0407790Y0022428D01* 57 | X0407884Y0022584D01* 58 | X0407973Y0022742D01* 59 | X0408059Y0022902D01* 60 | X0408141Y0023064D01* 61 | X0408219Y0023228D01* 62 | X0408293Y0023394D01* 63 | X0408363Y0023562D01* 64 | X0408429Y0023731D01* 65 | X0408490Y0023902D01* 66 | X0408547Y0024074D01* 67 | X0408601Y0024248D01* 68 | X0408649Y0024423D01* 69 | X0408694Y0024599D01* 70 | X0408734Y0024776D01* 71 | X0408770Y0024954D01* 72 | X0408802Y0025133D01* 73 | X0408829Y0025313D01* 74 | X0408852Y0025493D01* 75 | X0408870Y0025674D01* 76 | X0408884Y0025855D01* 77 | X0408894Y0026036D01* 78 | X0408899Y0026218D01* 79 | X0408900Y0026400D01* 80 | X0408900Y0283900D01* 81 | X0408901Y0283900D02* 82 | X0408900Y0284083D01* 83 | X0408894Y0284266D01* 84 | X0408884Y0284449D01* 85 | X0408869Y0284631D01* 86 | X0408850Y0284813D01* 87 | X0408827Y0284994D01* 88 | X0408799Y0285175D01* 89 | X0408766Y0285355D01* 90 | X0408729Y0285535D01* 91 | X0408688Y0285713D01* 92 | X0408643Y0285890D01* 93 | X0408593Y0286066D01* 94 | X0408539Y0286241D01* 95 | X0408481Y0286414D01* 96 | X0408418Y0286586D01* 97 | X0408351Y0286756D01* 98 | X0408281Y0286925D01* 99 | X0408206Y0287092D01* 100 | X0408127Y0287257D01* 101 | X0408044Y0287420D01* 102 | X0407957Y0287581D01* 103 | X0407866Y0287740D01* 104 | X0407771Y0287896D01* 105 | X0407672Y0288050D01* 106 | X0407570Y0288202D01* 107 | X0407464Y0288351D01* 108 | X0407355Y0288498D01* 109 | X0407242Y0288642D01* 110 | X0407125Y0288783D01* 111 | X0407005Y0288921D01* 112 | X0406882Y0289056D01* 113 | X0406755Y0289188D01* 114 | X0406625Y0289317D01* 115 | X0406492Y0289442D01* 116 | X0406356Y0289565D01* 117 | X0406217Y0289684D01* 118 | X0406076Y0289800D01* 119 | X0405931Y0289912D01* 120 | X0405784Y0290020D01* 121 | X0405634Y0290125D01* 122 | X0405482Y0290227D01* 123 | X0405327Y0290324D01* 124 | X0405170Y0290418D01* 125 | X0405010Y0290508D01* 126 | X0404849Y0290594D01* 127 | X0404685Y0290676D01* 128 | X0404520Y0290753D01* 129 | X0404352Y0290827D01* 130 | X0404183Y0290897D01* 131 | X0404013Y0290963D01* 132 | X0403840Y0291024D01* 133 | X0403666Y0291081D01* 134 | X0403491Y0291134D01* 135 | X0403315Y0291183D01* 136 | X0403137Y0291227D01* 137 | X0402959Y0291267D01* 138 | X0402779Y0291302D01* 139 | X0402599Y0291334D01* 140 | X0402418Y0291360D01* 141 | X0402237Y0291383D01* 142 | X0402054Y0291401D01* 143 | X0401872Y0291414D01* 144 | X0401689Y0291423D01* 145 | X0401506Y0291427D01* 146 | X0401323Y0291427D01* 147 | X0401141Y0291423D01* 148 | X0400958Y0291414D01* 149 | X0400775Y0291401D01* 150 | X0400775Y0291400D02* 151 | X0022650Y0291400D01* 152 | X0022650Y0291401D02* 153 | X0022468Y0291400D01* 154 | X0022286Y0291395D01* 155 | X0022105Y0291385D01* 156 | X0021924Y0291371D01* 157 | X0021743Y0291353D01* 158 | X0021563Y0291330D01* 159 | X0021383Y0291303D01* 160 | X0021204Y0291271D01* 161 | X0021026Y0291235D01* 162 | X0020849Y0291195D01* 163 | X0020673Y0291150D01* 164 | X0020498Y0291102D01* 165 | X0020324Y0291048D01* 166 | X0020152Y0290991D01* 167 | X0019981Y0290930D01* 168 | X0019812Y0290864D01* 169 | X0019644Y0290794D01* 170 | X0019478Y0290720D01* 171 | X0019314Y0290642D01* 172 | X0019152Y0290560D01* 173 | X0018992Y0290474D01* 174 | X0018834Y0290385D01* 175 | X0018678Y0290291D01* 176 | X0018525Y0290194D01* 177 | X0018374Y0290093D01* 178 | X0018225Y0289988D01* 179 | X0018079Y0289879D01* 180 | X0017936Y0289768D01* 181 | X0017796Y0289652D01* 182 | X0017658Y0289534D01* 183 | X0017524Y0289412D01* 184 | X0017392Y0289286D01* 185 | X0017264Y0289158D01* 186 | X0017138Y0289026D01* 187 | X0017016Y0288892D01* 188 | X0016898Y0288754D01* 189 | X0016782Y0288614D01* 190 | X0016671Y0288471D01* 191 | X0016562Y0288325D01* 192 | X0016457Y0288176D01* 193 | X0016356Y0288025D01* 194 | X0016259Y0287872D01* 195 | X0016165Y0287716D01* 196 | X0016076Y0287558D01* 197 | X0015990Y0287398D01* 198 | X0015908Y0287236D01* 199 | X0015830Y0287072D01* 200 | X0015756Y0286906D01* 201 | X0015686Y0286738D01* 202 | X0015620Y0286569D01* 203 | X0015559Y0286398D01* 204 | X0015502Y0286226D01* 205 | X0015448Y0286052D01* 206 | X0015400Y0285877D01* 207 | X0015355Y0285701D01* 208 | X0015315Y0285524D01* 209 | X0015279Y0285346D01* 210 | X0015247Y0285167D01* 211 | X0015220Y0284987D01* 212 | X0015197Y0284807D01* 213 | X0015179Y0284626D01* 214 | X0015165Y0284445D01* 215 | X0015155Y0284264D01* 216 | X0015150Y0284082D01* 217 | X0015149Y0283900D01* 218 | X0015150Y0283900D02* 219 | X0015150Y0026400D01* 220 | X0015150Y0026399D02* 221 | X0015144Y0026224D01* 222 | X0015143Y0026049D01* 223 | X0015146Y0025873D01* 224 | X0015154Y0025698D01* 225 | X0015165Y0025523D01* 226 | X0015181Y0025349D01* 227 | X0015201Y0025174D01* 228 | X0015225Y0025001D01* 229 | X0015254Y0024828D01* 230 | X0015287Y0024655D01* 231 | X0015324Y0024484D01* 232 | X0015365Y0024314D01* 233 | X0015410Y0024144D01* 234 | X0015460Y0023976D01* 235 | X0015513Y0023809D01* 236 | X0015571Y0023643D01* 237 | X0015632Y0023479D01* 238 | X0015698Y0023316D01* 239 | X0015767Y0023155D01* 240 | X0015841Y0022996D01* 241 | X0015918Y0022839D01* 242 | X0015999Y0022683D01* 243 | X0016084Y0022530D01* 244 | X0016173Y0022378D01* 245 | X0016265Y0022229D01* 246 | X0016361Y0022082D01* 247 | X0016460Y0021938D01* 248 | X0016563Y0021796D01* 249 | X0016669Y0021656D01* 250 | X0016779Y0021519D01* 251 | X0016892Y0021385D01* 252 | X0017008Y0021254D01* 253 | X0017128Y0021126D01* 254 | X0017250Y0021000D01* 255 | X0017376Y0020878D01* 256 | X0017504Y0020758D01* 257 | X0017635Y0020642D01* 258 | X0017769Y0020529D01* 259 | X0017906Y0020419D01* 260 | X0018046Y0020313D01* 261 | X0018188Y0020210D01* 262 | X0018332Y0020111D01* 263 | X0018479Y0020015D01* 264 | X0018628Y0019923D01* 265 | X0018780Y0019834D01* 266 | X0018933Y0019749D01* 267 | X0019089Y0019668D01* 268 | X0019246Y0019591D01* 269 | X0019405Y0019517D01* 270 | X0019566Y0019448D01* 271 | X0019729Y0019382D01* 272 | X0019893Y0019321D01* 273 | X0020059Y0019263D01* 274 | X0020226Y0019210D01* 275 | X0020394Y0019160D01* 276 | X0020564Y0019115D01* 277 | X0020734Y0019074D01* 278 | X0020905Y0019037D01* 279 | X0021078Y0019004D01* 280 | X0021251Y0018975D01* 281 | X0021424Y0018951D01* 282 | X0021599Y0018931D01* 283 | X0021773Y0018915D01* 284 | X0021948Y0018904D01* 285 | X0022123Y0018896D01* 286 | X0022299Y0018893D01* 287 | X0022474Y0018894D01* 288 | X0022649Y0018900D01* 289 | X0101863Y0245632D02* 290 | X0101865Y0245757D01* 291 | X0101871Y0245882D01* 292 | X0101881Y0246006D01* 293 | X0101895Y0246130D01* 294 | X0101912Y0246254D01* 295 | X0101934Y0246377D01* 296 | X0101960Y0246499D01* 297 | X0101989Y0246621D01* 298 | X0102022Y0246741D01* 299 | X0102060Y0246860D01* 300 | X0102100Y0246979D01* 301 | X0102145Y0247095D01* 302 | X0102193Y0247210D01* 303 | X0102245Y0247324D01* 304 | X0102301Y0247436D01* 305 | X0102360Y0247546D01* 306 | X0102422Y0247654D01* 307 | X0102488Y0247761D01* 308 | X0102557Y0247865D01* 309 | X0102630Y0247966D01* 310 | X0102705Y0248066D01* 311 | X0102784Y0248163D01* 312 | X0102866Y0248257D01* 313 | X0102951Y0248349D01* 314 | X0103038Y0248438D01* 315 | X0103129Y0248524D01* 316 | X0103222Y0248607D01* 317 | X0103318Y0248688D01* 318 | X0103416Y0248765D01* 319 | X0103516Y0248839D01* 320 | X0103619Y0248910D01* 321 | X0103724Y0248977D01* 322 | X0103832Y0249042D01* 323 | X0103941Y0249102D01* 324 | X0104052Y0249160D01* 325 | X0104165Y0249213D01* 326 | X0104279Y0249263D01* 327 | X0104395Y0249310D01* 328 | X0104512Y0249352D01* 329 | X0104631Y0249391D01* 330 | X0104751Y0249427D01* 331 | X0104872Y0249458D01* 332 | X0104994Y0249486D01* 333 | X0105116Y0249509D01* 334 | X0105240Y0249529D01* 335 | X0105364Y0249545D01* 336 | X0105488Y0249557D01* 337 | X0105613Y0249565D01* 338 | X0105738Y0249569D01* 339 | X0105862Y0249569D01* 340 | X0105987Y0249565D01* 341 | X0106112Y0249557D01* 342 | X0106236Y0249545D01* 343 | X0106360Y0249529D01* 344 | X0106484Y0249509D01* 345 | X0106606Y0249486D01* 346 | X0106728Y0249458D01* 347 | X0106849Y0249427D01* 348 | X0106969Y0249391D01* 349 | X0107088Y0249352D01* 350 | X0107205Y0249310D01* 351 | X0107321Y0249263D01* 352 | X0107435Y0249213D01* 353 | X0107548Y0249160D01* 354 | X0107659Y0249102D01* 355 | X0107769Y0249042D01* 356 | X0107876Y0248977D01* 357 | X0107981Y0248910D01* 358 | X0108084Y0248839D01* 359 | X0108184Y0248765D01* 360 | X0108282Y0248688D01* 361 | X0108378Y0248607D01* 362 | X0108471Y0248524D01* 363 | X0108562Y0248438D01* 364 | X0108649Y0248349D01* 365 | X0108734Y0248257D01* 366 | X0108816Y0248163D01* 367 | X0108895Y0248066D01* 368 | X0108970Y0247966D01* 369 | X0109043Y0247865D01* 370 | X0109112Y0247761D01* 371 | X0109178Y0247654D01* 372 | X0109240Y0247546D01* 373 | X0109299Y0247436D01* 374 | X0109355Y0247324D01* 375 | X0109407Y0247210D01* 376 | X0109455Y0247095D01* 377 | X0109500Y0246979D01* 378 | X0109540Y0246860D01* 379 | X0109578Y0246741D01* 380 | X0109611Y0246621D01* 381 | X0109640Y0246499D01* 382 | X0109666Y0246377D01* 383 | X0109688Y0246254D01* 384 | X0109705Y0246130D01* 385 | X0109719Y0246006D01* 386 | X0109729Y0245882D01* 387 | X0109735Y0245757D01* 388 | X0109737Y0245632D01* 389 | X0109735Y0245507D01* 390 | X0109729Y0245382D01* 391 | X0109719Y0245258D01* 392 | X0109705Y0245134D01* 393 | X0109688Y0245010D01* 394 | X0109666Y0244887D01* 395 | X0109640Y0244765D01* 396 | X0109611Y0244643D01* 397 | X0109578Y0244523D01* 398 | X0109540Y0244404D01* 399 | X0109500Y0244285D01* 400 | X0109455Y0244169D01* 401 | X0109407Y0244054D01* 402 | X0109355Y0243940D01* 403 | X0109299Y0243828D01* 404 | X0109240Y0243718D01* 405 | X0109178Y0243610D01* 406 | X0109112Y0243503D01* 407 | X0109043Y0243399D01* 408 | X0108970Y0243298D01* 409 | X0108895Y0243198D01* 410 | X0108816Y0243101D01* 411 | X0108734Y0243007D01* 412 | X0108649Y0242915D01* 413 | X0108562Y0242826D01* 414 | X0108471Y0242740D01* 415 | X0108378Y0242657D01* 416 | X0108282Y0242576D01* 417 | X0108184Y0242499D01* 418 | X0108084Y0242425D01* 419 | X0107981Y0242354D01* 420 | X0107876Y0242287D01* 421 | X0107768Y0242222D01* 422 | X0107659Y0242162D01* 423 | X0107548Y0242104D01* 424 | X0107435Y0242051D01* 425 | X0107321Y0242001D01* 426 | X0107205Y0241954D01* 427 | X0107088Y0241912D01* 428 | X0106969Y0241873D01* 429 | X0106849Y0241837D01* 430 | X0106728Y0241806D01* 431 | X0106606Y0241778D01* 432 | X0106484Y0241755D01* 433 | X0106360Y0241735D01* 434 | X0106236Y0241719D01* 435 | X0106112Y0241707D01* 436 | X0105987Y0241699D01* 437 | X0105862Y0241695D01* 438 | X0105738Y0241695D01* 439 | X0105613Y0241699D01* 440 | X0105488Y0241707D01* 441 | X0105364Y0241719D01* 442 | X0105240Y0241735D01* 443 | X0105116Y0241755D01* 444 | X0104994Y0241778D01* 445 | X0104872Y0241806D01* 446 | X0104751Y0241837D01* 447 | X0104631Y0241873D01* 448 | X0104512Y0241912D01* 449 | X0104395Y0241954D01* 450 | X0104279Y0242001D01* 451 | X0104165Y0242051D01* 452 | X0104052Y0242104D01* 453 | X0103941Y0242162D01* 454 | X0103831Y0242222D01* 455 | X0103724Y0242287D01* 456 | X0103619Y0242354D01* 457 | X0103516Y0242425D01* 458 | X0103416Y0242499D01* 459 | X0103318Y0242576D01* 460 | X0103222Y0242657D01* 461 | X0103129Y0242740D01* 462 | X0103038Y0242826D01* 463 | X0102951Y0242915D01* 464 | X0102866Y0243007D01* 465 | X0102784Y0243101D01* 466 | X0102705Y0243198D01* 467 | X0102630Y0243298D01* 468 | X0102557Y0243399D01* 469 | X0102488Y0243503D01* 470 | X0102422Y0243610D01* 471 | X0102360Y0243718D01* 472 | X0102301Y0243828D01* 473 | X0102245Y0243940D01* 474 | X0102193Y0244054D01* 475 | X0102145Y0244169D01* 476 | X0102100Y0244285D01* 477 | X0102060Y0244404D01* 478 | X0102022Y0244523D01* 479 | X0101989Y0244643D01* 480 | X0101960Y0244765D01* 481 | X0101934Y0244887D01* 482 | X0101912Y0245010D01* 483 | X0101895Y0245134D01* 484 | X0101881Y0245258D01* 485 | X0101871Y0245382D01* 486 | X0101865Y0245507D01* 487 | X0101863Y0245632D01* 488 | X0311863Y0245632D02* 489 | X0311865Y0245757D01* 490 | X0311871Y0245882D01* 491 | X0311881Y0246006D01* 492 | X0311895Y0246130D01* 493 | X0311912Y0246254D01* 494 | X0311934Y0246377D01* 495 | X0311960Y0246499D01* 496 | X0311989Y0246621D01* 497 | X0312022Y0246741D01* 498 | X0312060Y0246860D01* 499 | X0312100Y0246979D01* 500 | X0312145Y0247095D01* 501 | X0312193Y0247210D01* 502 | X0312245Y0247324D01* 503 | X0312301Y0247436D01* 504 | X0312360Y0247546D01* 505 | X0312422Y0247654D01* 506 | X0312488Y0247761D01* 507 | X0312557Y0247865D01* 508 | X0312630Y0247966D01* 509 | X0312705Y0248066D01* 510 | X0312784Y0248163D01* 511 | X0312866Y0248257D01* 512 | X0312951Y0248349D01* 513 | X0313038Y0248438D01* 514 | X0313129Y0248524D01* 515 | X0313222Y0248607D01* 516 | X0313318Y0248688D01* 517 | X0313416Y0248765D01* 518 | X0313516Y0248839D01* 519 | X0313619Y0248910D01* 520 | X0313724Y0248977D01* 521 | X0313832Y0249042D01* 522 | X0313941Y0249102D01* 523 | X0314052Y0249160D01* 524 | X0314165Y0249213D01* 525 | X0314279Y0249263D01* 526 | X0314395Y0249310D01* 527 | X0314512Y0249352D01* 528 | X0314631Y0249391D01* 529 | X0314751Y0249427D01* 530 | X0314872Y0249458D01* 531 | X0314994Y0249486D01* 532 | X0315116Y0249509D01* 533 | X0315240Y0249529D01* 534 | X0315364Y0249545D01* 535 | X0315488Y0249557D01* 536 | X0315613Y0249565D01* 537 | X0315738Y0249569D01* 538 | X0315862Y0249569D01* 539 | X0315987Y0249565D01* 540 | X0316112Y0249557D01* 541 | X0316236Y0249545D01* 542 | X0316360Y0249529D01* 543 | X0316484Y0249509D01* 544 | X0316606Y0249486D01* 545 | X0316728Y0249458D01* 546 | X0316849Y0249427D01* 547 | X0316969Y0249391D01* 548 | X0317088Y0249352D01* 549 | X0317205Y0249310D01* 550 | X0317321Y0249263D01* 551 | X0317435Y0249213D01* 552 | X0317548Y0249160D01* 553 | X0317659Y0249102D01* 554 | X0317769Y0249042D01* 555 | X0317876Y0248977D01* 556 | X0317981Y0248910D01* 557 | X0318084Y0248839D01* 558 | X0318184Y0248765D01* 559 | X0318282Y0248688D01* 560 | X0318378Y0248607D01* 561 | X0318471Y0248524D01* 562 | X0318562Y0248438D01* 563 | X0318649Y0248349D01* 564 | X0318734Y0248257D01* 565 | X0318816Y0248163D01* 566 | X0318895Y0248066D01* 567 | X0318970Y0247966D01* 568 | X0319043Y0247865D01* 569 | X0319112Y0247761D01* 570 | X0319178Y0247654D01* 571 | X0319240Y0247546D01* 572 | X0319299Y0247436D01* 573 | X0319355Y0247324D01* 574 | X0319407Y0247210D01* 575 | X0319455Y0247095D01* 576 | X0319500Y0246979D01* 577 | X0319540Y0246860D01* 578 | X0319578Y0246741D01* 579 | X0319611Y0246621D01* 580 | X0319640Y0246499D01* 581 | X0319666Y0246377D01* 582 | X0319688Y0246254D01* 583 | X0319705Y0246130D01* 584 | X0319719Y0246006D01* 585 | X0319729Y0245882D01* 586 | X0319735Y0245757D01* 587 | X0319737Y0245632D01* 588 | X0319735Y0245507D01* 589 | X0319729Y0245382D01* 590 | X0319719Y0245258D01* 591 | X0319705Y0245134D01* 592 | X0319688Y0245010D01* 593 | X0319666Y0244887D01* 594 | X0319640Y0244765D01* 595 | X0319611Y0244643D01* 596 | X0319578Y0244523D01* 597 | X0319540Y0244404D01* 598 | X0319500Y0244285D01* 599 | X0319455Y0244169D01* 600 | X0319407Y0244054D01* 601 | X0319355Y0243940D01* 602 | X0319299Y0243828D01* 603 | X0319240Y0243718D01* 604 | X0319178Y0243610D01* 605 | X0319112Y0243503D01* 606 | X0319043Y0243399D01* 607 | X0318970Y0243298D01* 608 | X0318895Y0243198D01* 609 | X0318816Y0243101D01* 610 | X0318734Y0243007D01* 611 | X0318649Y0242915D01* 612 | X0318562Y0242826D01* 613 | X0318471Y0242740D01* 614 | X0318378Y0242657D01* 615 | X0318282Y0242576D01* 616 | X0318184Y0242499D01* 617 | X0318084Y0242425D01* 618 | X0317981Y0242354D01* 619 | X0317876Y0242287D01* 620 | X0317768Y0242222D01* 621 | X0317659Y0242162D01* 622 | X0317548Y0242104D01* 623 | X0317435Y0242051D01* 624 | X0317321Y0242001D01* 625 | X0317205Y0241954D01* 626 | X0317088Y0241912D01* 627 | X0316969Y0241873D01* 628 | X0316849Y0241837D01* 629 | X0316728Y0241806D01* 630 | X0316606Y0241778D01* 631 | X0316484Y0241755D01* 632 | X0316360Y0241735D01* 633 | X0316236Y0241719D01* 634 | X0316112Y0241707D01* 635 | X0315987Y0241699D01* 636 | X0315862Y0241695D01* 637 | X0315738Y0241695D01* 638 | X0315613Y0241699D01* 639 | X0315488Y0241707D01* 640 | X0315364Y0241719D01* 641 | X0315240Y0241735D01* 642 | X0315116Y0241755D01* 643 | X0314994Y0241778D01* 644 | X0314872Y0241806D01* 645 | X0314751Y0241837D01* 646 | X0314631Y0241873D01* 647 | X0314512Y0241912D01* 648 | X0314395Y0241954D01* 649 | X0314279Y0242001D01* 650 | X0314165Y0242051D01* 651 | X0314052Y0242104D01* 652 | X0313941Y0242162D01* 653 | X0313831Y0242222D01* 654 | X0313724Y0242287D01* 655 | X0313619Y0242354D01* 656 | X0313516Y0242425D01* 657 | X0313416Y0242499D01* 658 | X0313318Y0242576D01* 659 | X0313222Y0242657D01* 660 | X0313129Y0242740D01* 661 | X0313038Y0242826D01* 662 | X0312951Y0242915D01* 663 | X0312866Y0243007D01* 664 | X0312784Y0243101D01* 665 | X0312705Y0243198D01* 666 | X0312630Y0243298D01* 667 | X0312557Y0243399D01* 668 | X0312488Y0243503D01* 669 | X0312422Y0243610D01* 670 | X0312360Y0243718D01* 671 | X0312301Y0243828D01* 672 | X0312245Y0243940D01* 673 | X0312193Y0244054D01* 674 | X0312145Y0244169D01* 675 | X0312100Y0244285D01* 676 | X0312060Y0244404D01* 677 | X0312022Y0244523D01* 678 | X0311989Y0244643D01* 679 | X0311960Y0244765D01* 680 | X0311934Y0244887D01* 681 | X0311912Y0245010D01* 682 | X0311895Y0245134D01* 683 | X0311881Y0245258D01* 684 | X0311871Y0245382D01* 685 | X0311865Y0245507D01* 686 | X0311863Y0245632D01* 687 | M02* 688 | -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.GTP: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX25Y25*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.00000*% 11 | D10* 12 | X0022650Y0018900D02* 13 | X0401400Y0018900D01* 14 | X0401399Y0018899D02* 15 | X0401581Y0018900D01* 16 | X0401763Y0018905D01* 17 | X0401944Y0018915D01* 18 | X0402125Y0018929D01* 19 | X0402306Y0018947D01* 20 | X0402486Y0018970D01* 21 | X0402666Y0018997D01* 22 | X0402845Y0019029D01* 23 | X0403023Y0019065D01* 24 | X0403200Y0019105D01* 25 | X0403376Y0019150D01* 26 | X0403551Y0019198D01* 27 | X0403725Y0019252D01* 28 | X0403897Y0019309D01* 29 | X0404068Y0019370D01* 30 | X0404237Y0019436D01* 31 | X0404405Y0019506D01* 32 | X0404571Y0019580D01* 33 | X0404735Y0019658D01* 34 | X0404897Y0019740D01* 35 | X0405057Y0019826D01* 36 | X0405215Y0019915D01* 37 | X0405371Y0020009D01* 38 | X0405524Y0020106D01* 39 | X0405675Y0020207D01* 40 | X0405824Y0020312D01* 41 | X0405970Y0020421D01* 42 | X0406113Y0020532D01* 43 | X0406253Y0020648D01* 44 | X0406391Y0020766D01* 45 | X0406525Y0020888D01* 46 | X0406657Y0021014D01* 47 | X0406785Y0021142D01* 48 | X0406911Y0021274D01* 49 | X0407033Y0021408D01* 50 | X0407151Y0021546D01* 51 | X0407267Y0021686D01* 52 | X0407378Y0021829D01* 53 | X0407487Y0021975D01* 54 | X0407592Y0022124D01* 55 | X0407693Y0022275D01* 56 | X0407790Y0022428D01* 57 | X0407884Y0022584D01* 58 | X0407973Y0022742D01* 59 | X0408059Y0022902D01* 60 | X0408141Y0023064D01* 61 | X0408219Y0023228D01* 62 | X0408293Y0023394D01* 63 | X0408363Y0023562D01* 64 | X0408429Y0023731D01* 65 | X0408490Y0023902D01* 66 | X0408547Y0024074D01* 67 | X0408601Y0024248D01* 68 | X0408649Y0024423D01* 69 | X0408694Y0024599D01* 70 | X0408734Y0024776D01* 71 | X0408770Y0024954D01* 72 | X0408802Y0025133D01* 73 | X0408829Y0025313D01* 74 | X0408852Y0025493D01* 75 | X0408870Y0025674D01* 76 | X0408884Y0025855D01* 77 | X0408894Y0026036D01* 78 | X0408899Y0026218D01* 79 | X0408900Y0026400D01* 80 | X0408900Y0283900D01* 81 | X0408901Y0283900D02* 82 | X0408900Y0284083D01* 83 | X0408894Y0284266D01* 84 | X0408884Y0284449D01* 85 | X0408869Y0284631D01* 86 | X0408850Y0284813D01* 87 | X0408827Y0284994D01* 88 | X0408799Y0285175D01* 89 | X0408766Y0285355D01* 90 | X0408729Y0285535D01* 91 | X0408688Y0285713D01* 92 | X0408643Y0285890D01* 93 | X0408593Y0286066D01* 94 | X0408539Y0286241D01* 95 | X0408481Y0286414D01* 96 | X0408418Y0286586D01* 97 | X0408351Y0286756D01* 98 | X0408281Y0286925D01* 99 | X0408206Y0287092D01* 100 | X0408127Y0287257D01* 101 | X0408044Y0287420D01* 102 | X0407957Y0287581D01* 103 | X0407866Y0287740D01* 104 | X0407771Y0287896D01* 105 | X0407672Y0288050D01* 106 | X0407570Y0288202D01* 107 | X0407464Y0288351D01* 108 | X0407355Y0288498D01* 109 | X0407242Y0288642D01* 110 | X0407125Y0288783D01* 111 | X0407005Y0288921D01* 112 | X0406882Y0289056D01* 113 | X0406755Y0289188D01* 114 | X0406625Y0289317D01* 115 | X0406492Y0289442D01* 116 | X0406356Y0289565D01* 117 | X0406217Y0289684D01* 118 | X0406076Y0289800D01* 119 | X0405931Y0289912D01* 120 | X0405784Y0290020D01* 121 | X0405634Y0290125D01* 122 | X0405482Y0290227D01* 123 | X0405327Y0290324D01* 124 | X0405170Y0290418D01* 125 | X0405010Y0290508D01* 126 | X0404849Y0290594D01* 127 | X0404685Y0290676D01* 128 | X0404520Y0290753D01* 129 | X0404352Y0290827D01* 130 | X0404183Y0290897D01* 131 | X0404013Y0290963D01* 132 | X0403840Y0291024D01* 133 | X0403666Y0291081D01* 134 | X0403491Y0291134D01* 135 | X0403315Y0291183D01* 136 | X0403137Y0291227D01* 137 | X0402959Y0291267D01* 138 | X0402779Y0291302D01* 139 | X0402599Y0291334D01* 140 | X0402418Y0291360D01* 141 | X0402237Y0291383D01* 142 | X0402054Y0291401D01* 143 | X0401872Y0291414D01* 144 | X0401689Y0291423D01* 145 | X0401506Y0291427D01* 146 | X0401323Y0291427D01* 147 | X0401141Y0291423D01* 148 | X0400958Y0291414D01* 149 | X0400775Y0291401D01* 150 | X0400775Y0291400D02* 151 | X0022650Y0291400D01* 152 | X0022650Y0291401D02* 153 | X0022468Y0291400D01* 154 | X0022286Y0291395D01* 155 | X0022105Y0291385D01* 156 | X0021924Y0291371D01* 157 | X0021743Y0291353D01* 158 | X0021563Y0291330D01* 159 | X0021383Y0291303D01* 160 | X0021204Y0291271D01* 161 | X0021026Y0291235D01* 162 | X0020849Y0291195D01* 163 | X0020673Y0291150D01* 164 | X0020498Y0291102D01* 165 | X0020324Y0291048D01* 166 | X0020152Y0290991D01* 167 | X0019981Y0290930D01* 168 | X0019812Y0290864D01* 169 | X0019644Y0290794D01* 170 | X0019478Y0290720D01* 171 | X0019314Y0290642D01* 172 | X0019152Y0290560D01* 173 | X0018992Y0290474D01* 174 | X0018834Y0290385D01* 175 | X0018678Y0290291D01* 176 | X0018525Y0290194D01* 177 | X0018374Y0290093D01* 178 | X0018225Y0289988D01* 179 | X0018079Y0289879D01* 180 | X0017936Y0289768D01* 181 | X0017796Y0289652D01* 182 | X0017658Y0289534D01* 183 | X0017524Y0289412D01* 184 | X0017392Y0289286D01* 185 | X0017264Y0289158D01* 186 | X0017138Y0289026D01* 187 | X0017016Y0288892D01* 188 | X0016898Y0288754D01* 189 | X0016782Y0288614D01* 190 | X0016671Y0288471D01* 191 | X0016562Y0288325D01* 192 | X0016457Y0288176D01* 193 | X0016356Y0288025D01* 194 | X0016259Y0287872D01* 195 | X0016165Y0287716D01* 196 | X0016076Y0287558D01* 197 | X0015990Y0287398D01* 198 | X0015908Y0287236D01* 199 | X0015830Y0287072D01* 200 | X0015756Y0286906D01* 201 | X0015686Y0286738D01* 202 | X0015620Y0286569D01* 203 | X0015559Y0286398D01* 204 | X0015502Y0286226D01* 205 | X0015448Y0286052D01* 206 | X0015400Y0285877D01* 207 | X0015355Y0285701D01* 208 | X0015315Y0285524D01* 209 | X0015279Y0285346D01* 210 | X0015247Y0285167D01* 211 | X0015220Y0284987D01* 212 | X0015197Y0284807D01* 213 | X0015179Y0284626D01* 214 | X0015165Y0284445D01* 215 | X0015155Y0284264D01* 216 | X0015150Y0284082D01* 217 | X0015149Y0283900D01* 218 | X0015150Y0283900D02* 219 | X0015150Y0026400D01* 220 | X0015150Y0026399D02* 221 | X0015144Y0026224D01* 222 | X0015143Y0026049D01* 223 | X0015146Y0025873D01* 224 | X0015154Y0025698D01* 225 | X0015165Y0025523D01* 226 | X0015181Y0025349D01* 227 | X0015201Y0025174D01* 228 | X0015225Y0025001D01* 229 | X0015254Y0024828D01* 230 | X0015287Y0024655D01* 231 | X0015324Y0024484D01* 232 | X0015365Y0024314D01* 233 | X0015410Y0024144D01* 234 | X0015460Y0023976D01* 235 | X0015513Y0023809D01* 236 | X0015571Y0023643D01* 237 | X0015632Y0023479D01* 238 | X0015698Y0023316D01* 239 | X0015767Y0023155D01* 240 | X0015841Y0022996D01* 241 | X0015918Y0022839D01* 242 | X0015999Y0022683D01* 243 | X0016084Y0022530D01* 244 | X0016173Y0022378D01* 245 | X0016265Y0022229D01* 246 | X0016361Y0022082D01* 247 | X0016460Y0021938D01* 248 | X0016563Y0021796D01* 249 | X0016669Y0021656D01* 250 | X0016779Y0021519D01* 251 | X0016892Y0021385D01* 252 | X0017008Y0021254D01* 253 | X0017128Y0021126D01* 254 | X0017250Y0021000D01* 255 | X0017376Y0020878D01* 256 | X0017504Y0020758D01* 257 | X0017635Y0020642D01* 258 | X0017769Y0020529D01* 259 | X0017906Y0020419D01* 260 | X0018046Y0020313D01* 261 | X0018188Y0020210D01* 262 | X0018332Y0020111D01* 263 | X0018479Y0020015D01* 264 | X0018628Y0019923D01* 265 | X0018780Y0019834D01* 266 | X0018933Y0019749D01* 267 | X0019089Y0019668D01* 268 | X0019246Y0019591D01* 269 | X0019405Y0019517D01* 270 | X0019566Y0019448D01* 271 | X0019729Y0019382D01* 272 | X0019893Y0019321D01* 273 | X0020059Y0019263D01* 274 | X0020226Y0019210D01* 275 | X0020394Y0019160D01* 276 | X0020564Y0019115D01* 277 | X0020734Y0019074D01* 278 | X0020905Y0019037D01* 279 | X0021078Y0019004D01* 280 | X0021251Y0018975D01* 281 | X0021424Y0018951D01* 282 | X0021599Y0018931D01* 283 | X0021773Y0018915D01* 284 | X0021948Y0018904D01* 285 | X0022123Y0018896D01* 286 | X0022299Y0018893D01* 287 | X0022474Y0018894D01* 288 | X0022649Y0018900D01* 289 | X0101863Y0245632D02* 290 | X0101865Y0245757D01* 291 | X0101871Y0245882D01* 292 | X0101881Y0246006D01* 293 | X0101895Y0246130D01* 294 | X0101912Y0246254D01* 295 | X0101934Y0246377D01* 296 | X0101960Y0246499D01* 297 | X0101989Y0246621D01* 298 | X0102022Y0246741D01* 299 | X0102060Y0246860D01* 300 | X0102100Y0246979D01* 301 | X0102145Y0247095D01* 302 | X0102193Y0247210D01* 303 | X0102245Y0247324D01* 304 | X0102301Y0247436D01* 305 | X0102360Y0247546D01* 306 | X0102422Y0247654D01* 307 | X0102488Y0247761D01* 308 | X0102557Y0247865D01* 309 | X0102630Y0247966D01* 310 | X0102705Y0248066D01* 311 | X0102784Y0248163D01* 312 | X0102866Y0248257D01* 313 | X0102951Y0248349D01* 314 | X0103038Y0248438D01* 315 | X0103129Y0248524D01* 316 | X0103222Y0248607D01* 317 | X0103318Y0248688D01* 318 | X0103416Y0248765D01* 319 | X0103516Y0248839D01* 320 | X0103619Y0248910D01* 321 | X0103724Y0248977D01* 322 | X0103832Y0249042D01* 323 | X0103941Y0249102D01* 324 | X0104052Y0249160D01* 325 | X0104165Y0249213D01* 326 | X0104279Y0249263D01* 327 | X0104395Y0249310D01* 328 | X0104512Y0249352D01* 329 | X0104631Y0249391D01* 330 | X0104751Y0249427D01* 331 | X0104872Y0249458D01* 332 | X0104994Y0249486D01* 333 | X0105116Y0249509D01* 334 | X0105240Y0249529D01* 335 | X0105364Y0249545D01* 336 | X0105488Y0249557D01* 337 | X0105613Y0249565D01* 338 | X0105738Y0249569D01* 339 | X0105862Y0249569D01* 340 | X0105987Y0249565D01* 341 | X0106112Y0249557D01* 342 | X0106236Y0249545D01* 343 | X0106360Y0249529D01* 344 | X0106484Y0249509D01* 345 | X0106606Y0249486D01* 346 | X0106728Y0249458D01* 347 | X0106849Y0249427D01* 348 | X0106969Y0249391D01* 349 | X0107088Y0249352D01* 350 | X0107205Y0249310D01* 351 | X0107321Y0249263D01* 352 | X0107435Y0249213D01* 353 | X0107548Y0249160D01* 354 | X0107659Y0249102D01* 355 | X0107769Y0249042D01* 356 | X0107876Y0248977D01* 357 | X0107981Y0248910D01* 358 | X0108084Y0248839D01* 359 | X0108184Y0248765D01* 360 | X0108282Y0248688D01* 361 | X0108378Y0248607D01* 362 | X0108471Y0248524D01* 363 | X0108562Y0248438D01* 364 | X0108649Y0248349D01* 365 | X0108734Y0248257D01* 366 | X0108816Y0248163D01* 367 | X0108895Y0248066D01* 368 | X0108970Y0247966D01* 369 | X0109043Y0247865D01* 370 | X0109112Y0247761D01* 371 | X0109178Y0247654D01* 372 | X0109240Y0247546D01* 373 | X0109299Y0247436D01* 374 | X0109355Y0247324D01* 375 | X0109407Y0247210D01* 376 | X0109455Y0247095D01* 377 | X0109500Y0246979D01* 378 | X0109540Y0246860D01* 379 | X0109578Y0246741D01* 380 | X0109611Y0246621D01* 381 | X0109640Y0246499D01* 382 | X0109666Y0246377D01* 383 | X0109688Y0246254D01* 384 | X0109705Y0246130D01* 385 | X0109719Y0246006D01* 386 | X0109729Y0245882D01* 387 | X0109735Y0245757D01* 388 | X0109737Y0245632D01* 389 | X0109735Y0245507D01* 390 | X0109729Y0245382D01* 391 | X0109719Y0245258D01* 392 | X0109705Y0245134D01* 393 | X0109688Y0245010D01* 394 | X0109666Y0244887D01* 395 | X0109640Y0244765D01* 396 | X0109611Y0244643D01* 397 | X0109578Y0244523D01* 398 | X0109540Y0244404D01* 399 | X0109500Y0244285D01* 400 | X0109455Y0244169D01* 401 | X0109407Y0244054D01* 402 | X0109355Y0243940D01* 403 | X0109299Y0243828D01* 404 | X0109240Y0243718D01* 405 | X0109178Y0243610D01* 406 | X0109112Y0243503D01* 407 | X0109043Y0243399D01* 408 | X0108970Y0243298D01* 409 | X0108895Y0243198D01* 410 | X0108816Y0243101D01* 411 | X0108734Y0243007D01* 412 | X0108649Y0242915D01* 413 | X0108562Y0242826D01* 414 | X0108471Y0242740D01* 415 | X0108378Y0242657D01* 416 | X0108282Y0242576D01* 417 | X0108184Y0242499D01* 418 | X0108084Y0242425D01* 419 | X0107981Y0242354D01* 420 | X0107876Y0242287D01* 421 | X0107768Y0242222D01* 422 | X0107659Y0242162D01* 423 | X0107548Y0242104D01* 424 | X0107435Y0242051D01* 425 | X0107321Y0242001D01* 426 | X0107205Y0241954D01* 427 | X0107088Y0241912D01* 428 | X0106969Y0241873D01* 429 | X0106849Y0241837D01* 430 | X0106728Y0241806D01* 431 | X0106606Y0241778D01* 432 | X0106484Y0241755D01* 433 | X0106360Y0241735D01* 434 | X0106236Y0241719D01* 435 | X0106112Y0241707D01* 436 | X0105987Y0241699D01* 437 | X0105862Y0241695D01* 438 | X0105738Y0241695D01* 439 | X0105613Y0241699D01* 440 | X0105488Y0241707D01* 441 | X0105364Y0241719D01* 442 | X0105240Y0241735D01* 443 | X0105116Y0241755D01* 444 | X0104994Y0241778D01* 445 | X0104872Y0241806D01* 446 | X0104751Y0241837D01* 447 | X0104631Y0241873D01* 448 | X0104512Y0241912D01* 449 | X0104395Y0241954D01* 450 | X0104279Y0242001D01* 451 | X0104165Y0242051D01* 452 | X0104052Y0242104D01* 453 | X0103941Y0242162D01* 454 | X0103831Y0242222D01* 455 | X0103724Y0242287D01* 456 | X0103619Y0242354D01* 457 | X0103516Y0242425D01* 458 | X0103416Y0242499D01* 459 | X0103318Y0242576D01* 460 | X0103222Y0242657D01* 461 | X0103129Y0242740D01* 462 | X0103038Y0242826D01* 463 | X0102951Y0242915D01* 464 | X0102866Y0243007D01* 465 | X0102784Y0243101D01* 466 | X0102705Y0243198D01* 467 | X0102630Y0243298D01* 468 | X0102557Y0243399D01* 469 | X0102488Y0243503D01* 470 | X0102422Y0243610D01* 471 | X0102360Y0243718D01* 472 | X0102301Y0243828D01* 473 | X0102245Y0243940D01* 474 | X0102193Y0244054D01* 475 | X0102145Y0244169D01* 476 | X0102100Y0244285D01* 477 | X0102060Y0244404D01* 478 | X0102022Y0244523D01* 479 | X0101989Y0244643D01* 480 | X0101960Y0244765D01* 481 | X0101934Y0244887D01* 482 | X0101912Y0245010D01* 483 | X0101895Y0245134D01* 484 | X0101881Y0245258D01* 485 | X0101871Y0245382D01* 486 | X0101865Y0245507D01* 487 | X0101863Y0245632D01* 488 | X0311863Y0245632D02* 489 | X0311865Y0245757D01* 490 | X0311871Y0245882D01* 491 | X0311881Y0246006D01* 492 | X0311895Y0246130D01* 493 | X0311912Y0246254D01* 494 | X0311934Y0246377D01* 495 | X0311960Y0246499D01* 496 | X0311989Y0246621D01* 497 | X0312022Y0246741D01* 498 | X0312060Y0246860D01* 499 | X0312100Y0246979D01* 500 | X0312145Y0247095D01* 501 | X0312193Y0247210D01* 502 | X0312245Y0247324D01* 503 | X0312301Y0247436D01* 504 | X0312360Y0247546D01* 505 | X0312422Y0247654D01* 506 | X0312488Y0247761D01* 507 | X0312557Y0247865D01* 508 | X0312630Y0247966D01* 509 | X0312705Y0248066D01* 510 | X0312784Y0248163D01* 511 | X0312866Y0248257D01* 512 | X0312951Y0248349D01* 513 | X0313038Y0248438D01* 514 | X0313129Y0248524D01* 515 | X0313222Y0248607D01* 516 | X0313318Y0248688D01* 517 | X0313416Y0248765D01* 518 | X0313516Y0248839D01* 519 | X0313619Y0248910D01* 520 | X0313724Y0248977D01* 521 | X0313832Y0249042D01* 522 | X0313941Y0249102D01* 523 | X0314052Y0249160D01* 524 | X0314165Y0249213D01* 525 | X0314279Y0249263D01* 526 | X0314395Y0249310D01* 527 | X0314512Y0249352D01* 528 | X0314631Y0249391D01* 529 | X0314751Y0249427D01* 530 | X0314872Y0249458D01* 531 | X0314994Y0249486D01* 532 | X0315116Y0249509D01* 533 | X0315240Y0249529D01* 534 | X0315364Y0249545D01* 535 | X0315488Y0249557D01* 536 | X0315613Y0249565D01* 537 | X0315738Y0249569D01* 538 | X0315862Y0249569D01* 539 | X0315987Y0249565D01* 540 | X0316112Y0249557D01* 541 | X0316236Y0249545D01* 542 | X0316360Y0249529D01* 543 | X0316484Y0249509D01* 544 | X0316606Y0249486D01* 545 | X0316728Y0249458D01* 546 | X0316849Y0249427D01* 547 | X0316969Y0249391D01* 548 | X0317088Y0249352D01* 549 | X0317205Y0249310D01* 550 | X0317321Y0249263D01* 551 | X0317435Y0249213D01* 552 | X0317548Y0249160D01* 553 | X0317659Y0249102D01* 554 | X0317769Y0249042D01* 555 | X0317876Y0248977D01* 556 | X0317981Y0248910D01* 557 | X0318084Y0248839D01* 558 | X0318184Y0248765D01* 559 | X0318282Y0248688D01* 560 | X0318378Y0248607D01* 561 | X0318471Y0248524D01* 562 | X0318562Y0248438D01* 563 | X0318649Y0248349D01* 564 | X0318734Y0248257D01* 565 | X0318816Y0248163D01* 566 | X0318895Y0248066D01* 567 | X0318970Y0247966D01* 568 | X0319043Y0247865D01* 569 | X0319112Y0247761D01* 570 | X0319178Y0247654D01* 571 | X0319240Y0247546D01* 572 | X0319299Y0247436D01* 573 | X0319355Y0247324D01* 574 | X0319407Y0247210D01* 575 | X0319455Y0247095D01* 576 | X0319500Y0246979D01* 577 | X0319540Y0246860D01* 578 | X0319578Y0246741D01* 579 | X0319611Y0246621D01* 580 | X0319640Y0246499D01* 581 | X0319666Y0246377D01* 582 | X0319688Y0246254D01* 583 | X0319705Y0246130D01* 584 | X0319719Y0246006D01* 585 | X0319729Y0245882D01* 586 | X0319735Y0245757D01* 587 | X0319737Y0245632D01* 588 | X0319735Y0245507D01* 589 | X0319729Y0245382D01* 590 | X0319719Y0245258D01* 591 | X0319705Y0245134D01* 592 | X0319688Y0245010D01* 593 | X0319666Y0244887D01* 594 | X0319640Y0244765D01* 595 | X0319611Y0244643D01* 596 | X0319578Y0244523D01* 597 | X0319540Y0244404D01* 598 | X0319500Y0244285D01* 599 | X0319455Y0244169D01* 600 | X0319407Y0244054D01* 601 | X0319355Y0243940D01* 602 | X0319299Y0243828D01* 603 | X0319240Y0243718D01* 604 | X0319178Y0243610D01* 605 | X0319112Y0243503D01* 606 | X0319043Y0243399D01* 607 | X0318970Y0243298D01* 608 | X0318895Y0243198D01* 609 | X0318816Y0243101D01* 610 | X0318734Y0243007D01* 611 | X0318649Y0242915D01* 612 | X0318562Y0242826D01* 613 | X0318471Y0242740D01* 614 | X0318378Y0242657D01* 615 | X0318282Y0242576D01* 616 | X0318184Y0242499D01* 617 | X0318084Y0242425D01* 618 | X0317981Y0242354D01* 619 | X0317876Y0242287D01* 620 | X0317768Y0242222D01* 621 | X0317659Y0242162D01* 622 | X0317548Y0242104D01* 623 | X0317435Y0242051D01* 624 | X0317321Y0242001D01* 625 | X0317205Y0241954D01* 626 | X0317088Y0241912D01* 627 | X0316969Y0241873D01* 628 | X0316849Y0241837D01* 629 | X0316728Y0241806D01* 630 | X0316606Y0241778D01* 631 | X0316484Y0241755D01* 632 | X0316360Y0241735D01* 633 | X0316236Y0241719D01* 634 | X0316112Y0241707D01* 635 | X0315987Y0241699D01* 636 | X0315862Y0241695D01* 637 | X0315738Y0241695D01* 638 | X0315613Y0241699D01* 639 | X0315488Y0241707D01* 640 | X0315364Y0241719D01* 641 | X0315240Y0241735D01* 642 | X0315116Y0241755D01* 643 | X0314994Y0241778D01* 644 | X0314872Y0241806D01* 645 | X0314751Y0241837D01* 646 | X0314631Y0241873D01* 647 | X0314512Y0241912D01* 648 | X0314395Y0241954D01* 649 | X0314279Y0242001D01* 650 | X0314165Y0242051D01* 651 | X0314052Y0242104D01* 652 | X0313941Y0242162D01* 653 | X0313831Y0242222D01* 654 | X0313724Y0242287D01* 655 | X0313619Y0242354D01* 656 | X0313516Y0242425D01* 657 | X0313416Y0242499D01* 658 | X0313318Y0242576D01* 659 | X0313222Y0242657D01* 660 | X0313129Y0242740D01* 661 | X0313038Y0242826D01* 662 | X0312951Y0242915D01* 663 | X0312866Y0243007D01* 664 | X0312784Y0243101D01* 665 | X0312705Y0243198D01* 666 | X0312630Y0243298D01* 667 | X0312557Y0243399D01* 668 | X0312488Y0243503D01* 669 | X0312422Y0243610D01* 670 | X0312360Y0243718D01* 671 | X0312301Y0243828D01* 672 | X0312245Y0243940D01* 673 | X0312193Y0244054D01* 674 | X0312145Y0244169D01* 675 | X0312100Y0244285D01* 676 | X0312060Y0244404D01* 677 | X0312022Y0244523D01* 678 | X0311989Y0244643D01* 679 | X0311960Y0244765D01* 680 | X0311934Y0244887D01* 681 | X0311912Y0245010D01* 682 | X0311895Y0245134D01* 683 | X0311881Y0245258D01* 684 | X0311871Y0245382D01* 685 | X0311865Y0245507D01* 686 | X0311863Y0245632D01* 687 | M02* 688 | -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.TXT: -------------------------------------------------------------------------------- 1 | % 2 | M48 3 | M72 4 | T01C0.04400 5 | T02C0.04724 6 | T03C0.07874 7 | % 8 | T01 9 | X42050Y250632 10 | X32050Y250632 11 | T02 12 | X128300Y193132 13 | X140800Y193132 14 | X170800Y193132 15 | X183300Y193132 16 | X128300Y283132 17 | X183300Y283132 18 | T03 19 | X401400Y26400 20 | X352729Y245632 21 | X315800Y245632 22 | X401400Y283900 23 | X105800Y245632 24 | X68870Y245632 25 | X22650Y283900 26 | X22650Y26400 27 | M30 28 | -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.dri: -------------------------------------------------------------------------------- 1 | Generated by EAGLE CAM Processor 7.6.0 2 | 3 | Drill Station Info File: F:/__NEW__PCB/_oldpicomputer charging bottom/backcover2bottom.dri 4 | 5 | Date : 4. 2. 2023 0:37 6 | Drills : generated 7 | Device : Excellon drill station, coordinate format 2.5 inch 8 | 9 | Parameter settings: 10 | 11 | Tolerance Drill + : 0.00 % 12 | Tolerance Drill - : 0.00 % 13 | Rotate : no 14 | Mirror : no 15 | Optimize : yes 16 | Auto fit : yes 17 | OffsetX : 0inch 18 | OffsetY : 0inch 19 | Layers : Drills Holes 20 | 21 | Drill File Info: 22 | 23 | Data Mode : Absolute 24 | Units : 1/100000 Inch 25 | 26 | Drills used: 27 | 28 | Code Size used 29 | 30 | T01 0.0440inch 2 31 | T02 0.0472inch 6 32 | T03 0.0787inch 8 33 | 34 | Total number of drills: 16 35 | 36 | Plotfiles: 37 | 38 | F:/__NEW__PCB/_oldpicomputer charging bottom/backcover2bottom.TXT 39 | -------------------------------------------------------------------------------- /Hardware/PICOmputer charging bottom cover PCB/backcover2bottom.gpi: -------------------------------------------------------------------------------- 1 | Generated by EAGLE CAM Processor 7.6.0 2 | 3 | Photoplotter Info File: F:/__NEW__PCB/_oldpicomputer charging bottom/backcover2bottom.gpi 4 | 5 | Date : 4. 2. 2023 0:38 6 | Plotfile : F:/__NEW__PCB/_oldpicomputer charging bottom/backcover2bottom.GTL 7 | Apertures : generated: 8 | Device : Gerber RS-274-X photoplotter, coordinate format 2.5 inch 9 | 10 | Parameter settings: 11 | 12 | Emulate Apertures : no 13 | Tolerance Draw + : 0.00 % 14 | Tolerance Draw - : 0.00 % 15 | Tolerance Flash + : 0.00 % 16 | Tolerance Flash - : 0.00 % 17 | Rotate : no 18 | Mirror : no 19 | Optimize : yes 20 | Auto fit : yes 21 | OffsetX : 0inch 22 | OffsetY : 0inch 23 | 24 | Plotfile Info: 25 | 26 | Coordinate Format : 2.5 27 | Coordinate Units : Inch 28 | Data Mode : Absolute 29 | Zero Suppression : None 30 | End Of Block : * 31 | 32 | Apertures used: 33 | 34 | Code Shape Size used 35 | 36 | D10 draw 0.0000inch 10 37 | D11 rectangle 0.0140inch x 0.0010inch 330 38 | D12 rectangle 0.0220inch x 0.0010inch 261 39 | D13 rectangle 0.0270inch x 0.0010inch 180 40 | D14 rectangle 0.0310inch x 0.0010inch 87 41 | D15 rectangle 0.0130inch x 0.0010inch 329 42 | D16 rectangle 0.0150inch x 0.0010inch 333 43 | D17 rectangle 0.0120inch x 0.0010inch 228 44 | D18 rectangle 0.0100inch x 0.0010inch 116 45 | D19 rectangle 0.0090inch x 0.0010inch 110 46 | D20 rectangle 0.0190inch x 0.0010inch 217 47 | D21 rectangle 0.0320inch x 0.0010inch 80 48 | D22 rectangle 0.0390inch x 0.0010inch 35 49 | D23 rectangle 0.0440inch x 0.0010inch 21 50 | D24 rectangle 0.0480inch x 0.0010inch 21 51 | D25 rectangle 0.0110inch x 0.0010inch 188 52 | D26 rectangle 0.0520inch x 0.0010inch 11 53 | D27 rectangle 0.0560inch x 0.0010inch 14 54 | D28 rectangle 0.0160inch x 0.0010inch 334 55 | D29 rectangle 0.0380inch x 0.0010inch 35 56 | D30 rectangle 0.0200inch x 0.0010inch 235 57 | D31 rectangle 0.0350inch x 0.0010inch 54 58 | D32 rectangle 0.0330inch x 0.0010inch 57 59 | D33 rectangle 0.0370inch x 0.0010inch 34 60 | D34 rectangle 0.0170inch x 0.0010inch 398 61 | D35 rectangle 0.0240inch x 0.0010inch 213 62 | D36 rectangle 0.0180inch x 0.0010inch 293 63 | D37 rectangle 0.0300inch x 0.0010inch 108 64 | D38 rectangle 0.0410inch x 0.0010inch 21 65 | D39 rectangle 0.0290inch x 0.0010inch 100 66 | D40 rectangle 0.0210inch x 0.0010inch 341 67 | D41 rectangle 0.0230inch x 0.0010inch 164 68 | D42 rectangle 0.0060inch x 0.0010inch 8 69 | D43 rectangle 0.0540inch x 0.0010inch 11 70 | D44 rectangle 0.0280inch x 0.0010inch 195 71 | D45 rectangle 0.0580inch x 0.0010inch 7 72 | D46 rectangle 0.0600inch x 0.0010inch 8 73 | D47 rectangle 0.0630inch x 0.0010inch 6 74 | D48 rectangle 0.0660inch x 0.0010inch 12 75 | D49 rectangle 0.0260inch x 0.0010inch 150 76 | D50 rectangle 0.0250inch x 0.0010inch 175 77 | D51 rectangle 0.0080inch x 0.0010inch 61 78 | D52 rectangle 0.0070inch x 0.0010inch 10 79 | D53 rectangle 0.0590inch x 0.0010inch 3 80 | D54 rectangle 0.0470inch x 0.0010inch 20 81 | D55 rectangle 0.0430inch x 0.0010inch 20 82 | D56 rectangle 0.0420inch x 0.0010inch 26 83 | D57 rectangle 0.0400inch x 0.0010inch 31 84 | D58 rectangle 0.0850inch x 0.0010inch 5 85 | D59 rectangle 0.0340inch x 0.0010inch 48 86 | D60 rectangle 0.0820inch x 0.0010inch 7 87 | D61 rectangle 0.0360inch x 0.0010inch 33 88 | D62 rectangle 0.0550inch x 0.0010inch 6 89 | D63 rectangle 0.0740inch x 0.0010inch 5 90 | D64 rectangle 0.0640inch x 0.0010inch 5 91 | D65 rectangle 0.0530inch x 0.0010inch 12 92 | D66 rectangle 0.0020inch x 0.0010inch 7 93 | D67 rectangle 0.0450inch x 0.0010inch 13 94 | D68 rectangle 0.0620inch x 0.0010inch 6 95 | D69 rectangle 0.0490inch x 0.0010inch 14 96 | D70 rectangle 0.0650inch x 0.0010inch 3 97 | D71 rectangle 0.0670inch x 0.0010inch 6 98 | D72 rectangle 0.0680inch x 0.0010inch 1 99 | D73 rectangle 0.0700inch x 0.0010inch 3 100 | D74 rectangle 0.0720inch x 0.0010inch 5 101 | D75 rectangle 0.0750inch x 0.0010inch 12 102 | D76 rectangle 0.0790inch x 0.0010inch 4 103 | D77 rectangle 0.0780inch x 0.0010inch 5 104 | D78 rectangle 0.0710inch x 0.0010inch 8 105 | D79 rectangle 0.0800inch x 0.0010inch 4 106 | D80 rectangle 0.0880inch x 0.0010inch 3 107 | D81 rectangle 0.0030inch x 0.0010inch 6 108 | D82 rectangle 0.0930inch x 0.0010inch 3 109 | D83 rectangle 0.0810inch x 0.0010inch 3 110 | D84 rectangle 0.0970inch x 0.0010inch 2 111 | D85 rectangle 0.0860inch x 0.0010inch 2 112 | D86 rectangle 0.0570inch x 0.0010inch 9 113 | D87 rectangle 0.1010inch x 0.0010inch 3 114 | D88 rectangle 0.0910inch x 0.0010inch 5 115 | D89 rectangle 0.1050inch x 0.0010inch 5 116 | D90 rectangle 0.0950inch x 0.0010inch 2 117 | D91 rectangle 0.0770inch x 0.0010inch 6 118 | D92 rectangle 0.1090inch x 0.0010inch 4 119 | D93 rectangle 0.0990inch x 0.0010inch 1 120 | D94 rectangle 0.0040inch x 0.0010inch 4 121 | D95 rectangle 0.0980inch x 0.0010inch 2 122 | D96 rectangle 0.1140inch x 0.0010inch 3 123 | D97 rectangle 0.1030inch x 0.0010inch 2 124 | D98 rectangle 0.1770inch x 0.0010inch 1 125 | D99 rectangle 0.1160inch x 0.0010inch 2 126 | D100 rectangle 0.1060inch x 0.0010inch 2 127 | D101 rectangle 0.1760inch x 0.0010inch 1 128 | D102 rectangle 0.1190inch x 0.0010inch 1 129 | D103 rectangle 0.1740inch x 0.0010inch 1 130 | D104 rectangle 0.1220inch x 0.0010inch 3 131 | D105 rectangle 0.1120inch x 0.0010inch 2 132 | D106 rectangle 0.0510inch x 0.0010inch 9 133 | D107 rectangle 0.1550inch x 0.0010inch 1 134 | D108 rectangle 0.1150inch x 0.0010inch 4 135 | D109 rectangle 0.1490inch x 0.0010inch 2 136 | D110 rectangle 0.1170inch x 0.0010inch 1 137 | D111 rectangle 0.1420inch x 0.0010inch 1 138 | D112 rectangle 0.1200inch x 0.0010inch 1 139 | D113 rectangle 0.1360inch x 0.0010inch 1 140 | D114 rectangle 0.1230inch x 0.0010inch 4 141 | D115 rectangle 0.1300inch x 0.0010inch 1 142 | D116 rectangle 0.0460inch x 0.0010inch 11 143 | D117 rectangle 0.1040inch x 0.0010inch 2 144 | D118 rectangle 0.0500inch x 0.0010inch 13 145 | D119 rectangle 0.0730inch x 0.0010inch 8 146 | D120 rectangle 0.1070inch x 0.0010inch 1 147 | D121 square 0.0010inch 3 148 | D122 rectangle 0.0690inch x 0.0010inch 3 149 | D123 rectangle 0.0760inch x 0.0010inch 6 150 | D124 rectangle 0.0830inch x 0.0010inch 5 151 | D125 rectangle 0.0050inch x 0.0010inch 9 152 | D126 rectangle 0.0610inch x 0.0010inch 3 153 | D127 rectangle 0.0840inch x 0.0010inch 2 154 | D128 rectangle 0.0920inch x 0.0010inch 4 155 | D129 rectangle 0.0900inch x 0.0010inch 2 156 | D130 rectangle 0.1250inch x 0.0010inch 1 157 | D131 rectangle 0.1240inch x 0.0010inch 1 158 | D132 rectangle 0.1130inch x 0.0010inch 1 159 | D133 rectangle 0.1000inch x 0.0010inch 2 160 | D134 rectangle 0.0870inch x 0.0010inch 3 161 | D135 rectangle 0.1560inch x 0.0010inch 1 162 | D136 rectangle 0.1540inch x 0.0010inch 1 163 | D137 rectangle 0.0960inch x 0.0010inch 2 164 | D138 rectangle 0.1520inch x 0.0010inch 1 165 | D139 rectangle 0.1500inch x 0.0010inch 1 166 | D140 rectangle 0.1480inch x 0.0010inch 1 167 | D141 rectangle 0.0940inch x 0.0010inch 2 168 | D142 rectangle 0.1440inch x 0.0010inch 2 169 | D143 rectangle 0.1410inch x 0.0010inch 1 170 | D144 rectangle 0.1370inch x 0.0010inch 1 171 | D145 rectangle 0.1320inch x 0.0010inch 1 172 | D146 rectangle 0.1280inch x 0.0010inch 1 173 | D147 rectangle 0.1460inch x 0.0010inch 1 174 | D148 rectangle 0.0040inch x 0.0020inch 29 175 | D149 rectangle 0.0120inch x 0.0020inch 828 176 | D150 rectangle 0.0100inch x 0.0020inch 487 177 | D151 rectangle 0.0180inch x 0.0020inch 102 178 | D152 rectangle 0.0200inch x 0.0020inch 77 179 | D153 rectangle 0.0160inch x 0.0020inch 192 180 | D154 rectangle 0.0240inch x 0.0020inch 94 181 | D155 rectangle 0.0220inch x 0.0020inch 88 182 | D156 rectangle 0.0360inch x 0.0020inch 69 183 | D157 rectangle 0.0280inch x 0.0020inch 71 184 | D158 rectangle 0.0440inch x 0.0020inch 85 185 | D159 rectangle 0.0340inch x 0.0020inch 91 186 | D160 rectangle 0.0540inch x 0.0020inch 38 187 | D161 rectangle 0.0380inch x 0.0020inch 76 188 | D162 rectangle 0.0080inch x 0.0020inch 99 189 | D163 rectangle 0.0620inch x 0.0020inch 26 190 | D164 rectangle 0.0400inch x 0.0020inch 86 191 | D165 rectangle 0.0260inch x 0.0020inch 74 192 | D166 rectangle 0.0680inch x 0.0020inch 12 193 | D167 rectangle 0.0460inch x 0.0020inch 100 194 | D168 rectangle 0.0740inch x 0.0020inch 7 195 | D169 rectangle 0.0300inch x 0.0020inch 68 196 | D170 rectangle 0.0420inch x 0.0020inch 91 197 | D171 rectangle 0.0780inch x 0.0020inch 7 198 | D172 rectangle 0.0320inch x 0.0020inch 56 199 | D173 rectangle 0.0480inch x 0.0020inch 98 200 | D174 rectangle 0.0520inch x 0.0020inch 48 201 | D175 rectangle 0.0840inch x 0.0020inch 3 202 | D176 rectangle 0.0900inch x 0.0020inch 2 203 | D177 rectangle 0.0600inch x 0.0020inch 27 204 | D178 rectangle 0.0980inch x 0.0020inch 2 205 | D179 rectangle 0.0940inch x 0.0020inch 2 206 | D180 rectangle 0.1000inch x 0.0020inch 2 207 | D181 rectangle 0.0960inch x 0.0020inch 2 208 | D182 rectangle 0.0660inch x 0.0020inch 17 209 | D183 rectangle 0.1040inch x 0.0020inch 3 210 | D184 rectangle 0.1020inch x 0.0020inch 2 211 | D185 rectangle 0.1060inch x 0.0020inch 1 212 | D186 rectangle 0.0920inch x 0.0020inch 3 213 | D187 rectangle 0.1080inch x 0.0020inch 4 214 | D188 rectangle 0.0760inch x 0.0020inch 7 215 | D189 rectangle 0.1120inch x 0.0020inch 1 216 | D190 rectangle 0.0580inch x 0.0020inch 29 217 | D191 rectangle 0.1140inch x 0.0020inch 3 218 | D192 rectangle 0.0560inch x 0.0020inch 31 219 | D193 rectangle 0.0820inch x 0.0020inch 3 220 | D194 rectangle 0.1180inch x 0.0020inch 1 221 | D195 rectangle 0.1200inch x 0.0020inch 2 222 | D196 rectangle 0.1100inch x 0.0020inch 2 223 | D197 rectangle 0.0500inch x 0.0020inch 58 224 | D198 rectangle 0.1580inch x 0.0020inch 1 225 | D199 rectangle 0.0860inch x 0.0020inch 2 226 | D200 rectangle 0.0800inch x 0.0020inch 2 227 | D201 rectangle 0.0720inch x 0.0020inch 10 228 | D202 rectangle 0.0700inch x 0.0020inch 14 229 | D203 rectangle 0.0640inch x 0.0020inch 22 230 | D204 rectangle 0.0140inch x 0.0020inch 600 231 | D205 rectangle 0.1160inch x 0.0020inch 1 232 | D206 rectangle 0.0880inch x 0.0020inch 2 233 | D207 rectangle 0.0060inch x 0.0020inch 48 234 | D208 square 0.0020inch 14 235 | D209 square 0.1181inch 2 236 | D210 square 0.0984inch 6 237 | D211 draw 0.0740inch 2 238 | D212 draw 0.0160inch 20 239 | D213 round 0.1181inch 4 240 | D214 draw 0.0080inch 5075 241 | 242 | -------------------------------------------------------------------------------- /Pictures Armachat HW/0001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0001.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0002.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0003.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0004.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0005.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0006.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0007.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0008.jpg -------------------------------------------------------------------------------- /Pictures Armachat HW/0009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures Armachat HW/0009.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234416.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234416.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234438.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234438.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234456.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234456.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234626.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234626.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234819.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234819.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234841.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234841.jpg -------------------------------------------------------------------------------- /Pictures PICOmputer HW/IMG_20211107_234850.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Pictures PICOmputer HW/IMG_20211107_234850.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Armachat-circuitpython 2 | New Armachat based on Raspberry Pi PICO an Circuitpython code 3 | 4 | **Software working features:** 5 | 6 | - send message with header and store to memory 7 | - receive message and parse header, store to memory 8 | - display message memory with message details like SNR and RSSI 9 | - count messages in memory by type 10 | - display some hardware details like free memory and power supply voltage, it is good for future battery operation 11 | - Terminal display with messages from background systems 12 | - AES256 encryption 13 | - message confirmation and status change in memory 14 | - boot safe mode 15 | 16 | 17 | **TODO:** 18 | 19 | - Need much better LoRa library with, CAD, status detection, and INTERRUPT !!! 20 | - contact list 21 | - ~~setup and save configuration~~ 22 | - save memory to flash 23 | 24 | 25 | 26 | ##Fixes in this repository 27 | 28 | - Much more stable 29 | - Formatting changes in all three files. I'm using the Mu editor, https://codewith.mu/, that has Check and Tidy functions to help standardize formatting. The formatting changes are from using those functions in the Mu editor. 30 | - Configuration values that are changed may be saved to a config.txt file if the file-system is writable. 31 | 32 | **boot.py** 33 | 34 | - Pull model information from config.py to obtain the model and keyboard setup information. 35 | - Used the adafruit_matrixkeypad to scan the keyboard. 36 | - Display prompts based on the Armachat model 37 | - Added a progress bar to show remaining time to make a selection for safe and write modes. 38 | 39 | **code.py** 40 | 41 | - Added a function named screenSafeText, which removed characters from a string that is a non-printable character. There were some random errors due to received messages having non-printable characters. When the messages were displayed, there would be no font in the font file for them, which would cause the code to crash. 42 | - Added a 0.1 second delay when checking for a key press. I was experiencing skipping screens as the left or right button (bsp, ent) was read twice or more on one key press. This is not a perfect solution but the results in a better user experience. 43 | - Added try/catch blocks around attempts to read or write files. I would have rather used file exists for reads but it appears that CircuitPython's file library does not have an exists function. The use of try/catch blocks appears to be the preferred method to check for a file's existence. 44 | - Created the function radioInit to allow changing of the LoRa radio on the fly. 45 | - Added the CPU Temperature from Kayto's code 46 | - Added the Ping function from Kayto's code 47 | - Allow changing the frequency on the fly 48 | - Allow changing the power on the fly 49 | - Matched LoRa profiles to Meshtastic's profiles 50 | 51 | **config.py** 52 | 53 | Now reading and writing to config.txt file to keep settings between reboots 54 | 55 | Notes: 56 | 57 | - If a new property is added to config.py, it will be written to config.txt if it is one of the types included in config_includeTypes list. 58 | - A property may be excluded by placing it in the config_excludeNames list. 59 | 60 | Limitations 61 | 62 | - To save configuration changes, the file-system needs to be changed to writable on boot by pressing the ALT key. 63 | - If the config.txt file is edited by hand comments are allowed but the whole line must be a comment. Inline comments are not allowed. 64 | - If a hex, binary. or octal value is in the config.txt file, it will be changed to decimal if the configuration file is saved. 65 | - Currently only str, int, and float types are supported. 66 | 67 | BTW: Save memory to flash does work if you change the file system to write mode by pressing the ALT key when booting and pressing the S key when viewing messages. -------------------------------------------------------------------------------- /Software/Flopy.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Anne Barela for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | # 5 | # Faux Floppy Disk with LCD Screen 6 | # Display file icons on screen 7 | 8 | import os 9 | import time 10 | import board 11 | import displayio 12 | import adafruit_imageload 13 | import terminalio 14 | 15 | from adafruit_display_text import label 16 | from adafruit_display_shapes.rect import Rect 17 | 18 | from picomputer import * 19 | 20 | # Get a dictionary of filenames at the passed base directory 21 | # each entry is a tuple (filename, bool) where bool = true 22 | # means the filename is a directory, else false. 23 | def get_files(base): 24 | files = os.listdir(base) 25 | file_names = [] 26 | for isdir, filetext in enumerate(files): 27 | if not filetext.startswith("."): 28 | if filetext not in ('boot_out.txt', 'System Volume Information'): 29 | stats = os.stat(base + filetext) 30 | isdir = stats[0] & 0x4000 31 | if isdir: 32 | file_names.append((filetext, True)) 33 | else: 34 | file_names.append((filetext, False)) 35 | return file_names 36 | 37 | 38 | # Icon Positions 39 | ICONSIZE = 48 40 | SPACING = 6 41 | LEFTSPACE = 0 42 | TOPSPACE = 0 43 | TEXTSPACE = 10 44 | ICONSACROSS = 6 45 | ICONSDOWN = 3 46 | PAGEMAXFILES = ICONSACROSS * ICONSDOWN # For the chosen display, this is the 47 | # maximum number of file icons that will fit 48 | # on the display at once (display dependent) 49 | # File Types 50 | BLANK = 0 51 | FILE = 1 52 | DIR = 2 53 | BMP = 3 54 | WAV = 4 55 | PY = 5 56 | RIGHT = 4 57 | LEFT = 3 58 | 59 | # Use the builtin display 60 | 61 | WIDTH = display.width 62 | HEIGHT = display.height 63 | 64 | 65 | # Create base display group 66 | displaygroup = displayio.Group() 67 | 68 | # Load the bitmap (this is the "spritesheet") 69 | sprite_sheet, palette = adafruit_imageload.load("/icons/icons.bmp") 70 | 71 | background = Rect(0, 0, WIDTH - 1, HEIGHT - 1, fill=0x000000) 72 | displaygroup.append(background) 73 | 74 | # Create enough sprites & labels for the icons that will fit on screen 75 | sprites = [] 76 | labels = [] 77 | for _ in range(PAGEMAXFILES): 78 | sprite = displayio.TileGrid(sprite_sheet, pixel_shader=palette, 79 | width=1, height=1, tile_height=48, 80 | tile_width=48,) 81 | sprites.append(sprite) # Append the sprite to the sprite array 82 | displaygroup.append(sprite) 83 | filelabel = label.Label(terminalio.FONT, color=0xFFFFFF) 84 | labels.append(filelabel) 85 | displaygroup.append(filelabel) 86 | 87 | 88 | display.show(displaygroup) 89 | 90 | filecount = 0 91 | xpos = LEFTSPACE 92 | ypos = TOPSPACE 93 | 94 | displaybase = "/" # Get file names in base directory 95 | filenames = get_files(displaybase) 96 | 97 | currentfile = 0 # Which file is being processed in all files 98 | spot = 0 # Which spot on the screen is getting a file icon 99 | PAGE = 1 # Which page of icons is displayed on screen, 1 is first 100 | 101 | while True: 102 | if currentfile < len(filenames) and spot < PAGEMAXFILES: 103 | filename, dirfile = filenames[currentfile] 104 | if dirfile: 105 | filetype = DIR 106 | elif filename.endswith(".bmp"): 107 | filetype = BMP 108 | elif filename.endswith(".wav"): 109 | filetype = WAV 110 | elif filename.endswith(".py"): 111 | filetype = PY 112 | else: 113 | filetype = FILE 114 | # Set icon location information and icon type 115 | sprites[spot].x = xpos 116 | sprites[spot].y = ypos 117 | sprites[spot][0] = filetype 118 | # 119 | # Set filename 120 | labels[spot].x = xpos 121 | labels[spot].y = ypos + ICONSIZE + TEXTSPACE 122 | # The next line gets the filename without the extension, first 11 chars 123 | labels[spot].text = filename.rsplit('.', 1)[0][0:10] 124 | 125 | currentpage = PAGE 126 | 127 | 128 | # Icon Positioning 129 | 130 | if PAGE != currentpage: # We have a page change 131 | # Reset icon locations to upper left 132 | xpos = LEFTSPACE 133 | ypos = TOPSPACE 134 | spot = 0 135 | if currentpage > PAGE: 136 | # Decrement files by a page (current page & previous page) 137 | currentfile = currentfile - (PAGEMAXFILES * 2) + 1 138 | else: 139 | # Forward go to the next file 140 | currentfile = currentfile + 1 141 | else: 142 | currentfile += 1 # Increment file counter 143 | spot += 1 # Increment icon space counter 144 | if spot == PAGEMAXFILES: # Last page ended with 145 | print("hit") 146 | # calculate next icon location 147 | if spot % ICONSACROSS: # not at end of icon row 148 | xpos += SPACING + ICONSIZE 149 | else: # start new icon row 150 | ypos += ICONSIZE + SPACING + TEXTSPACE 151 | xpos = LEFTSPACE 152 | # End If Changed Page 153 | # Blank out rest if needed 154 | if currentfile == len(filenames): 155 | for i in range(spot, PAGEMAXFILES): 156 | sprites[i][0] = BLANK 157 | labels[i].text = "xxxx" 158 | # End while -------------------------------------------------------------------------------- /Software/bmps/Armachat Logo 120.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/Armachat Logo 120.bmp -------------------------------------------------------------------------------- /Software/bmps/Armachat Logo 80.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/Armachat Logo 80.bmp -------------------------------------------------------------------------------- /Software/bmps/bobricius.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/bobricius.bmp -------------------------------------------------------------------------------- /Software/bmps/desktop.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/desktop.bmp -------------------------------------------------------------------------------- /Software/bmps/font.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/font.bmp -------------------------------------------------------------------------------- /Software/bmps/test.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/test.bmp -------------------------------------------------------------------------------- /Software/bmps/winamp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/winamp.bmp -------------------------------------------------------------------------------- /Software/bmps/world.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/bmps/world.bmp -------------------------------------------------------------------------------- /Software/boot.py: -------------------------------------------------------------------------------- 1 | import time 2 | import board 3 | import busio 4 | import displayio 5 | import digitalio 6 | import microcontroller 7 | import storage 8 | import os 9 | 10 | #from config import * 11 | from picomputer import * 12 | 13 | #display is configured in /lib/config.py 14 | board_type = os.uname().machine 15 | print("\033[2J",end="") #clear screen 16 | print("\033]0; BOOT\033\\") 17 | print (board_type) 18 | if 'rp2040' in board_type: 19 | VBUS_status = digitalio.DigitalInOut(board.VBUS_SENSE) # defaults to input 20 | VBUS_status.pull = digitalio.Pull.UP # turn on internal pull-up resistor 21 | if VBUS_status.value: 22 | print("USB powered") 23 | else: 24 | print("No USB power") 25 | 26 | writemode = True 27 | 28 | print ("Keyboard:"+keyboard_model) 29 | print ("Display:"+display_model) 30 | print ("LoRa:"+model_lora) 31 | #pnt20"12345678901234567890") 32 | print("[ESC]-SAFE [ALT]-RW") 33 | 34 | LOOPCOUNT = 20 35 | for x in range(LOOPCOUNT): 36 | s = "[" 37 | for i in range(0, LOOPCOUNT): 38 | if (LOOPCOUNT - 1) - i > x: 39 | s = s + "-" 40 | else: 41 | s = s + " " 42 | if x == LOOPCOUNT - 1: 43 | print(s + "]\n") 44 | else: 45 | print(s + "]\r", end='') 46 | 47 | time.sleep(0.01) 48 | keys =getKey(0) 49 | 50 | if not keys: 51 | continue 52 | if keys == "bsp": 53 | print("SAFE MODE DETECTED.") 54 | microcontroller.on_next_reset(microcontroller.RunMode.SAFE_MODE) 55 | microcontroller.reset() 56 | if keys == "alt": 57 | print("Write mode enabled.") 58 | writemode = False 59 | 60 | # RENAME DRIVE 61 | new_name = "PICOmputer" 62 | 63 | storage.remount("/", readonly=False) 64 | m = storage.getmount("/") 65 | m.label = new_name 66 | storage.remount("/", readonly=writemode) 67 | print("Loading DOS ...") -------------------------------------------------------------------------------- /Software/calculator.py: -------------------------------------------------------------------------------- 1 | debug = False 2 | import time 3 | import sys,supervisor 4 | import usb_cdc 5 | import board 6 | import busio 7 | import terminalio 8 | import displayio 9 | import analogio 10 | import gc 11 | import os 12 | import aesio 13 | import math 14 | from binascii import hexlify 15 | import microcontroller 16 | from adafruit_display_text import label, wrap_text_to_lines 17 | from adafruit_display_shapes.rect import Rect 18 | #from adafruit_display_shapes.circle import Circle 19 | from adafruit_display_shapes.roundrect import RoundRect 20 | #from adafruit_display_shapes.triangle import Triangle 21 | #from adafruit_display_shapes.line import Line 22 | #from adafruit_display_shapes.polygon import Polygon 23 | from pwmio import PWMOut 24 | from adafruit_bitmap_font import bitmap_font 25 | from picomputer import * 26 | from math import * 27 | import digitalio 28 | import random 29 | 30 | messages = ["0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|x|0|0|0| MESSAGE MEMORY:"] 31 | msgCounter = 0 32 | GUI=True 33 | ######################################################################################## 34 | ######### MOST IMPORTANT PART - Like main loop, reading keyboard a receiving messages 35 | ######################################################################################## 36 | def editor(text): 37 | cursor = 0 38 | layout = 0 39 | editLine = 0 40 | editText = text 41 | editMode = "#" 42 | layoutName = "a" 43 | receivedMessage="" 44 | line = "" 45 | displayRefresh=True 46 | #print ("> \r", end='') # 47 | while True: 48 | 49 | 50 | keys=getKey(layout) 51 | if keys: 52 | if keys == "alt": 53 | layout = layout + 1 54 | ring() 55 | displayRefresh=True 56 | if layout == 3: 57 | layout = 0 58 | keys = "" 59 | 60 | if keys == "bsp" and line == "": 61 | text = "~bsp" 62 | return text 63 | if keys == "ent" and line == "": 64 | text = "~ent" 65 | return text 66 | if keys == "bsp": 67 | if cursor > 0: 68 | editText = (editText[0 : cursor - 1]) + (editText[cursor:]) 69 | cursor = cursor - 1 70 | beep() 71 | displayRefresh=True 72 | while getKey(0): 73 | pass 74 | keys = "" 75 | if keys == "lt": 76 | if cursor > 0: 77 | cursor = cursor - 1 78 | keys = "" 79 | displayRefresh=True 80 | if keys == "rt": 81 | if cursor < len(editText): 82 | cursor = cursor + 1 83 | keys = "" 84 | displayRefresh=True 85 | 86 | if keys == "ent": 87 | beep() 88 | text = line 89 | return text 90 | if keys != "": 91 | if len(editText) < MAX_INPUT_TEXT: 92 | editText = (editText[0:cursor]) + keys + (editText[cursor:]) 93 | cursor = cursor + 1 94 | layout = 0 95 | beep() 96 | displayRefresh=True 97 | while getKey(0): 98 | pass 99 | 100 | if layout == 0: 101 | layoutName = "_" 102 | elif layout == 1: 103 | layoutName = "|" 104 | elif layout == 2: 105 | layoutName = "-" 106 | line = editText # (editText[0:cursor])+"_"+(editText[cursor:]) 107 | textInput = (editText[0:cursor]) + layoutName + (editText[cursor:]) # line[editLine] 108 | textLen = len(editText) 109 | maxLine=MAX_CHARS-3 110 | if textLen > maxLine and cursor > maxLine: 111 | textInput = (textInput[cursor-maxLine:cursor+1]) 112 | textInput = (textInput[:maxLine+1]) 113 | 114 | if displayRefresh==True: 115 | if GUI==True: 116 | cmdMode=len(editText) 117 | editMode="" 118 | text_edit.text=editMode+textInput #layoutName+editMode+ 119 | #text_layout.text=str(textLen) 120 | 121 | else: 122 | print("\033]0;>>"+textInput+"\033\\",end="") 123 | #if display_model== "display280x240" or display_model== "display280x240touch": 124 | # layoutName=" "+layoutName #move text away from rounded corner 125 | #print ((editMode)+textInput+" \r", end='') 126 | #print("\033]0;"+textInput+"\033\\") 127 | #if displayRefresh==True: 128 | #print("\033]0;"+textInput+"\033\\") 129 | #display.refresh() 130 | displayRefresh=False 131 | 132 | 133 | 134 | 135 | 136 | ### AI CODE 137 | lines = ['Line 1', 'Line 2', 'Line 3'] 138 | num_lines = 100 139 | displayed_lines = 6 140 | 141 | def add_line(new_line): 142 | global lines 143 | lines.append(new_line) 144 | if len(lines) > num_lines: 145 | lines = lines[-num_lines:] 146 | 147 | def display_lines(start_line): 148 | if start_line >= len(lines): 149 | print("Invalid start line. The number of lines is", len(lines)) 150 | return 151 | lines_to_display = [] 152 | for line in lines[start_line:]: 153 | lines_to_display += line.split('\n') 154 | for line in lines_to_display[-displayed_lines:]: 155 | print(line) 156 | 157 | 158 | ### END AICODE 159 | def debugPrint (msg): 160 | if debug: 161 | print ("----["+msg+"]") 162 | 163 | 164 | 165 | 166 | def clearScreen(): 167 | print("...") 168 | 169 | def bool2onoff(bvar): 170 | if bvar == True: 171 | onoff = "On" 172 | else: 173 | onoff = "Off" 174 | return onoff 175 | 176 | 177 | def readCardKB(): 178 | if M5CardKB==True: 179 | ESC = chr(27) 180 | NUL = '\x00' 181 | CR = "\r" 182 | LF = "\n" 183 | c = '' 184 | b = bytearray(1) 185 | i2c.readfrom_into(cardkb, b) 186 | try: 187 | c = b.decode() 188 | except: 189 | c = NUL 190 | 191 | if c != NUL: 192 | if b[0] == 0x08: 193 | c = "bsp" 194 | if b[0] == 0x0D: 195 | c = "ent" 196 | if b[0] == 0xB4: 197 | c = "lt" 198 | if b[0] == 0xB7: 199 | c = "rt" 200 | keys= c 201 | print(c) 202 | 203 | 204 | 205 | def listMemory(details=True): 206 | for i, msg in enumerate(messages): 207 | # Split the message into a list of values using the "|" delimiter 208 | values = msg.split("|") 209 | msgStatus=values[4] 210 | if msgStatus=="R": 211 | msgStatus="<-" 212 | elif msgStatus=="S": 213 | msgStatus="? " 214 | elif msgStatus=="D": 215 | msgStatus="->" 216 | 217 | addFromTo = ">".join(values[0:2]) 218 | if details==True: 219 | print(str(i)+"# "+addFromTo) 220 | print(msgStatus+values[-1]) #text 221 | print("RSSI:"+values[5]+" SNR:"+values[6] ) 222 | else: 223 | print(str(i)+"# "+msgStatus+values[-1]) #text 224 | 225 | 226 | # ----------------------FUNCTIONS--------------------------- 227 | 228 | # with open('x.txt', 'w') as f: 229 | # f.write("Hello world!\r\n") 230 | # f.close() 231 | 232 | ############################################################################ 233 | ######### SETUP - Program start 234 | ############################################################################ 235 | board_type = os.uname().machine 236 | if 'Pico' in board_type: 237 | VSYS_voltage = analogio.AnalogIn(board.VOLTAGE_MONITOR) 238 | VBUS_status = digitalio.DigitalInOut(board.VBUS_SENSE) # defaults to input 239 | VBUS_status.pull = digitalio.Pull.UP # turn on internal pull-up resistor 240 | SMPSmode = digitalio.DigitalInOut(board.SMPS_MODE) 241 | SMPSmode.direction = digitalio.Direction.OUTPUT 242 | SMPSmode.value = True 243 | 244 | ############################################################################ 245 | ######### Resize terminal 246 | ############################################################################ 247 | if GUI==True: 248 | # Create a Group 249 | mygroup = displayio.Group() 250 | 251 | print("Starting GUI...") 252 | 253 | display.show(None) 254 | splash = display.root_group # this gets the current root_group, the REPL 255 | 256 | # Note: You must "display.show" your own group before adding the splash to your own group. 257 | # Reason: When displaying the normal REPL (for example with display.show(None), the splash 258 | # group is already in a group that is displayed. To remove the splash from the displayed group, 259 | # you first have to display.show some other group, doing that will remove the splash from its group 260 | # and allow you to append it to your own group. 261 | display.show(mygroup) 262 | 263 | # resize the supervisor.splash group pixel dimensions, make it half the display height. 264 | supervisor.reset_terminal(display.width, 60+24) #+12 265 | 266 | # relocate the supervisor.splash group on the display, moving it half-way down the display 267 | splash.y=180-12 # -12 268 | print("Resize and move terminal ....") 269 | 270 | # append the supervisor.splash group to the displayed group. 271 | mygroup.append(splash) 272 | 273 | font_file = "fonts/neep-24.pcf" 274 | font = bitmap_font.load_font(font_file) 275 | terminal_font = terminalio.FONT 276 | 277 | window_roundrect = RoundRect(0, 0, display.width, 147, 4, fill=0xFFFFFF, outline=0xF0F0F0, stroke=2) 278 | edit_roundrect = RoundRect(0, 150, display.width, 30, 4, fill=0xFFFFFF, outline=0xF0F0F0, stroke=2) 279 | 280 | 281 | text_window = label.Label(font, line_spacing=1, text="PyPrCa", color=0, x=1, y=12) 282 | text_edit = label.Label(font, line_spacing=1, text="TEXT", color=0, x=2, y=162) 283 | 284 | 285 | mygroup.append(window_roundrect) 286 | 287 | mygroup.append(edit_roundrect) 288 | 289 | mygroup.append(text_window) 290 | mygroup.append(text_edit) 291 | 292 | ############################################################################ 293 | ######### Start loop 294 | ############################################################################ 295 | 296 | 297 | 298 | if keyboard_model=="keysWio": 299 | M5CardKB=True 300 | #i2c for CardKB 301 | i2c = busio.I2C(board.SCL, board.SDA) 302 | while not i2c.try_lock(): 303 | pass 304 | try: 305 | cardkb = i2c.scan()[0] # should return 95 306 | if cardkb != 95: 307 | print("!!! Check I2C config: " + str(i2c)) 308 | print("!!! CardKB not found. I2C device", cardkb, 309 | "found instead.") 310 | M5CardKB=False 311 | else : 312 | print("CardKB detected Great") 313 | print() 314 | except: 315 | M5CardKB=False 316 | print("No CardKB detected !") 317 | print() 318 | 319 | if supervisor.runtime.usb_connected: 320 | print ("..... USB connected") 321 | ############################################################################ 322 | ######### MAIN LOOP 323 | ############################################################################ 324 | print("Starting Calculator...") 325 | lastMessage =0 326 | message = "" 327 | messageDetails=False 328 | 329 | while True: 330 | sleepStart_time = time.monotonic() # fraction seconds uptime 331 | ### most important part, editor checking keyboard and receiving messages 332 | #display.auto_refresh = False 333 | text =editor(text=message) 334 | #display.refresh() 335 | #display.auto_refresh = True 336 | if text=="~bsp": 337 | lastMessage = max(0, lastMessage - 1) 338 | #displayMessage(lastMessage,messageDetails) 339 | continue 340 | if text=="~ent": 341 | lastMessage = min(len(messages) - 1, lastMessage + 1) 342 | #displayMessage(lastMessage,messageDetails) 343 | continue 344 | 345 | if len(text) == 1: 346 | if text == "h": 347 | #[G]ping [P]Profile [F]Frequency 348 | cmdInfo = "HELP: [E]edit [M]Memory\n[L]List [R]Radio\n[C]crypto [D]Debug\n[G]ping" 349 | elif text == "c": 350 | encryption = not encryption 351 | cmdInfo = "Enctryption:"+bool2onoff(encryption) 352 | elif text == "e": 353 | cmdInfo = "Editing message:"+str(lastMessage) 354 | message = displayMessage(lastMessage,False) 355 | elif text == "d": 356 | debug = not debug 357 | cmdInfo = "Debug messages:"+bool2onoff(debug) 358 | elif text == "m": 359 | cmdInfo = memoryInfo() 360 | elif text == "l": 361 | messageDetails = not messageDetails 362 | cmdInfo = "Message Details:"+bool2onoff(messageDetails) 363 | elif text == "r": 364 | cmdInfo = radioInfo() 365 | elif text == "g": 366 | pingBeacon() 367 | cmdInfo = "Beacon finished" 368 | 369 | else: 370 | cmdInfo = "Try for [H] help" 371 | 372 | # Print the template 373 | #cmdInfo = "\n".join(wrap_text_to_lines(cmdInfo, MAX_CHARS)) 374 | #print(cmdInfo) 375 | if GUI==True: 376 | text_window.text=cmdInfo 377 | ring() 378 | ring() 379 | else: 380 | print ("->"+text) 381 | try: 382 | res=str(eval(text)) 383 | exec("a=3") 384 | except Exception as err: 385 | print(err) 386 | text_window.text=str(err) 387 | 388 | text = "\n".join(wrap_text_to_lines(res, MAX_CHARS)) 389 | print (text) 390 | if GUI==True: 391 | text_window.text=text 392 | message = "" 393 | lastMessage=len(messages)-1 -------------------------------------------------------------------------------- /Software/code.py: -------------------------------------------------------------------------------- 1 | import time 2 | import board 3 | import busio 4 | import terminalio 5 | import displayio 6 | import os 7 | import gc 8 | import microcontroller 9 | import digitalio 10 | import supervisor 11 | 12 | GUI=True 13 | SCALE=1 14 | 15 | from picomputer import * 16 | 17 | hidden_ID = ['.', '_', 'TRASH', 'boot_out.txt', 'main.py', 'code.py', 'menu.py', 'main.txt', 'code.txt', 'boot.py'] # List of file name elements and names we do not want to see 18 | #pnt20"") 19 | #print("\033]0; DOS - Doomsday Operating System\033\\") 20 | 21 | def updateStatus(fontSize): 22 | if GUI == True: 23 | onoff = "GUI=On" 24 | else: 25 | onoff = "GUI=Off" 26 | if SCALE==1: 27 | print("\033]0; DOS - Doomsday Operating System "+onoff+" Font:"+str(fontSize)+"\033\\",end="") 28 | else: 29 | print("\033]0;DoomsdayOperatingSystem\033\\",end="") 30 | return 31 | 32 | def file_filter(data): 33 | for y in hidden_ID: 34 | filtered_data = [x for x in data if not x.startswith(y)] 35 | data = filtered_data 36 | filtered_data = [x for x in data if x[-3:] == '.py' or x[-4:] == '.txt' ] 37 | return sorted(filtered_data) 38 | 39 | def printMenu(menu_options): 40 | max_length = len(menu_options) 41 | print("MENU:") 42 | for i in range(0, max_length, 1): 43 | print(" "+menu_options[i].rsplit('.', 1)[0]) #[0:10] 44 | print("[ Select app ]") 45 | updateStatus(SCALE) 46 | return max_length 47 | 48 | menu_options = file_filter(os.listdir()) 49 | max_length = len(menu_options) 50 | 51 | supervisor.runtime.autoreload = False 52 | print("\033[2J",end="") #clear screen 53 | printMenu(menu_options) 54 | 55 | #print("\033[5;15H",end="") 56 | #ESC [ nnnn ; mmmm H 57 | #print("[Select by 0-9]") 58 | menu=0 59 | #supervisor.status_bar.display = False 60 | while True: 61 | keys=getKey(0) #keyboard layout 1 = symbols and numbers 62 | if keys: 63 | if keys == "up": 64 | if menu > 0: 65 | menu = menu - 1 66 | if keys == "dn": 67 | if menu < max_length-1: 68 | menu = menu + 1 69 | while getKey(0): 70 | pass 71 | #beep() 72 | print("\033["+str(menu+2)+";0H",end="") 73 | print("--> [",end="") 74 | print("\033["+str(menu+2)+";20H",end="") 75 | print("]",end="") 76 | time.sleep(0.05) 77 | print("\033["+str(menu+2)+";0H",end="") 78 | print(" ",end="") 79 | print("\033["+str(menu+2)+";20H",end="") 80 | print(" ",end="") 81 | if keys=="g": 82 | GUI = not GUI 83 | updateStatus(SCALE) 84 | ring() 85 | continue 86 | if keys=="s": 87 | display.root_group.scale = 2 88 | supervisor.reset_terminal(display.width,120) 89 | SCALE=2 90 | updateStatus(SCALE) 91 | printMenu(menu_options) 92 | ring() 93 | continue 94 | if keys=="ent": 95 | startApp=(menu_options[menu]) 96 | supervisor.set_next_code_file(startApp) 97 | print("\033[2J",end="") #clear screen 98 | print("Free memory:"+str(gc.mem_free())) 99 | print("Next boot set to:") 100 | print(startApp) 101 | try: 102 | gc.collect() 103 | exec(open(startApp).read()) 104 | except Exception as err: 105 | print(err) 106 | print("Program finished ...") 107 | print("\033[2J",end="") #clear screen 108 | printMenu(menu_options) 109 | 110 | -------------------------------------------------------------------------------- /Software/desktop.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Tim C, written for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: Unlicense 4 | """ 5 | PyPortal implementation of Busy Simulator notification sound looper. 6 | """ 7 | import time 8 | import board 9 | from adafruit_displayio_layout.layouts.grid_layout import GridLayout 10 | from adafruit_displayio_layout.widgets.icon_widget import IconWidget 11 | 12 | from adafruit_cursorcontrol.cursorcontrol import Cursor 13 | from picomputer import * 14 | 15 | # How many seconds to wait between playing samples 16 | # Lower time means it will play faster 17 | WAIT_TIME = 3.0 18 | 19 | # List that will hold indexes of notification samples to play 20 | LOOP = [] 21 | 22 | # last time that we played a sample 23 | LAST_PLAY_TIME = 0 24 | 25 | CUR_LOOP_INDEX = 0 26 | 27 | # touch events must have at least this long between them 28 | COOLDOWN_TIME = 0.25 # seconds 29 | 30 | # last time that the display was touched 31 | # used for debouncing and cooldown enforcement 32 | LAST_PRESS_TIME = -1 33 | 34 | # Was any icon touched last iteration. 35 | # Used for debouncing. 36 | WAS_TOUCHED = False 37 | 38 | 39 | def next_index(): 40 | """ 41 | return the next index in the LOOP that should get played 42 | """ 43 | if CUR_LOOP_INDEX + 1 >= len(LOOP): 44 | return 0 45 | 46 | return CUR_LOOP_INDEX + 1 47 | 48 | 49 | # list of icons to show 50 | # each entry is a tuple containing: 51 | # (Icon Label, Icon BMP image file, Notification sample wav file 52 | _icons = [ 53 | ("Home", "icons/Home.bmp", "sounds/outlook.wav"), 54 | ("Time", "icons/Time.bmp", "sounds/phone.wav"), 55 | ("Armachat", "icons/Phone.bmp", "sounds/skype.wav"), 56 | ("Tourtle", "icons/Turtle.bmp", "sounds/teams.wav"), 57 | ("Keyboard", "icons/Keyboard.bmp", "sounds/discord.wav"), 58 | ("Games", "icons/Games.bmp", "sounds/applemail.wav"), 59 | ("Calculator", "icons/Abacus.bmp", "sounds/imessage.wav"), 60 | ("Temperature", "icons/Thermometer.bmp", "sounds/slack.wav"), 61 | ("Language", "icons/Flag.bmp", "sounds/RE.wav"), 62 | ("Photoframe", "icons/Multimedia.bmp", "sounds/gchat.wav"), 63 | ("REPL", "icons/Tax.bmp", ""), 64 | ] 65 | 66 | # Make the display context. 67 | #display = board.DISPLAY 68 | main_group = displayio.Group() 69 | display.show(main_group) 70 | 71 | 72 | # Setup the file as the bitmap data source 73 | bg_bitmap = displayio.OnDiskBitmap("/bmps/desktop.bmp") 74 | 75 | # Create a TileGrid to hold the bitmap 76 | bg_tile_grid = displayio.TileGrid( 77 | bg_bitmap, 78 | pixel_shader=getattr(bg_bitmap, "pixel_shader", displayio.ColorConverter()), 79 | ) 80 | 81 | # add it to the group that is showing 82 | main_group.append(bg_tile_grid) 83 | 84 | 85 | 86 | # grid to hold the icons 87 | layout = GridLayout( 88 | x=0, 89 | y=0, 90 | width=320, 91 | height=240, 92 | grid_size=(4, 3), 93 | cell_padding=1, 94 | ) 95 | 96 | # initialize the icons in the grid 97 | for i, icon in enumerate(_icons): 98 | icon_widget = IconWidget( 99 | icon[0], 100 | icon[1], 101 | x=0, 102 | y=0, 103 | on_disk=False, 104 | transparent_index=6, 105 | label_background=0x000000, 106 | ) 107 | 108 | layout.add_content(icon_widget, grid_position=(i % 4, i // 4), cell_size=(1, 1)) 109 | 110 | # add the grid to the group showing on the display 111 | main_group.append(layout) 112 | 113 | 114 | def check_for_click(x,y): 115 | # loop over the icons 116 | for _ in range(len(_icons)): 117 | # lookup current icon in the grid layout 118 | cur_icon = layout.get_cell((_ % 4, _ // 4)) 119 | 120 | # check if it's being touched 121 | if cur_icon.contains((mouse_cursor.x, mouse_cursor.y)): 122 | print("icon {} click".format(_)) 123 | print("playing: {}".format(_icons[_][2])) 124 | beep() 125 | 126 | # if it's the stop icon 127 | if _icons[_][0] == "Stop": 128 | ring() 129 | 130 | 131 | 132 | 133 | 134 | # initialize the mouse cursor object 135 | mouse_cursor = Cursor(display, display_group=main_group) 136 | 137 | # main loop 138 | x=100 139 | y=100 140 | 141 | while True: 142 | # cursor.update() 143 | keys=getKey(0) 144 | if keys: 145 | if keys == "lt": 146 | if x > 0: 147 | x = x - 1 148 | if keys == "rt": 149 | if x < 320: 150 | x = x + 1 151 | if keys == "up": 152 | if y > 0: 153 | y = y - 1 154 | if keys == "dn": 155 | if y < 240: 156 | y = y + 1 157 | if keys == "ent": 158 | check_for_click(x,y) 159 | 160 | mouse_cursor.x=x 161 | mouse_cursor.y=y 162 | 163 | #while True: -------------------------------------------------------------------------------- /Software/editor.py: -------------------------------------------------------------------------------- 1 | debug = False 2 | import time 3 | import alarm 4 | import sys,supervisor 5 | import usb_cdc 6 | import board 7 | import busio 8 | import terminalio 9 | import displayio 10 | import analogio 11 | import gc 12 | import os 13 | import aesio 14 | from binascii import hexlify 15 | import microcontroller 16 | from adafruit_display_text import label, wrap_text_to_lines, bitmap_label 17 | from adafruit_display_shapes.rect import Rect 18 | #from adafruit_display_shapes.circle import Circle 19 | from adafruit_display_shapes.roundrect import RoundRect 20 | #from adafruit_display_shapes.triangle import Triangle 21 | #from adafruit_display_shapes.line import Line 22 | #from adafruit_display_shapes.polygon import Polygon 23 | from adafruit_simple_text_display import SimpleTextDisplay 24 | from pwmio import PWMOut 25 | from adafruit_bitmap_font import bitmap_font 26 | from picomputer import * 27 | import digitalio 28 | import random 29 | from math import * 30 | 31 | GUI = True 32 | line = ["#Solve quadratic equation", "a=1.0", "b=8.0","c=12.0", "d=(b**2)-(4*a*c)", "s1=(-b-sqrt(d))/(2*a)","s2=(-b+sqrt(d))/(2*a)", "print('S1:{0}'.format(s1))", "print('S2:{0}'.format(s2))"] 33 | 34 | ######################################################################################## 35 | ######### MOST IMPORTANT PART - Like main loop, reading keyboard a receiving messages 36 | ######################################################################################## 37 | def editor(text): 38 | cursor = 0 39 | layout = 0 40 | editLine = 0 41 | editText = line[0] 42 | editMode = "#" 43 | layoutName = "a" 44 | receivedMessage="" 45 | 46 | 47 | EditorScreen[1].text = line[0] 48 | EditorScreen[2].text = line[1] 49 | EditorScreen[3].text = line[2] 50 | EditorScreen[4].text = line[3] 51 | EditorScreen[5].text = line[4] 52 | EditorScreen[6].text = line[5] 53 | EditorScreen[7].text = line[6] 54 | EditorScreen[8].text = line[7] 55 | EditorScreen[9].text = line[8] 56 | 57 | 58 | displayRefresh=True 59 | sleepStart_time = time.monotonic() # fraction seconds uptime 60 | EditorScreen[0].text="PYCOmputer" 61 | 62 | while True: 63 | # if time.monotonic() - sleepStart_time > sleepTime: # every 2 seconds 64 | # display.brightness = sleepBrightness 65 | # if lightSleepEnabled==True: 66 | # goToSleep() 67 | 68 | 69 | keys=getKey(layout) 70 | 71 | if keys: 72 | sleepStart_time = time.monotonic() # fraction seconds uptime 73 | display.brightness = 1 74 | if keys == "alt": 75 | layout = layout + 1 76 | ring() 77 | displayRefresh=True 78 | if layout == 3: 79 | layout = 0 80 | keys = "" 81 | 82 | 83 | if keys == "ent" and line == "": 84 | line[editLine]=editText 85 | EditorScreen[editLine+1].text = editText 86 | if editLine<8 :editLine=editLine+1 87 | 88 | editText=line[editLine] 89 | cursor = 0 90 | keys = "" 91 | displayRefresh=True 92 | 93 | if keys == "bsp": 94 | if cursor > 0: 95 | editText = (editText[0 : cursor - 1]) + (editText[cursor:]) 96 | cursor = cursor - 1 97 | beep() 98 | displayRefresh=True 99 | while getKey(0): 100 | pass 101 | keys = "" 102 | if keys == "lt": 103 | if cursor > 0: 104 | cursor = cursor - 1 105 | keys = "" 106 | displayRefresh=True 107 | if keys == "rt": 108 | if cursor < len(editText): 109 | cursor = cursor + 1 110 | keys = "" 111 | displayRefresh=True 112 | if keys == "up": 113 | line[editLine]=editText 114 | EditorScreen[editLine+1].text = editText 115 | if editLine>0 :editLine=editLine-1 116 | editText=line[editLine] 117 | cursor = 0 118 | keys = "" 119 | displayRefresh=True 120 | if keys == "dn": 121 | line[editLine]=editText 122 | EditorScreen[editLine+1].text = editText 123 | if editLine<8 :editLine=editLine+1 124 | 125 | editText=line[editLine] 126 | cursor = 0 127 | keys = "" 128 | displayRefresh=True 129 | 130 | 131 | if keys == "tab": 132 | ring() 133 | execText = "" 134 | for oneLine in line: 135 | if oneLine.strip() != "": 136 | execText += oneLine+"\n" 137 | return execText 138 | if keys != "": 139 | if len(editText) < MAX_INPUT_TEXT: 140 | editText = (editText[0:cursor]) + keys + (editText[cursor:]) 141 | cursor = cursor + 1 142 | layout = 0 143 | beep() 144 | displayRefresh=True 145 | while getKey(0): 146 | pass 147 | 148 | if layout == 0: 149 | layoutName = "_" 150 | elif layout == 1: 151 | layoutName = "|" 152 | elif layout == 2: 153 | layoutName = "-" 154 | line[editLine] = editText # (editText[0:cursor])+"_"+(editText[cursor:]) 155 | textInput = (editText[0:cursor]) + layoutName + (editText[cursor:]) # line[editLine] 156 | textLen = len(editText) 157 | maxLine=MAX_CHARS-3 158 | if textLen > maxLine and cursor > maxLine: 159 | textInput = (textInput[cursor-maxLine:cursor+1]) 160 | textInput = (textInput[:maxLine+1]) 161 | 162 | if displayRefresh==True: 163 | displayRefresh=False 164 | EditorScreen[0].text="'Quad_equation.py' "+str(editLine)+":"+str(cursor) 165 | EditorScreen[editLine+1].text =textInput 166 | EditorScreen.show() 167 | #text_edit.text=editMode+textInput #layoutName+editMode+ 168 | #text_layout.text=str(textLen) 169 | 170 | def goToSleep(): 171 | display.brightness = 0.001 172 | time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic() + timeInLightSleep) 173 | pin_alarm = alarm.pin.PinAlarm(LORA_INT, value=True, pull=True) 174 | #print("sleep") 175 | alarm.light_sleep_until_alarms(time_alarm, pin_alarm) 176 | #display.brightness = 0.1 177 | #print("wake") 178 | 179 | 180 | def debugPrint (msg): 181 | if debug: 182 | print ("----["+msg+"]") 183 | 184 | 185 | 186 | 187 | def clearScreen(): 188 | print("...") 189 | 190 | def bool2onoff(bvar): 191 | if bvar == True: 192 | onoff = "On" 193 | else: 194 | onoff = "Off" 195 | return onoff 196 | 197 | 198 | def filesystemInfo(): 199 | fs_stat = os.statvfs('/') 200 | text = "Filesystem:\n" 201 | text = text +"Disk size:"+str(fs_stat[0] * fs_stat[2] / 1024 )+" KB\n" 202 | text = text + "Free space:"+str(fs_stat[0] * fs_stat[3] / 1024 )+" KB\n" 203 | if supervisor.runtime.usb_connected: 204 | text = text + "USB connected\n" 205 | ring() 206 | return text 207 | 208 | def powerInfo(): 209 | text = "Battery:\n" 210 | text = text +"VSYS = {:5.2f} V\n".format(((VSYS_voltage.value * 3.3) / 65536) * 3) 211 | if VBUS_status.value : 212 | text = text +"USB powered\n" 213 | else: 214 | text = text +"No USB power\n" 215 | ring() 216 | return text 217 | 218 | def batteryInfo(): 219 | voltage =((VSYS_voltage.value * 3.3) / 65536) * 3 220 | capacity= int(min(max((0 + ((voltage - voltageMin) * (100 - 0) / (voltageMax - voltageMin))), 0), 100)) 221 | return capacity 222 | # ----------------------FUNCTIONS--------------------------- 223 | 224 | # with open('x.txt', 'w') as f: 225 | # f.write("Hello world!\r\n") 226 | # f.close() 227 | 228 | ############################################################################ 229 | ######### SETUP - Program start 230 | ############################################################################ 231 | board_type = os.uname().machine 232 | if 'Pico' in board_type: 233 | VSYS_voltage = analogio.AnalogIn(board.VOLTAGE_MONITOR) 234 | VBUS_status = digitalio.DigitalInOut(board.VBUS_SENSE) # defaults to input 235 | VBUS_status.pull = digitalio.Pull.UP # turn on internal pull-up resistor 236 | SMPSmode = digitalio.DigitalInOut(board.SMPS_MODE) 237 | SMPSmode.direction = digitalio.Direction.OUTPUT 238 | SMPSmode.value = True 239 | #LED = digitalio.DigitalInOut(board.GP25) 240 | #LED.direction = digitalio.Direction.OUTPUT 241 | 242 | ############################################################################ 243 | ######### Start simple text 244 | ############################################################################ 245 | print("Starting GUI...") 246 | 247 | 248 | #font_file = "fonts/gomme-20.pcf" 249 | font_file = "fonts/neep-24.pcf" 250 | font = bitmap_font.load_font(font_file) 251 | 252 | EditorScreen = SimpleTextDisplay(display=display,font=font,text_scale=1, 253 | colors=(SimpleTextDisplay.RED, SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK, 254 | SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK, SimpleTextDisplay.BLACK, 255 | SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK,SimpleTextDisplay.BLACK)) 256 | 257 | EditorScreen[0].text = "PYCOmputer" 258 | EditorScreen[1].text = "1" 259 | EditorScreen[2].text = "2" 260 | EditorScreen[3].text = "3" 261 | EditorScreen[4].text = "4" 262 | EditorScreen[5].text = "5" 263 | EditorScreen[6].text = "6" 264 | EditorScreen[7].text = "7" 265 | EditorScreen[8].text = "8" 266 | EditorScreen[9].text = "9" 267 | 268 | EditorScreen.show() 269 | ############################################################################ 270 | ######### Start loop 271 | ############################################################################ 272 | 273 | #supervisor.set_next_code_file("ArmachatGUI.py") 274 | 275 | #configuration load/save 276 | # microcontroller.nvm[0:3] = b"000" 277 | # print (microcontroller.nvm[0]) 278 | 279 | # Define pins connected to the chip. 280 | 281 | print ("Editor ready ...") 282 | 283 | 284 | ############################################################################ 285 | ######### MAIN LOOP 286 | ############################################################################ 287 | 288 | EditorScreen[0].background_color=0xFF0000 289 | EditorScreen[0].color=SimpleTextDisplay.WHITE 290 | 291 | while True: 292 | ### most important part, editor checking keyboard and receiving messages 293 | text = editor(text="") 294 | EditorScreen.show_terminal() 295 | print("\033[2J",end="") 296 | print("\033]0;Python Programmable Calculator\033\\",end="") 297 | print ("... Program start ...") 298 | print (text) 299 | print ("... Program response ...") 300 | try: 301 | exec(text) 302 | except Exception as err: 303 | print(err) 304 | 305 | ring() 306 | keys = getKey(0) 307 | while not keys: 308 | keys = getKey(0) -------------------------------------------------------------------------------- /Software/fonts/gohu-14.pcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/fonts/gohu-14.pcf -------------------------------------------------------------------------------- /Software/fonts/gomme-20.pcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/fonts/gomme-20.pcf -------------------------------------------------------------------------------- /Software/fonts/neep-24.pcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/fonts/neep-24.pcf -------------------------------------------------------------------------------- /Software/fonts/pavlova-16.pcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/fonts/pavlova-16.pcf -------------------------------------------------------------------------------- /Software/game_princess.py: -------------------------------------------------------------------------------- 1 | import board 2 | import time 3 | from picomputer import * 4 | import adafruit_imageload 5 | 6 | player_loc = {"x": 100, "y": 100} 7 | 8 | # Load the sprite sheet (bitmap) 9 | sprite_sheet, paletteS = adafruit_imageload.load( 10 | "tilegame_assets/princess16.bmp", 11 | bitmap=displayio.Bitmap, 12 | palette=displayio.Palette, 13 | ) 14 | town_sheet, paletteT = adafruit_imageload.load( 15 | "tilegame_assets/town.bmp", 16 | bitmap=displayio.Bitmap, 17 | palette=displayio.Palette, 18 | ) 19 | 20 | # make the color at 0 index transparent. 21 | paletteS.make_transparent(15) 22 | paletteT.make_transparent(255) 23 | # Create the sprite TileGrid 24 | sprite = displayio.TileGrid( 25 | sprite_sheet, 26 | pixel_shader=paletteS, 27 | width=1, 28 | height=1, 29 | tile_width=64, 30 | tile_height=64, 31 | default_tile=0, 32 | ) 33 | 34 | # Create the castle TileGrid 35 | castle = displayio.TileGrid( 36 | town_sheet, 37 | pixel_shader=paletteT, 38 | width=20, 39 | height=7, 40 | tile_width=32, 41 | tile_height=32, 42 | ) 43 | 44 | # Create a Group to hold the sprite and add it 45 | sprite_group = displayio.Group() 46 | sprite_group.append(sprite) 47 | 48 | # Create a Group to hold the castle and add it 49 | castle_group = displayio.Group(scale=1) 50 | castle_group.append(castle) 51 | 52 | # Create a Group to hold the sprite and castle 53 | group = displayio.Group() 54 | 55 | # Add the sprite and castle to the group 56 | group.append(castle_group) 57 | group.append(sprite_group) 58 | 59 | 60 | # floor 61 | idx=0 62 | for y in range(0, 5): 63 | for x in range(0, 8): 64 | castle[x, y] = idx # floor 65 | idx=idx+1 66 | 67 | # put the sprite somewhere in the castle 68 | sprite.x = player_loc["x"] 69 | sprite.y = player_loc["y"] 70 | 71 | # Add the Group to the Display 72 | display.show(group) 73 | 74 | floor=0 75 | rotate=0 76 | while True: 77 | keys=getKey(0) 78 | if keys: 79 | if keys == "lt": 80 | player_loc["x"] = max(0, player_loc["x"] - 1) 81 | rotate=1 82 | if keys == "rt": 83 | player_loc["x"] = min(320-64, player_loc["x"] + 1) 84 | rotate=3 85 | if keys == "up": 86 | player_loc["y"] = max(0, player_loc["y"] - 1) 87 | rotate=0 88 | if keys == "dn": 89 | player_loc["y"] = min(240-64, player_loc["y"] + 1) 90 | rotate=2 91 | 92 | if keys == "ent": 93 | for a in range(0, 7): 94 | sprite[0]=33+a 95 | time.sleep(0.2) 96 | rotate=3 97 | 98 | # for x in range(0, 19): 99 | # for y in range(0, 7): 100 | # castle[x, y] = floor # floor 101 | # floor = floor +1 102 | 103 | # update the the player sprite position 104 | sprite.x = player_loc["x"] 105 | sprite.y = player_loc["y"] 106 | spra = player_loc["x"]+player_loc["y"] 107 | sprite[0]=(8*rotate)+spra%8 108 | time.sleep(0.01) 109 | 110 | -------------------------------------------------------------------------------- /Software/graf-sin.py: -------------------------------------------------------------------------------- 1 | import time 2 | import board 3 | import displayio 4 | import terminalio 5 | from picomputer import * 6 | from math import * 7 | from adafruit_displayio_layout.widgets.cartesian import Cartesian 8 | tick_font = terminalio.FONT 9 | 10 | #display = board.DISPLAY # create the display on the PyPortal or Clue (for example) 11 | # otherwise change this to setup the display 12 | # for display chip driver and pinout you have (e.g. ILI9341) 13 | 14 | 15 | # Create a Cartesian widget 16 | my_plane = Cartesian( 17 | x=20, # x position for the plane 18 | y=-20, # y plane position 19 | width=320, # display width 20 | height=240, # display height 21 | axes_color=0xFFFF00, # axes line color 22 | axes_stroke=2, # axes lines width in pixels 23 | tick_color=0x00FFFF, # ticks color 24 | major_tick_stroke=1, # ticks width in pixels 25 | major_tick_length=5, # ticks length in pixels 26 | tick_label_font=tick_font, # the font used for the tick labels 27 | font_color=0xFF00FF, # ticks line color 28 | xrange=(0, 360), # x range 29 | yrange=(0, 100), # y range 30 | ) 31 | 32 | my_group = displayio.Group() 33 | my_group.append(my_plane) 34 | display.show(my_group) # add high level Group to the display 35 | 36 | posx = 0 37 | posy = 0 38 | my_plane.add_plot_line(0, 0) 39 | while True: 40 | for i in range(0, 360, 1): 41 | my_plane.add_plot_line(i,50+( 30*sin(radians(i)))) 42 | time.sleep(0.001) -------------------------------------------------------------------------------- /Software/icons/Abacus.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Abacus.bmp -------------------------------------------------------------------------------- /Software/icons/Flag.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Flag.bmp -------------------------------------------------------------------------------- /Software/icons/Games.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Games.bmp -------------------------------------------------------------------------------- /Software/icons/Home.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Home.bmp -------------------------------------------------------------------------------- /Software/icons/Keyboard.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Keyboard.bmp -------------------------------------------------------------------------------- /Software/icons/Multimedia.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Multimedia.bmp -------------------------------------------------------------------------------- /Software/icons/Phone.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Phone.bmp -------------------------------------------------------------------------------- /Software/icons/Tax.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Tax.bmp -------------------------------------------------------------------------------- /Software/icons/Thermometer.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Thermometer.bmp -------------------------------------------------------------------------------- /Software/icons/Time.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Time.bmp -------------------------------------------------------------------------------- /Software/icons/Turtle.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/Turtle.bmp -------------------------------------------------------------------------------- /Software/icons/icons.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/icons/icons.bmp -------------------------------------------------------------------------------- /Software/lib/adafruit_bitmap_font/bdf.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_bitmap_font/bdf.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_bitmap_font/bitmap_font.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_bitmap_font/bitmap_font.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_bitmap_font/glyph_cache.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_bitmap_font/glyph_cache.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_bitmap_font/pcf.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_bitmap_font/pcf.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_bitmap_font/ttf.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_bitmap_font/ttf.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_button.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_button.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_cursorcontrol/cursorcontrol.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_cursorcontrol/cursorcontrol.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_cursorcontrol/cursorcontrol_cursormanager.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_cursorcontrol/cursorcontrol_cursormanager.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_notification/apple.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_notification/apple.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/circle.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/circle.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/line.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/line.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/multisparkline.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/multisparkline.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/polygon.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/polygon.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/rect.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/rect.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/roundrect.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/roundrect.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/sparkline.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/sparkline.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_shapes/triangle.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_shapes/triangle.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_text/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_text/__init__.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_text/bitmap_label.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_text/bitmap_label.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_text/label.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_text/label.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_display_text/scrolling_label.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_display_text/scrolling_label.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/layouts/grid_layout.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/layouts/grid_layout.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/layouts/page_layout.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/layouts/page_layout.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/layouts/tab_layout.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/layouts/tab_layout.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/cartesian.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/cartesian.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/control.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/control.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/easing.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/easing.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/flip_input.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/flip_input.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/icon_animated.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/icon_animated.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/icon_widget.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/icon_widget.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/switch_round.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/switch_round.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_displayio_layout/widgets/widget.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_displayio_layout/widgets/widget.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_ds3231.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_ds3231.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_gps.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_gps.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/consumer_control.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/consumer_control.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/consumer_control_code.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/consumer_control_code.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/keyboard.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/keyboard.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/keyboard_layout_base.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/keyboard_layout_base.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/keyboard_layout_us.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/keyboard_layout_us.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/keycode.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/keycode.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_hid/mouse.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_hid/mouse.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/__init__.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/bmp/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/bmp/__init__.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/bmp/indexed.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/bmp/indexed.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/bmp/negative_height_check.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/bmp/negative_height_check.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/displayio_types.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/displayio_types.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/gif.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/gif.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/png.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/png.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/__init__.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/pbm_ascii.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/pbm_ascii.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/pbm_binary.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/pbm_binary.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/pgm/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/pgm/__init__.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/pgm/ascii.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/pgm/ascii.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/pgm/binary.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/pgm/binary.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/ppm_ascii.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/ppm_ascii.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/pnm/ppm_binary.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/pnm/ppm_binary.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_imageload/tilegrid_inflator.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_imageload/tilegrid_inflator.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_matrixkeypad.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_matrixkeypad.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_simple_text_display.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: Copyright (c) 2021 Kattni Rembor for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | """ 5 | `adafruit_simple_text_display` 6 | ================================================================================ 7 | 8 | A helper library for displaying lines of text on a display using displayio. 9 | 10 | 11 | * Author(s): Kattni Rembor 12 | 13 | Implementation Notes 14 | -------------------- 15 | 16 | **Hardware:** 17 | 18 | Any microcontroller with a built-in display, or an external display. 19 | 20 | **Software and Dependencies:** 21 | 22 | * Adafruit CircuitPython firmware for the supported boards: 23 | https://github.com/adafruit/circuitpython/releases 24 | """ 25 | 26 | try: 27 | from typing import Optional, Tuple 28 | from fontio import FontProtocol 29 | except ImportError: 30 | pass 31 | 32 | import board 33 | import displayio 34 | import terminalio 35 | from adafruit_display_text import bitmap_label as label 36 | 37 | __version__ = "0.0.0+auto.0" 38 | __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Simple_Text_Display.git" 39 | 40 | 41 | class SimpleTextDisplay: 42 | """Easily display lines of text on a display using displayio.""" 43 | 44 | # Color variables available for import. 45 | RED = (255, 0, 0) 46 | YELLOW = (255, 255, 0) 47 | ORANGE = (255, 150, 0) 48 | GREEN = (0, 255, 0) 49 | TEAL = (0, 255, 120) 50 | CYAN = (0, 255, 255) 51 | BLUE = (0, 0, 255) 52 | PURPLE = (180, 0, 255) 53 | MAGENTA = (255, 0, 150) 54 | WHITE = (255, 255, 255) 55 | BLACK = (0, 0, 0) 56 | 57 | GOLD = (255, 222, 30) 58 | PINK = (242, 90, 255) 59 | AQUA = (50, 255, 255) 60 | JADE = (0, 255, 40) 61 | AMBER = (255, 100, 0) 62 | VIOLET = (255, 0, 255) 63 | SKY = (0, 180, 255) 64 | 65 | def __init__( 66 | self, 67 | title: Optional[str] = None, 68 | title_color: Tuple[int, int, int] = (255, 255, 255), 69 | title_scale: int = 1, 70 | title_length: int = 0, # Ignored - will be removed in a future version 71 | text_scale: int = 1, 72 | font: Optional[FontProtocol] = None, 73 | colors: Optional[Tuple[Tuple[int, int, int], ...]] = None, 74 | display: Optional[displayio.Display] = None, 75 | ) -> None: 76 | # pylint: disable=too-many-arguments, unused-argument 77 | """Display lines of text on a display using displayio. Lines of text are created in order as 78 | shown in the example below. If you skip a number, the line will be shown blank on the 79 | display, e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be 80 | empty, and the text specified for lines 0 and 2 will be displayed on the first and third 81 | line. Remember, Python begins counting at 0, so the first line on the display is 0 in the 82 | code. Setup occurs before the loop. For data to be dynamically updated on the display, you 83 | must include the data call in the loop by using ``.text =``. For example, if setup is saved 84 | as ``temperature_data = SimpleTextDisplay()`` then ``temperature_data[0].text = 85 | microcontroller.cpu.temperature`` must be inside the ``while True:`` loop for the 86 | temperature data displayed to update as the values change. You must call `show()` at the 87 | end of the list for anything to display. See example below for usage. 88 | 89 | :param str|None title: The title displayed above the data. Set ``title="Title text"`` to 90 | provide a title. Defaults to `None`. 91 | :param Tuple(int, int, int)|None title_color: The color of the title. Not necessary if no 92 | title is provided. Defaults to white (255, 255, 255). 93 | :param int title_scale: Scale the size of the title. Not necessary if no title is provided. 94 | Defaults to 1. 95 | :param int title_length: DEPRECATED/IGNORED - This will be removed in a future version. 96 | :param int text_scale: Scale the size of the data lines. Scales the title as well. 97 | Defaults to 1. 98 | :param ~FontProtocol|None font: The font to use to display the title and data. Defaults to 99 | `terminalio.FONT`. 100 | :param Tuple(Tuple(int, int, int), ...)|None colors: A list of colors for the lines of data 101 | on the display. If you provide a single color, all lines will be that color. Otherwise 102 | it will cycle through the list you provide if the list is less than the number of lines 103 | displayed. Default colors are used if ``colors`` is not set. For example, if creating 104 | two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the first line 105 | white and the second line red, and if you created four lines of data with the same 106 | setup, it would alternate white and red. You can also use the colors built into the 107 | library. For example, if you import the library as 108 | ``from adafruit_simple_text_display import SimpleTextDisplay``, you can indicate the 109 | colors as follows: ``colors=(SimpleTextDisplay.WHITE, SimpleTextDisplay.RED)``. 110 | :param ~displayio.Display|None display: The display object. Defaults to assuming a built-in 111 | display. To use with an external display, instantiate the display object and provide it 112 | here. Defaults to ``board.DISPLAY``. 113 | 114 | This example displays two lines with temperature data in C and F on the display. 115 | Remember to call `show()` after the list to update the display. 116 | 117 | .. code-block:: python 118 | 119 | import microcontroller 120 | from adafruit_simple_text_display import SimpleTextDisplay 121 | 122 | temperature_data = SimpleTextDisplay(title="Temperature Data!", title_scale=2) 123 | 124 | while True: 125 | temperature_data[0].text = "Temperature: {:.2f} degrees C".format( 126 | microcontroller.cpu.temperature 127 | ) 128 | temperature_data[1].text = "Temperature: {:.2f} degrees F".format( 129 | (microcontroller.cpu.temperature * (9 / 5) + 32) 130 | ) 131 | temperature_data.show() 132 | 133 | """ 134 | 135 | if not colors: 136 | colors = ( 137 | SimpleTextDisplay.VIOLET, 138 | SimpleTextDisplay.GREEN, 139 | SimpleTextDisplay.RED, 140 | SimpleTextDisplay.CYAN, 141 | SimpleTextDisplay.ORANGE, 142 | SimpleTextDisplay.BLUE, 143 | SimpleTextDisplay.MAGENTA, 144 | SimpleTextDisplay.SKY, 145 | SimpleTextDisplay.YELLOW, 146 | SimpleTextDisplay.PURPLE, 147 | ) 148 | 149 | self._colors = colors 150 | if display is None: 151 | display = board.DISPLAY 152 | self._display = display 153 | self._font = font if font else terminalio.FONT 154 | self._text_scale = text_scale 155 | 156 | self.text_group = displayio.Group() 157 | 158 | if title: 159 | title_label = label.Label( 160 | self._font, 161 | text=title, 162 | color=title_color, 163 | scale=title_scale, 164 | anchor_point=(0, 0), 165 | anchored_position=(0, 0), 166 | ) 167 | self._next_y = title_label.bounding_box[3] * title_scale 168 | 169 | self.text_group.append(title_label) 170 | else: 171 | self._next_y = 0 172 | 173 | self._lines = [] 174 | # Add first line 175 | self._lines.append(self.add_text_line(color=colors[0])) 176 | 177 | def __getitem__(self, item: int) -> label.Label: 178 | """Fetch the Nth text line Group""" 179 | if len(self._lines) - 1 < item: 180 | for i in range(len(self._lines), item + 1): 181 | self._lines.append( 182 | self.add_text_line(color=self._colors[i % len(self._colors)]) 183 | ) 184 | return self._lines[item] 185 | 186 | def add_text_line( 187 | self, color: Tuple[int, int, int] = (255, 255, 255) 188 | ) -> label.Label: 189 | """Adds a line on the display of the specified color and returns the label object.""" 190 | 191 | text_label = label.Label( 192 | self._font, 193 | text="Myj", # Dummy value to allow bounding_box to calculate 194 | color=color, 195 | background_color=0xFFFFFF, 196 | padding_right=320, 197 | scale=self._text_scale, 198 | anchor_point=(0, 0), 199 | anchored_position=(0, self._next_y), 200 | ) 201 | self._next_y += text_label.bounding_box[3] * text_label.scale 202 | text_label.text = "" # Erase the dummy value after using bounding_box 203 | self.text_group.append(text_label) 204 | 205 | return text_label 206 | 207 | def show(self) -> None: 208 | """Call show() to display the data list.""" 209 | self._display.show(self.text_group) 210 | 211 | def show_terminal(self) -> None: 212 | """Revert to terminalio screen.""" 213 | self._display.show(None) 214 | -------------------------------------------------------------------------------- /Software/lib/adafruit_slideshow.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_slideshow.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_ssd1306.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_ssd1306.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_st7735.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_st7735.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_st7735r.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_st7735r.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_st7789.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_st7789.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_ticks.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_ticks.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_turtle.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_turtle.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_waveform/sine.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_waveform/sine.mpy -------------------------------------------------------------------------------- /Software/lib/adafruit_waveform/square.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/lib/adafruit_waveform/square.mpy -------------------------------------------------------------------------------- /Software/lib/config.py: -------------------------------------------------------------------------------- 1 | import time 2 | import board 3 | import busio 4 | import digitalio 5 | import os 6 | import displayio 7 | import touchio 8 | import microcontroller 9 | from pwmio import PWMOut 10 | from adafruit_st7789 import ST7789 11 | from adafruit_st7735r import ST7735R 12 | import supervisor 13 | 14 | #------------configure your device---------------- 15 | #device_model="PICOMPUTER" 16 | #device_model="WATCH" 17 | #device_model="WIO" 18 | #device_model="PYPRCAZX" 19 | device_model="PICOPAD" 20 | #device_model="TOUCH" 21 | #GUI=False 22 | #SCALE=1 23 | #LoRa radio configuration 24 | country_code=1 25 | country="US" 26 | #country="EU" 27 | # ---------- Device combination ---------- 28 | if device_model=="COMPACT": 29 | keyboard_model="keys30" 30 | display_model= "display320x240" 31 | model_lora = "compact" 32 | AUDIO_GPIO = board.GP0 33 | elif device_model=="PICOMPUTER": 34 | keyboard_model="keys36" 35 | display_model= "display320x240" 36 | model_lora = "compact" 37 | AUDIO_GPIO = board.GP0 38 | elif device_model=="WATCH": 39 | keyboard_model="keys30watch" 40 | display_model= "display160x80" 41 | model_lora = "watch" 42 | AUDIO_GPIO = board.GP4 43 | elif device_model=="WIO": 44 | keyboard_model="keysWio" 45 | display_model= "displayWio" 46 | model_lora = "wio" 47 | AUDIO_GPIO = board.BUZZER 48 | elif device_model=="PYPRCAZX": 49 | keyboard_model="keys49zx" 50 | display_model= "display320x240zx" 51 | model_lora = "zx" 52 | AUDIO_GPIO = board.GP7 53 | elif device_model=="PICOPAD": 54 | keyboard_model="keys8picopad" 55 | display_model= "display320x240picopad" 56 | model_lora = "picopad" 57 | AUDIO_GPIO = board.GP15 58 | elif device_model=="TOUCH": 59 | keyboard_model="touch30" 60 | display_model= "display280x240touch" 61 | model_lora = "touch" 62 | AUDIO_GPIO = board.GP22 63 | 64 | 65 | if country=="EU": #EU 66 | frequency = 869.525 67 | elif country=="US": #US 68 | frequency = 906.875 69 | 70 | signal_bandwidth = 125000 71 | coding_rate = 8 72 | spreading_factor = 12 73 | preamble_length = 32 74 | tx_power=15 75 | 76 | # Communicator settings 77 | myName = "Armachat01" #keep exactly 10 chars, it will be stored in NVM 78 | #my address 79 | myAddress = "192.168.1.5" 80 | destination = "192.168.1.5" 81 | maxHops=3 82 | # Encryption password 83 | encryption = True 84 | syncWord = 0x2B 85 | password = "TopSecretArmachatDeafultPassword" 86 | passwordIv = "0123456789123456" 87 | 88 | #Various configuration settings 89 | MAX_INPUT_TEXT = 240 90 | volume = 6 91 | #this is default voltages but by sole lost on diodes and chargers you can addjust 92 | voltageMax=4.2 #fully charged battery 93 | voltageMin=2.5 #empty battery 94 | sleepTime=100 #time in second to reduced brightness 95 | sleepBrightness=0.01 #reduced brightness 0.1 = 10# 96 | lightSleepEnabled=False #if true MCU go to sleep but display radomly flashing 97 | timeInLightSleep=1 # 1=wake every second 98 | ignoreDestination=True # if True you receive all messages / False receive only your messages 99 | 100 | #------------configure Radio module connection ---------------- 101 | if model_lora == "picopad": 102 | LORA_CS = digitalio.DigitalInOut(board.GP13) 103 | LORA_SCK = board.GP10 104 | LORA_MOSI = board.GP11 105 | LORA_MISO = board.GP12 106 | LORA_INT = board.GP28 107 | 108 | if model_lora == "compact": 109 | LORA_CS = digitalio.DigitalInOut(board.GP13) 110 | #this is alternative LoRa module CS signal 111 | RXD = digitalio.DigitalInOut(board.GP17) 112 | LORA_SCK = board.GP10 113 | LORA_MOSI = board.GP11 114 | LORA_MISO = board.GP12 115 | LORA_INT = board.GP28 116 | 117 | elif model_lora == "watch": 118 | LORA_CS = digitalio.DigitalInOut(board.GP1) 119 | LORA_SCK = board.GP2 120 | LORA_MOSI = board.GP3 121 | LORA_MISO = board.GP0 122 | LORA_INT = board.GP28 123 | 124 | elif model_lora == "touch": 125 | LORA_CS = digitalio.DigitalInOut(board.GP28) 126 | LORA_SCK = board.GP10 127 | LORA_MOSI = board.GP11 128 | LORA_MISO = board.GP12 129 | LORA_INT = board.GP28 130 | 131 | elif model_lora == "zx": 132 | LORA_CS = digitalio.DigitalInOut(board.GP13) 133 | LORA_SCK = board.GP10 134 | LORA_MOSI = board.GP11 135 | LORA_MISO = board.GP12 136 | LORA_INT = board.GP0 137 | 138 | elif model_lora == "wio": 139 | LORA_CS = digitalio.DigitalInOut(board.CS) 140 | LORA_SCK = board.SCK 141 | LORA_MOSI = board.MOSI 142 | LORA_MISO = board.MISO 143 | LORA_INT = board.LIGHT 144 | 145 | elif model_lora == "e5": 146 | print("Lora E5 or NONE") 147 | 148 | #------------configure KEYBOARD variants ---------------- 149 | 150 | if keyboard_model == "keys30": 151 | cols = [ 152 | digitalio.DigitalInOut(x) 153 | for x in (board.GP1, board.GP2, board.GP3, board.GP4, board.GP5) 154 | ] 155 | rows = [ 156 | digitalio.DigitalInOut(x) 157 | for x in (board.GP6, board.GP9, board.GP15, board.GP8, board.GP7, board.GP22) 158 | ] 159 | keys1 = ( 160 | ("ent", " ", "m", "n", "b"), 161 | ("bsp", "l", "k", "j", "h"), 162 | ("p", "o", "i", "u", "y"), 163 | ("alt", "z", "x", "c", "v"), 164 | ("a", "s", "d", "f", "g"), 165 | ("q", "w", "e", "r", "t"), 166 | ) 167 | 168 | keys2 = ( 169 | ("rt", ",", ">", "<", '""'), 170 | ("lt", "-", "*", "&", "+"), 171 | ("0", "9", "8", "7", "6"), 172 | ("alt", "(", ")", "?", "/"), 173 | ("!", "@", "#", "$", "%"), 174 | ("1", "2", "3", "4", "5"), 175 | ) 176 | 177 | keys3 = ( 178 | ("dn", ";", "M", "N", "B"), 179 | ("up", "L", "K", "J", "H"), 180 | ("P", "O", "I", "U", "Y"), 181 | ("alt", "Z", "X", "C", "V"), 182 | ("A", "S", "D", "F", "G"), 183 | ("Q", "W", "E", "R", "T"), 184 | ) 185 | 186 | elif keyboard_model == "keys36": 187 | cols = [ 188 | digitalio.DigitalInOut(x) 189 | for x in (board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP14) 190 | ] 191 | rows = [ 192 | digitalio.DigitalInOut(x) 193 | for x in (board.GP6, board.GP9, board.GP15, board.GP8, board.GP7, board.GP22) 194 | ] 195 | keys1 = ( 196 | (" ", ".", "m", "n", "b", "dn"), 197 | ("ent", "l", "k", "j", "h", "lt"), 198 | ("p", "o", "i", "u", "y", "up"), 199 | ("bsp", "z", "x", "c", "v", "rt"), 200 | ("a", "s", "d", "f", "g", "tab"), 201 | ("q", "w", "e", "r", "t", "alt"), 202 | ) 203 | 204 | keys2 = ( 205 | ("_", ",", ">", "<", '""', "{"), 206 | ("~", "-", "*", "&", "+", "["), 207 | ("0", "9", "8", "7", "6", "}"), 208 | ("=", "(", ")", "?", "/", "]"), 209 | ("!", "@", "#", "$", "%", "\\"), 210 | ("1", "2", "3", "4", "5", "alt"), 211 | ) 212 | 213 | keys3 = ( 214 | (":", ";", "M", "N", "B", "dn"), 215 | ("ent", "L", "K", "J", "H", "lt"), 216 | ("P", "O", "I", "U", "Y", "up"), 217 | ("bsp", "Z", "X", "C", "V", "rt"), 218 | ("A", "S", "D", "F", "G", "tab"), 219 | ("Q", "W", "E", "R", "T", "alt"), 220 | ) 221 | 222 | elif keyboard_model == "keys8picopad": 223 | 224 | keys0 = [ 225 | digitalio.DigitalInOut(x) 226 | for x in ( 227 | board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8, board.GP9 228 | ) 229 | ] 230 | 231 | 232 | elif keyboard_model == "keys49zx": 233 | rows = [ 234 | digitalio.DigitalInOut(x) 235 | for x in (board.GP8, board.GP9, board.GP14, board.GP15, board.GP16, board.GP17, board.GP18) 236 | ] 237 | cols = [ 238 | digitalio.DigitalInOut(x) 239 | for x in (board.GP19, board.GP20, board.GP21, board.GP22, board.GP26, board.GP27, board.GP28) 240 | ] 241 | keys1 = ( 242 | ("ent", "lt", "up", "rt", "dn", "alt", "."), 243 | ("1", "2", "3", "4", "5", "6", "7"), 244 | ("8", "9", "0", "q", "w", "e", "r"), 245 | ("t", "y", "u", "i", "o", "p", "a"), 246 | ("s", "d", "f", "g", "h", "j", "k"), 247 | ("l", "bsp", "z", "x", "c", "v", "b"), 248 | ("n", "m", " ", "*", "/", "-", "+"), 249 | ) 250 | 251 | keys2 = ( 252 | ("tab", "lt", "up", "dn", "rt", "alt", "ss"), 253 | ("!", "@", "#", "$", "%", "&", "'"), 254 | ("(", ")", "_", "Q", "W", "E", "<"), 255 | (">", "[", "]", "I", ";", '"', "~"), 256 | ("|", "\\", "{", "}", "^", "-", "+"), 257 | ("=", "ent", ":", "X", "?", "/", "B"), 258 | (",", ".", " ", "mn", "rl", "pr", "nx"), 259 | ) 260 | 261 | keys3 = ( 262 | ("tab", "lt", "up", "dn", "rt", "alt", "ss"), 263 | ("1", "2", "3", "4", "5", "6", "7"), 264 | ("8", "9", "0", "Q", "W", "E", "R"), 265 | ("T", "Y", "U", "I", "O", "P", "A"), 266 | ("S", "D", "F", "G", "H", "J", "K"), 267 | ("L", "ent", "Z", "X", "C", "V", "B"), 268 | ("N", "M", " ", "mn", "rl", "pr", "nx"), 269 | ) 270 | 271 | 272 | 273 | elif keyboard_model == "keys30watch": 274 | cols = [ 275 | digitalio.DigitalInOut(x) 276 | for x in (board.GP28, board.GP27, board.GP26, board.GP22, board.GP21) 277 | ] 278 | rows = [ 279 | digitalio.DigitalInOut(x) 280 | for x in ( 281 | board.GP20, board.GP19, board.GP18, board.GP17, board.GP16, board.GP15 282 | ) 283 | ] 284 | keys1 = ( 285 | ("ent", " ", "m", "n", "b"), 286 | ("bsp", "l", "k", "j", "h"), 287 | ("p", "o", "i", "u", "y"), 288 | ("alt", "z", "x", "c", "v"), 289 | ("a", "s", "d", "f", "g"), 290 | ("q", "w", "e", "r", "t"), 291 | ) 292 | keys2 = ( 293 | ("rt", ",", ">", "<", '""'), 294 | ("lt", "-", "*", "&", "+"), 295 | ("0", "9", "8", "7", "6"), 296 | ("alt", "(", ")", "?", "/"), 297 | ("!", "@", "#", "$", "%"), 298 | ("1", "2", "3", "4", "5"), 299 | ) 300 | keys3 = ( 301 | ("dn", ";", "M", "N", "B"), 302 | ("up", "L", "K", "J", "H"), 303 | ("P", "O", "I", "U", "Y"), 304 | ("alt", "Z", "X", "C", "V"), 305 | ("A", "S", "D", "F", "G"), 306 | ("Q", "W", "E", "R", "T"), 307 | ) 308 | 309 | elif keyboard_model == "touch30": 310 | touch9c = touchio.TouchIn(board.GP3) 311 | touch8c = touchio.TouchIn(board.GP4) 312 | touch7c = touchio.TouchIn(board.GP5) 313 | touch6c = touchio.TouchIn(board.GP6) 314 | touch5c = touchio.TouchIn(board.GP7) 315 | touch4c = touchio.TouchIn(board.GP8) 316 | touch3c = touchio.TouchIn(board.GP9) 317 | touch2c = touchio.TouchIn(board.GP13) 318 | touch1c = touchio.TouchIn(board.GP14) 319 | touch0c = touchio.TouchIn(board.GP15) 320 | touch0r = touchio.TouchIn(board.GP2) 321 | touch1r = touchio.TouchIn(board.GP1) 322 | touch2r = touchio.TouchIn(board.GP0) 323 | 324 | keys1 = ( 325 | ("q", "w", "e", "r", "t","y", "u", "i", "o", "p"), 326 | ("a", "s", "d", "f", "g","h", "j", "k", "l", "bsp"), 327 | ("alt", "z", "x", "c", "v","b", "n", "m", " ", "ent"), 328 | ) 329 | keys2 = ( 330 | ("1", "2", "3", "4", "5","6", "7", "8", "9", "0"), 331 | ("!", "@", "#", "$", "%","+", "&", "*", "-", "lt"), 332 | ("alt", "(", ")", "?", "/","""""", ";", ":", ".", "rt"), 333 | ) 334 | keys3 = ( 335 | ("Q", "W", "E", "R", "T","Y", "U", "I", "O", "P"), 336 | ("A", "S", "D", "F", "G","H", "J", "K", "L", "up"), 337 | ("alt", "Z", "X", "C", "V","B", "N", "M", ",", "dn"), 338 | ) 339 | 340 | elif keyboard_model == "keysWio": 341 | cols = [ 342 | digitalio.DigitalInOut(x) 343 | for x in (board.I2S_BCLK, board.DAC0, board.D4, board.D5, board.DAC1) 344 | ] 345 | rows = [ 346 | digitalio.DigitalInOut(x) 347 | for x in (board.I2S_SDOUT, board.I2S_SDIN, board.D8, board.D7, board.I2S_LRCLK, board.D6) 348 | ] 349 | keys1 = ( 350 | ("ent", " ", "m", "n", "b"), 351 | ("bsp", "l", "k", "j", "h"), 352 | ("p", "o", "i", "u", "y"), 353 | ("alt", "z", "x", "c", "v"), 354 | ("a", "s", "d", "f", "g"), 355 | ("q", "w", "e", "r", "t"), 356 | ) 357 | 358 | keys2 = ( 359 | ("rt", ",", ">", "<", '""'), 360 | ("lt", "-", "*", "&", "+"), 361 | ("0", "9", "8", "7", "6"), 362 | ("alt", "(", ")", "?", "/"), 363 | ("!", "@", "#", "$", "%"), 364 | ("1", "2", "3", "4", "5"), 365 | ) 366 | 367 | keys3 = ( 368 | ("dn", ";", "M", "N", "B"), 369 | ("up", "L", "K", "J", "H"), 370 | ("P", "O", "I", "U", "Y"), 371 | ("alt", "Z", "X", "C", "V"), 372 | ("A", "S", "D", "F", "G"), 373 | ("Q", "W", "E", "R", "T"), 374 | ) 375 | # ---------- End of Keyboard Settings ---------- 376 | 377 | #------------configure display---------------- 378 | 379 | if display_model == "display320x240": 380 | displayio.release_displays() 381 | SPI = busio.SPI(board.GP18, board.GP19) 382 | display_bus = displayio.FourWire(SPI, command=board.GP16, chip_select=board.GP21) 383 | display = ST7789(display_bus, rotation=270, width=320, height=240, backlight_pin=board.GP20, backlight_pwm_frequency=500) 384 | MAX_CHARS = 26 385 | 386 | elif display_model == "display320x240zx": 387 | displayio.release_displays() 388 | SPI = busio.SPI(board.GP2, board.GP3) 389 | display_bus = displayio.FourWire(SPI, command=board.GP6, chip_select=board.GP5) 390 | display = ST7789(display_bus, rotation=270, width=320, height=240, backlight_pin=board.GP4, backlight_pwm_frequency=500) 391 | MAX_CHARS = 26 392 | 393 | elif display_model == "display320x240picopad": 394 | displayio.release_displays() 395 | SPI = busio.SPI(board.GP18, board.GP19) 396 | display_bus = displayio.FourWire(SPI, command=board.GP17, chip_select=board.GP21, reset=board.GP20) 397 | display = ST7789(display_bus, rotation=270, width=320, height=240, backlight_pin=board.GP16, backlight_pwm_frequency=500) 398 | MAX_CHARS = 26 399 | 400 | elif display_model == "display280x240": 401 | displayio.release_displays() 402 | SPI = busio.SPI(board.GP18, board.GP19) 403 | display_bus = displayio.FourWire(SPI, command=board.GP16, chip_select=board.GP21) 404 | display = ST7789(display_bus, rotation=270, width=280, height=240, rowstart=20, backlight_pin=board.GP20) 405 | MAX_CHARS = 23 406 | 407 | elif display_model == "display280x240touch": 408 | displayio.release_displays() 409 | SPI = busio.SPI(board.GP18, board.GP19) 410 | display_bus = displayio.FourWire(SPI, command=board.GP26, chip_select=board.GP21) 411 | display = ST7789(display_bus, rotation=270, width=280, height=240, rowstart=20, backlight_pin=board.GP20) 412 | MAX_CHARS = 23 413 | 414 | elif display_model == "display160x80": 415 | displayio.release_displays() 416 | SPI = busio.SPI(board.GP10, board.GP11) 417 | display_bus = displayio.FourWire(SPI, command=board.GP8, chip_select=board.GP9, reset=board.GP12) 418 | display = ST7735R(display_bus, width=160, height=80, rotation=90, backlight_pin=board.GP25, rowstart=1, colstart=26, invert=True) 419 | MAX_CHARS = 23 420 | 421 | elif display_model == "display160x80emul": 422 | displayio.release_displays() 423 | SPI = busio.SPI(board.GP18, board.GP19) 424 | display_bus = displayio.FourWire(SPI, command=board.GP16, chip_select=board.GP21) 425 | display = ST7789(display_bus, width=160, height=80, rotation=270, backlight_pin=board.GP20, rowstart=0, colstart=0) 426 | MAX_CHARS = 23 427 | 428 | elif display_model == "displayWio": 429 | display = board.DISPLAY 430 | MAX_CHARS = 26 431 | 432 | print (".CONFIG DONE") -------------------------------------------------------------------------------- /Software/lib/picomputer.py: -------------------------------------------------------------------------------- 1 | from pwmio import PWMOut 2 | from config import * 3 | import digitalio 4 | import busio 5 | from digitalio import DigitalInOut, Direction, Pull 6 | import adafruit_matrixkeypad 7 | 8 | def beep(): 9 | audioPin = PWMOut(AUDIO_GPIO, duty_cycle=0, frequency=440, variable_frequency=True) 10 | audioPin.frequency = 4000 11 | audioPin.duty_cycle = 10000 * (volume) 12 | time.sleep(0.01) 13 | audioPin.duty_cycle = 0 14 | audioPin.deinit() 15 | 16 | def ring(): 17 | audioPin = PWMOut(AUDIO_GPIO, duty_cycle=0, frequency=440, variable_frequency=True) 18 | audioPin.frequency = 4000 19 | audioPin.duty_cycle = 1000 * (volume) 20 | time.sleep(0.05) 21 | audioPin.duty_cycle = 0 22 | audioPin.deinit() 23 | time.sleep(0.2) 24 | audioPin = PWMOut(AUDIO_GPIO, duty_cycle=0, frequency=440, variable_frequency=True) 25 | audioPin.frequency = 8000 26 | audioPin.duty_cycle = 1000 * (volume) 27 | time.sleep(0.05) 28 | audioPin.duty_cycle = 0 29 | audioPin.deinit() 30 | 31 | def getKey(layout): 32 | 33 | keys = "" 34 | if keyboard_model == "touch30": 35 | touch_rows = [touch0r.value,touch1r.value,touch2r.value] 36 | touch_cols = [touch0c.value,touch1c.value,touch2c.value, 37 | touch3c.value,touch4c.value,touch5c.value, 38 | touch6c.value,touch7c.value,touch8c.value, 39 | touch9c.value] 40 | r=0 41 | for tr in touch_rows: 42 | r=r+1 43 | if tr: 44 | c=0 45 | for tc in touch_cols: 46 | c=c+1 47 | if tc: 48 | #print (r,c) 49 | if layout == 0: 50 | return (keys1[r-1][c-1]) 51 | elif layout == 1: 52 | return (keys2[r-1][c-1]) 53 | elif layout == 2: 54 | return (keys3[r-1][c-1]) 55 | return keys 56 | 57 | elif keyboard_model=="keys36" or keyboard_model=="keys30" or keyboard_model=="keys30watch" or keyboard_model=="keys49zx" or keyboard_model=="keysWio": 58 | if layout == 0: 59 | keypad = adafruit_matrixkeypad.Matrix_Keypad(rows, cols, keys1) 60 | #layoutName = "a" 61 | elif layout == 1: 62 | keypad = adafruit_matrixkeypad.Matrix_Keypad(rows, cols, keys2) 63 | #layoutName = "1" 64 | elif layout == 2: 65 | keypad = adafruit_matrixkeypad.Matrix_Keypad(rows, cols, keys3) 66 | #layoutName = "A" 67 | keys = keypad.pressed_keys 68 | if keys: 69 | keys = keys[0] 70 | 71 | 72 | elif keyboard_model=="keys8picopad": 73 | keys="" 74 | keys0[0].switch_to_input(Pull.UP) #right 75 | keys0[1].switch_to_input(Pull.UP) #left 76 | keys0[2].switch_to_input(Pull.UP) #up 77 | keys0[3].switch_to_input(Pull.UP) #down 78 | keys0[4].switch_to_input(Pull.UP) #B 79 | keys0[5].switch_to_input(Pull.UP) #A 80 | keys0[6].switch_to_input(Pull.UP) #Y 81 | keys0[7].switch_to_input(Pull.UP) #X 82 | 83 | if keys0[0].value is False: 84 | keys="rt" 85 | if keys0[1].value is False: 86 | keys="lt" 87 | if keys0[2].value is False: 88 | keys="up" 89 | if keys0[3].value is False: 90 | keys="dn" 91 | if keys0[4].value is False: 92 | keys="ent" 93 | if keys0[5].value is False: 94 | keys="bsp" 95 | if keys0[6].value is False: 96 | keys="pgdown" 97 | if keys0[7].value is False: 98 | keys="pgup" 99 | return keys 100 | 101 | def get_VSYSvoltage(): 102 | VSYSin = ((VSYS_voltage.value * 3.3) / 65536) * 3 103 | return VSYSin 104 | -------------------------------------------------------------------------------- /Software/mp3.py: -------------------------------------------------------------------------------- 1 | """ 2 | CircuitPython single MP3 playback example for Raspberry Pi Pico. 3 | Plays a single MP3 once. 4 | """ 5 | import board 6 | import audiomp3 7 | import audiopwmio 8 | from picomputer import * 9 | 10 | audio = audiopwmio.PWMAudioOut(AUDIO_GPIO) 11 | 12 | print("Done playing!") 13 | decoder = audiomp3.MP3Decoder(open("/mp3/new.mp3", "rb")) 14 | 15 | audio.play(decoder) 16 | while audio.playing: 17 | pass -------------------------------------------------------------------------------- /Software/mp3/new.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/mp3/new.mp3 -------------------------------------------------------------------------------- /Software/photoframe.py: -------------------------------------------------------------------------------- 1 | from adafruit_slideshow import SlideShow 2 | 3 | from picomputer import * 4 | 5 | 6 | slideshow = SlideShow( 7 | display, 8 | None, 9 | folder="/bmps", 10 | loop=True, 11 | order=0, 12 | fade_effect=False, 13 | dwell=1, 14 | auto_advance=True, 15 | ) 16 | 17 | slideshow.brightness=1 18 | while slideshow.update(): 19 | pass -------------------------------------------------------------------------------- /Software/tilegame_assets/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2018 Limor Fried/ladyada for Adafruit Industries 2 | # SPDX-FileCopyrightText: 2019 Brennen Bearnes for Adafruit Industries 3 | # 4 | # SPDX-License-Identifier: MIT 5 | -------------------------------------------------------------------------------- /Software/tilegame_assets/castle_sprite_sheet.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/castle_sprite_sheet.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/fun_facts.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 FoamyGuy for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | # pylint: disable=line-too-long 6 | # Fun facts to be read to the player by Minerva 7 | FACTS = [ 8 | "The digitalio module lets you read and write HIGH and LOW values with IO pins.", 9 | "JSON stands for Javascript Object Notation. It's a language for storing and transfering data.", 10 | "PMW stands for pulse width modulation. The pulsio module lets you use PWM pins.", 11 | "REPL stands for Read Evaluate Print Loop. You access it by sending ctrl-C via serial.", 12 | "Released in 1979 Namco's arcade game Galaxian was the first tile-based video game.", 13 | "Python dictionaries can have keys and values of any type! Even functions.", 14 | "Circuitpython was initially released July 19, 2017.", 15 | "The displayio module was introducted in Circuipython 4.0. It simplified drawing images and text on screens.", 16 | "The adafruit_dotstar and neopixel libraries make it easy control dazzling addressable RGB LEDs.", 17 | "You can sense human touch on an IO pin with the touchio module.", 18 | ] 19 | -------------------------------------------------------------------------------- /Software/tilegame_assets/lady.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/lady.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/map0.csv: -------------------------------------------------------------------------------- 1 | top_left_wall,top_wall,top_wall,top_right_wall,,,top_left_wall,top_wall,top_wall,top_wall,top_right_wall,,, 2 | left_wall,player,floor,floor,top_wall,top_wall,floor,floor,floor,right_wall,right_wall,top_wall,top_wall,top_right_wall 3 | left_wall,floor,floor,mho,floor,floor,floor,floor,top_wall,right_wall,minerva,floor,sparky,right_wall 4 | left_wall,minerva,floor,floor,heart,floor,floor,left_wall,floor,sparky,floor,floor,floor,right_wall 5 | left_wall,top_wall,top_wall,sparky,top_wall,top_wall,top_wall,left_wall,floor,right_wall,floor,floor,floor,right_wall 6 | left_wall,floor,floor,mho,floor,floor,floor,floor,floor,right_wall,heart,floor,robot,right_wall 7 | left_wall,floor,floor,floor,floor,floor,heart,floor,floor,right_wall,right_wall,bottom_wall,bottom_wall,bottom_right_wall 8 | bottom_left_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_right_wall,,, 9 | -------------------------------------------------------------------------------- /Software/tilegame_assets/map1.csv: -------------------------------------------------------------------------------- 1 | top_left_wall,top_wall,top_wall,top_right_wall,floor,floor,top_left_wall,top_wall,top_wall,top_wall,top_right_wall,,, 2 | left_wall,mho,floor,floor,top_wall,top_wall,minerva,floor,right_wall,floor,heart,top_wall,top_wall,top_right_wall 3 | left_wall,floor,player,floor,floor,left_wall,floor,floor,sparky,floor,floor,floor,floor,right_wall 4 | left_wall,floor,floor,floor,floor,sparky,floor,floor,right_wall,mho,floor,floor,floor,right_wall 5 | left_wall,floor,floor,floor,floor,left_wall,floor,floor,right_wall,top_wall,top_wall,sparky,top_wall,right_wall 6 | left_wall,floor,mho,floor,floor,left_wall,floor,floor,right_wall,floor,floor,floor,floor,right_wall 7 | left_wall,floor,floor,floor,floor,left_wall,heart,floor,right_wall,floor,floor,floor,mho,right_wall 8 | bottom_left_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,heart,floor,floor,right_wall 9 | ,top_left_wall,top_wall,top_wall,top_wall,top_wall,top_right_wall,floor,floor,floor,left_wall,floor,floor,right_wall 10 | ,left_wall,robot,floor,floor,floor,sparky,floor,floor,floor,left_wall,heart,floor,right_wall 11 | ,left_wall,floor,floor,floor,floor,right_wall,floor,floor,floor,sparky,floor,floor,right_wall 12 | ,left_wall,floor,floor,minerva,floor,right_wall,floor,heart,floor,left_wall,floor,floor,right_wall 13 | ,left_wall,floor,floor,floor,floor,right_wall,top_wall,top_wall,top_wall,left_wall,floor,floor,right_wall 14 | ,left_wall,floor,floor,floor,floor,right_wall,floor,floor,floor,left_wall,floor,mho,right_wall 15 | ,left_wall,floor,floor,floor,floor,sparky,floor,mho,floor,sparky,floor,minerva,right_wall 16 | ,left_wall,floor,floor,floor,floor,right_wall,floor,floor,floor,left_wall,floor,floor,right_wall 17 | ,bottom_left_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_wall,bottom_right_wall 18 | -------------------------------------------------------------------------------- /Software/tilegame_assets/princess.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/princess.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/princess16.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/princess16.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/ranger.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/ranger.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/sprite_sheet.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/sprite_sheet.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/states.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 FoamyGuy for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | # State machine constants 6 | 7 | # playing the game: draw the map, listen for D-pad buttons to move player 8 | STATE_PLAYING = 0 9 | 10 | # player beat this map level 11 | STATE_MAPWIN = 1 12 | 13 | # waiting for player to press A button to continue 14 | STATE_WAITING = 2 15 | 16 | # player lost by touching sparky 17 | STATE_LOST_SPARKY = 3 18 | 19 | # minerva shows a fun fact 20 | STATE_MINERVA = 4 21 | -------------------------------------------------------------------------------- /Software/tilegame_assets/text_helper.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 FoamyGuy for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | def wrap_nicely(string, max_chars): 6 | """ From: https://www.richa1.com/RichardAlbritton/circuitpython-word-wrap-for-label-text/ 7 | A helper that will return the string with word-break wrapping. 8 | :param str string: The text to be wrapped. 9 | :param int max_chars: The maximum number of characters on a line before wrapping. 10 | """ 11 | string = string.replace("\n", "").replace("\r", "") # strip confusing newlines 12 | words = string.split(" ") 13 | the_lines = [] 14 | the_line = "" 15 | for w in words: 16 | if len(the_line + " " + w) <= max_chars: 17 | the_line += " " + w 18 | else: 19 | the_lines.append(the_line) 20 | the_line = w 21 | if the_line: 22 | the_lines.append(the_line) 23 | the_lines[0] = the_lines[0][1:] 24 | the_newline = "" 25 | for w in the_lines: 26 | the_newline += "\n" + w 27 | return the_newline 28 | -------------------------------------------------------------------------------- /Software/tilegame_assets/tiles.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 FoamyGuy for Adafruit Industries 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from tilegame_assets.states import ( 6 | STATE_MAPWIN, 7 | STATE_LOST_SPARKY, 8 | STATE_MINERVA, 9 | ) 10 | # pylint: disable=unused-argument 11 | 12 | 13 | # Minerva before_move. Set game state to STATE_MINERVA 14 | def minerva_walk(to_coords, from_coords, entity_obj, GAME_STATE): 15 | GAME_STATE["STATE"] = STATE_MINERVA 16 | return False 17 | 18 | 19 | # Sparky before_move. If user does not have a Mho in inventory they lose. 20 | # If user does have Mho subtract one from inventory and consume Sparky. 21 | def sparky_walk(to_coords, from_coords, entity_obj, GAME_STATE): 22 | if GAME_STATE["INVENTORY"].count("mho") > 0: 23 | GAME_STATE["INVENTORY"].remove("mho") 24 | GAME_STATE["ENTITY_SPRITES_DICT"][to_coords].remove(entity_obj) 25 | if len(GAME_STATE["ENTITY_SPRITES_DICT"][to_coords]) == 0: 26 | del GAME_STATE["ENTITY_SPRITES_DICT"][to_coords] 27 | if (-1, -1) in GAME_STATE["ENTITY_SPRITES_DICT"]: 28 | GAME_STATE["ENTITY_SPRITES_DICT"][-1, -1].append(entity_obj) 29 | else: 30 | GAME_STATE["ENTITY_SPRITES_DICT"][-1, -1] = [entity_obj] 31 | return True 32 | else: 33 | GAME_STATE["STATE"] = STATE_LOST_SPARKY 34 | return True 35 | 36 | 37 | # Robot before_move. If user has all Hearts they win the map. 38 | def robot_walk(to_coords, from_coords, entity_obj, GAME_STATE): 39 | if GAME_STATE["INVENTORY"].count("heart") == GAME_STATE["TOTAL_HEARTS"]: 40 | GAME_STATE["STATE"] = STATE_MAPWIN 41 | return True 42 | 43 | return False 44 | 45 | 46 | # Remove the item from this location and add it to player inventory. 47 | def take_item(to_coords, from_coords, entity_obj, GAME_STATE): 48 | print(entity_obj) 49 | GAME_STATE["INVENTORY"].append(entity_obj["map_tile_name"]) 50 | GAME_STATE["ENTITY_SPRITES_DICT"][to_coords].remove(entity_obj) 51 | if len(GAME_STATE["ENTITY_SPRITES_DICT"][to_coords]) == 0: 52 | del GAME_STATE["ENTITY_SPRITES_DICT"][to_coords] 53 | 54 | if (-1, -1) in GAME_STATE["ENTITY_SPRITES_DICT"]: 55 | GAME_STATE["ENTITY_SPRITES_DICT"][-1, -1].append(entity_obj) 56 | else: 57 | GAME_STATE["ENTITY_SPRITES_DICT"][-1, -1] = [entity_obj] 58 | 59 | return True 60 | 61 | 62 | # main dictionary that maps tile type strings to objects. 63 | # each one stores the sprite_sheet index and any necessary 64 | # behavioral stats like can_walk or before_move 65 | TILES = { 66 | # empty strings default to floor and no walk. 67 | "": {"sprite_index": 10, "can_walk": False}, 68 | "floor": {"sprite_index": 10, "can_walk": True}, 69 | "top_wall": {"sprite_index": 7, "can_walk": False}, 70 | "top_right_wall": {"sprite_index": 8, "can_walk": False}, 71 | "top_left_wall": {"sprite_index": 6, "can_walk": False}, 72 | "bottom_right_wall": {"sprite_index": 14, "can_walk": False}, 73 | "bottom_left_wall": {"sprite_index": 12, "can_walk": False}, 74 | "right_wall": {"sprite_index": 11, "can_walk": False}, 75 | "left_wall": {"sprite_index": 9, "can_walk": False}, 76 | "bottom_wall": {"sprite_index": 13, "can_walk": False}, 77 | "robot": { 78 | "sprite_index": 1, 79 | "can_walk": True, 80 | "entity": True, 81 | "before_move": robot_walk, 82 | }, 83 | "heart": { 84 | "sprite_index": 5, 85 | "can_walk": True, 86 | "entity": True, 87 | "before_move": take_item, 88 | }, 89 | "mho": { 90 | "sprite_index": 2, 91 | "can_walk": True, 92 | "entity": True, 93 | "before_move": take_item, 94 | }, 95 | "sparky": { 96 | "sprite_index": 4, 97 | "can_walk": True, 98 | "entity": True, 99 | "before_move": sparky_walk, 100 | }, 101 | "minerva": { 102 | "sprite_index": 3, 103 | "can_walk": True, 104 | "entity": True, 105 | "before_move": minerva_walk, 106 | }, 107 | "player": {"sprite_index": 0, "entity": True,}, 108 | } 109 | -------------------------------------------------------------------------------- /Software/tilegame_assets/town.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/town.bmp -------------------------------------------------------------------------------- /Software/tilegame_assets/town16.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobricius/Armachat-circuitpython/011574efa7453ee45550a0c1f29ea29c4dca1782/Software/tilegame_assets/town16.bmp -------------------------------------------------------------------------------- /Software/turtle.py: -------------------------------------------------------------------------------- 1 | import board 2 | from picomputer import * 3 | 4 | from adafruit_turtle import Color, turtle 5 | 6 | turtle = turtle(display) 7 | starsize = min(display.width, display.height) * 0.5 # 90% of screensize 8 | benzsize = min(display.width, display.height) * 0.5 # 90% of screensize 9 | 10 | print("Turtle time! Lets draw a star") 11 | 12 | turtle.pencolor(Color.BLUE) 13 | 14 | turtle.penup() 15 | turtle.goto(0, 0) 16 | turtle.pendown() 17 | 18 | start = turtle.pos() 19 | while True: 20 | turtle.forward(starsize) 21 | turtle.left(170) 22 | if abs(turtle.pos() - start) < 1: 23 | break 24 | 25 | #turtle.clear() 26 | 27 | colors = (Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.PURPLE) 28 | 29 | turtle.pendown() 30 | start = turtle.pos() 31 | 32 | for x in range(benzsize): 33 | turtle.pencolor(colors[x%6]) 34 | turtle.forward(x) 35 | turtle.left(59) 36 | 37 | 38 | def hilbert2(step, rule, angle, depth, t): 39 | if depth > 0: 40 | a = lambda: hilbert2(step, "a", angle, depth - 1, t) 41 | b = lambda: hilbert2(step, "b", angle, depth - 1, t) 42 | left = lambda: t.left(angle) 43 | right = lambda: t.right(angle) 44 | forward = lambda: t.forward(step) 45 | if rule == "a": 46 | left(); b(); forward(); right(); a(); forward(); a(); right(); forward(); b(); left() 47 | if rule == "b": 48 | right(); a(); forward(); left(); b(); forward(); b(); left(); forward(); a(); right() 49 | 50 | #turtle.clear() 51 | 52 | turtle.penup() 53 | 54 | turtle.goto(0, 0) 55 | turtle.pendown() 56 | hilbert2(5, "a", 90, 5, turtle) --------------------------------------------------------------------------------