denko 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build_avr.yml +61 -0
  3. data/.github/workflows/build_esp32.yml +58 -0
  4. data/.github/workflows/build_esp8266.yml +57 -0
  5. data/.github/workflows/build_megaavr.yml +61 -0
  6. data/.github/workflows/build_rp2040.yml +61 -0
  7. data/.github/workflows/build_sam3x.yml +59 -0
  8. data/.github/workflows/build_samd.yml +61 -0
  9. data/.github/workflows/ruby.yml +47 -0
  10. data/.gitignore +24 -0
  11. data/.gitmodules +3 -0
  12. data/.vscode/settings.json +5 -0
  13. data/.vscode/tasks.json +20 -0
  14. data/CHANGELOG.md +466 -0
  15. data/DEPS_CLI.md +80 -0
  16. data/DEPS_IDE.md +120 -0
  17. data/Gemfile +4 -0
  18. data/HARDWARE.md +195 -0
  19. data/LICENSE +22 -0
  20. data/README.md +152 -0
  21. data/Rakefile +11 -0
  22. data/bin/denko +22 -0
  23. data/build +27 -0
  24. data/denko.gemspec +47 -0
  25. data/examples/advanced/rotary_encoder_mac_volume.rb +48 -0
  26. data/examples/advanced/ssd1306_time_temp_rh.rb +48 -0
  27. data/examples/analog_io/ads1118.rb +74 -0
  28. data/examples/analog_io/dac_loopback.rb +32 -0
  29. data/examples/analog_io/input.rb +52 -0
  30. data/examples/connection/tcp.rb +34 -0
  31. data/examples/digital_io/rotary_encoder.rb +26 -0
  32. data/examples/display/hd44780.png +0 -0
  33. data/examples/display/hd44780.rb +39 -0
  34. data/examples/display/ssd1306.rb +40 -0
  35. data/examples/display/ssd1306_s2_pico.rb +29 -0
  36. data/examples/eeprom/built_in.rb +32 -0
  37. data/examples/i2c/search.rb +53 -0
  38. data/examples/led/apa102_bounce.rb +33 -0
  39. data/examples/led/apa102_breathe.rb +45 -0
  40. data/examples/led/builtin_blink.rb +12 -0
  41. data/examples/led/seven_segment_char_echo.rb +15 -0
  42. data/examples/led/ws2812_bounce.rb +32 -0
  43. data/examples/led/ws2812_builtin_blink.rb +21 -0
  44. data/examples/motor/l298.rb +43 -0
  45. data/examples/motor/servo.rb +16 -0
  46. data/examples/motor/stepper.png +0 -0
  47. data/examples/motor/stepper.rb +43 -0
  48. data/examples/pulse_io/buzzer.rb +30 -0
  49. data/examples/pulse_io/ir_transmitter.rb +55 -0
  50. data/examples/rtc/ds3231.rb +48 -0
  51. data/examples/sensor/aht10.rb +15 -0
  52. data/examples/sensor/aht20.rb +15 -0
  53. data/examples/sensor/bme280.rb +75 -0
  54. data/examples/sensor/dht.rb +24 -0
  55. data/examples/sensor/ds18b20.rb +58 -0
  56. data/examples/sensor/htu21d.rb +54 -0
  57. data/examples/sensor/htu31d.rb +31 -0
  58. data/examples/spi/input_register.rb +50 -0
  59. data/examples/spi/output_register.rb +49 -0
  60. data/examples/spi/ssd_through_register.rb +40 -0
  61. data/examples/spi/two_registers.rb +46 -0
  62. data/examples/uart/bit_bang_read.rb +16 -0
  63. data/examples/uart/bit_bang_write.rb +16 -0
  64. data/examples/uart/board_passthrough.rb +34 -0
  65. data/examples/uart/hardware_loopback.rb +16 -0
  66. data/lib/denko/analog_io/ads1118.rb +182 -0
  67. data/lib/denko/analog_io/input.rb +79 -0
  68. data/lib/denko/analog_io/output.rb +20 -0
  69. data/lib/denko/analog_io/potentiometer.rb +15 -0
  70. data/lib/denko/analog_io/sensor.rb +6 -0
  71. data/lib/denko/analog_io.rb +9 -0
  72. data/lib/denko/behaviors/board_proxy.rb +23 -0
  73. data/lib/denko/behaviors/bus_controller.rb +11 -0
  74. data/lib/denko/behaviors/bus_controller_addressed.rb +15 -0
  75. data/lib/denko/behaviors/bus_peripheral.rb +21 -0
  76. data/lib/denko/behaviors/bus_peripheral_addressed.rb +15 -0
  77. data/lib/denko/behaviors/callbacks.rb +67 -0
  78. data/lib/denko/behaviors/component.rb +48 -0
  79. data/lib/denko/behaviors/input_pin.rb +24 -0
  80. data/lib/denko/behaviors/listener.rb +22 -0
  81. data/lib/denko/behaviors/multi_pin.rb +72 -0
  82. data/lib/denko/behaviors/output_pin.rb +13 -0
  83. data/lib/denko/behaviors/poller.rb +31 -0
  84. data/lib/denko/behaviors/reader.rb +49 -0
  85. data/lib/denko/behaviors/single_pin.rb +26 -0
  86. data/lib/denko/behaviors/state.rb +24 -0
  87. data/lib/denko/behaviors/subcomponents.rb +35 -0
  88. data/lib/denko/behaviors/threaded.rb +54 -0
  89. data/lib/denko/behaviors.rb +26 -0
  90. data/lib/denko/board/core.rb +151 -0
  91. data/lib/denko/board/eeprom.rb +20 -0
  92. data/lib/denko/board/i2c.rb +68 -0
  93. data/lib/denko/board/infrared.rb +18 -0
  94. data/lib/denko/board/led_array.rb +18 -0
  95. data/lib/denko/board/map.rb +46 -0
  96. data/lib/denko/board/message_pack.rb +7 -0
  97. data/lib/denko/board/one_wire.rb +34 -0
  98. data/lib/denko/board/pulse.rb +26 -0
  99. data/lib/denko/board/servo.rb +22 -0
  100. data/lib/denko/board/spi.rb +65 -0
  101. data/lib/denko/board/spi_bit_bang.rb +41 -0
  102. data/lib/denko/board/tone.rb +23 -0
  103. data/lib/denko/board/uart.rb +42 -0
  104. data/lib/denko/board/uart_bit_bang.rb +33 -0
  105. data/lib/denko/board.rb +104 -0
  106. data/lib/denko/connection/base.rb +75 -0
  107. data/lib/denko/connection/board_uart.rb +36 -0
  108. data/lib/denko/connection/flow_control.rb +153 -0
  109. data/lib/denko/connection/handshake.rb +60 -0
  110. data/lib/denko/connection/serial.rb +90 -0
  111. data/lib/denko/connection/tcp.rb +44 -0
  112. data/lib/denko/connection.rb +10 -0
  113. data/lib/denko/digital_io/button.rb +8 -0
  114. data/lib/denko/digital_io/input.rb +44 -0
  115. data/lib/denko/digital_io/output.rb +47 -0
  116. data/lib/denko/digital_io/relay.rb +6 -0
  117. data/lib/denko/digital_io/rotary_encoder.rb +107 -0
  118. data/lib/denko/digital_io.rb +9 -0
  119. data/lib/denko/display/canvas.rb +282 -0
  120. data/lib/denko/display/hd44780.rb +266 -0
  121. data/lib/denko/display/ssd1306.rb +179 -0
  122. data/lib/denko/display.rb +7 -0
  123. data/lib/denko/eeprom/built_in.rb +69 -0
  124. data/lib/denko/eeprom.rb +5 -0
  125. data/lib/denko/fonts.rb +106 -0
  126. data/lib/denko/i2c/bus.rb +52 -0
  127. data/lib/denko/i2c/peripheral.rb +38 -0
  128. data/lib/denko/i2c.rb +6 -0
  129. data/lib/denko/led/apa102.rb +87 -0
  130. data/lib/denko/led/base.rb +12 -0
  131. data/lib/denko/led/rgb.rb +38 -0
  132. data/lib/denko/led/seven_segment.rb +111 -0
  133. data/lib/denko/led/ws2812.rb +48 -0
  134. data/lib/denko/led.rb +13 -0
  135. data/lib/denko/message.rb +92 -0
  136. data/lib/denko/motor/l298.rb +49 -0
  137. data/lib/denko/motor/servo.rb +51 -0
  138. data/lib/denko/motor/stepper.rb +71 -0
  139. data/lib/denko/motor.rb +7 -0
  140. data/lib/denko/one_wire/bus.rb +61 -0
  141. data/lib/denko/one_wire/bus_enumeration.rb +88 -0
  142. data/lib/denko/one_wire/constants.rb +17 -0
  143. data/lib/denko/one_wire/helper.rb +33 -0
  144. data/lib/denko/one_wire/peripheral.rb +62 -0
  145. data/lib/denko/one_wire.rb +9 -0
  146. data/lib/denko/pulse_io/buzzer.rb +25 -0
  147. data/lib/denko/pulse_io/ir_transmitter.rb +22 -0
  148. data/lib/denko/pulse_io/pwm_output.rb +34 -0
  149. data/lib/denko/pulse_io.rb +7 -0
  150. data/lib/denko/rtc/ds3231.rb +48 -0
  151. data/lib/denko/rtc.rb +5 -0
  152. data/lib/denko/sensor/aht.rb +165 -0
  153. data/lib/denko/sensor/bme280.rb +366 -0
  154. data/lib/denko/sensor/dht.rb +43 -0
  155. data/lib/denko/sensor/ds18b20.rb +74 -0
  156. data/lib/denko/sensor/htu21d.rb +168 -0
  157. data/lib/denko/sensor/htu31d.rb +187 -0
  158. data/lib/denko/sensor/virtual.rb +42 -0
  159. data/lib/denko/sensor.rb +13 -0
  160. data/lib/denko/spi/base_register.rb +37 -0
  161. data/lib/denko/spi/bit_bang.rb +74 -0
  162. data/lib/denko/spi/bus.rb +44 -0
  163. data/lib/denko/spi/input_register.rb +130 -0
  164. data/lib/denko/spi/output_register.rb +67 -0
  165. data/lib/denko/spi/peripheral.rb +43 -0
  166. data/lib/denko/spi.rb +10 -0
  167. data/lib/denko/uart/bit_bang.rb +69 -0
  168. data/lib/denko/uart/hardware.rb +65 -0
  169. data/lib/denko/uart.rb +6 -0
  170. data/lib/denko/version.rb +3 -0
  171. data/lib/denko.rb +39 -0
  172. data/lib/denko_cli/generator.rb +171 -0
  173. data/lib/denko_cli/helper.rb +29 -0
  174. data/lib/denko_cli/missing_files.txt +20 -0
  175. data/lib/denko_cli/packages.rb +101 -0
  176. data/lib/denko_cli/parser.rb +73 -0
  177. data/lib/denko_cli/targets.rb +30 -0
  178. data/lib/denko_cli/targets.txt +113 -0
  179. data/lib/denko_cli/usage.txt +34 -0
  180. data/lib/denko_cli.rb +18 -0
  181. data/src/denko_ethernet.ino +78 -0
  182. data/src/denko_serial.ino +41 -0
  183. data/src/denko_wifi.ino +157 -0
  184. data/src/lib/Denko.cpp +330 -0
  185. data/src/lib/Denko.h +259 -0
  186. data/src/lib/DenkoCoreIO.cpp +322 -0
  187. data/src/lib/DenkoDefines.h +116 -0
  188. data/src/lib/DenkoEEPROM.cpp +64 -0
  189. data/src/lib/DenkoI2C.cpp +155 -0
  190. data/src/lib/DenkoIROut.cpp +33 -0
  191. data/src/lib/DenkoIROutESP.cpp +26 -0
  192. data/src/lib/DenkoLEDArray.cpp +49 -0
  193. data/src/lib/DenkoOneWire.cpp +156 -0
  194. data/src/lib/DenkoPulseInput.cpp +57 -0
  195. data/src/lib/DenkoSPI.cpp +165 -0
  196. data/src/lib/DenkoSPIBB.cpp +156 -0
  197. data/src/lib/DenkoServo.cpp +83 -0
  198. data/src/lib/DenkoTone.cpp +25 -0
  199. data/src/lib/DenkoUART.cpp +118 -0
  200. data/src/lib/DenkoUARTBB.cpp +62 -0
  201. data/target.yml +3 -0
  202. data/test/analog_io/input_test.rb +38 -0
  203. data/test/analog_io/output_test.rb +26 -0
  204. data/test/analog_io/potentiometer_test.rb +62 -0
  205. data/test/behaviors/board_proxy_test.rb +24 -0
  206. data/test/behaviors/bus_controller_addressed_test.rb +40 -0
  207. data/test/behaviors/bus_controller_test.rb +28 -0
  208. data/test/behaviors/bus_peripheral_addressed.rb +44 -0
  209. data/test/behaviors/bus_peripheral_test.rb +39 -0
  210. data/test/behaviors/callbacks_test.rb +118 -0
  211. data/test/behaviors/component_test.rb +56 -0
  212. data/test/behaviors/input_pin_test.rb +42 -0
  213. data/test/behaviors/listener_test.rb +60 -0
  214. data/test/behaviors/multi_pin_test.rb +70 -0
  215. data/test/behaviors/output_pin_test.rb +27 -0
  216. data/test/behaviors/poller_test.rb +64 -0
  217. data/test/behaviors/reader_test.rb +68 -0
  218. data/test/behaviors/single_pin_test.rb +41 -0
  219. data/test/behaviors/subcomponents_test.rb +75 -0
  220. data/test/behaviors/threaded_test.rb +98 -0
  221. data/test/board/board_test.rb +130 -0
  222. data/test/board/core_test.rb +182 -0
  223. data/test/board/eeprom_test.rb +34 -0
  224. data/test/board/helper_test.rb +38 -0
  225. data/test/board/i2c_test.rb +114 -0
  226. data/test/board/infrared_test.rb +37 -0
  227. data/test/board/message_test.rb +54 -0
  228. data/test/board/one_wire_test.rb +69 -0
  229. data/test/board/pulse_test.rb +51 -0
  230. data/test/board/servo_test.rb +47 -0
  231. data/test/board/spi_test.rb +97 -0
  232. data/test/board/tone_test.rb +42 -0
  233. data/test/connection/serial_test.rb +172 -0
  234. data/test/connection/tcp_test.rb +37 -0
  235. data/test/digital_io/input_test.rb +65 -0
  236. data/test/digital_io/output_test.rb +64 -0
  237. data/test/digital_io/rotary_encoder_test.rb +99 -0
  238. data/test/display/hd44780_test.rb +23 -0
  239. data/test/eeprom/built_in_test.rb +61 -0
  240. data/test/i2c/bus_test.rb +66 -0
  241. data/test/i2c/peripheral_test.rb +50 -0
  242. data/test/led/base_test.rb +24 -0
  243. data/test/led/rgb_test.rb +64 -0
  244. data/test/led/seven_segment_test.rb +86 -0
  245. data/test/motor/servo_test.rb +62 -0
  246. data/test/motor/stepper_test.rb +51 -0
  247. data/test/one_wire/bus_enumerator_test.rb +134 -0
  248. data/test/one_wire/bus_test.rb +142 -0
  249. data/test/one_wire/helper_test.rb +18 -0
  250. data/test/one_wire/peripheral_test.rb +158 -0
  251. data/test/pulse_io/buzzer_test.rb +48 -0
  252. data/test/pulse_io/ir_transmitter_test.rb +38 -0
  253. data/test/pulse_io/pwm_output_test.rb +72 -0
  254. data/test/rtc/ds3231_test.rb +55 -0
  255. data/test/sensor/dht_test.rb +64 -0
  256. data/test/sensor/ds18b20_test.rb +107 -0
  257. data/test/spi/base_register_test.rb +34 -0
  258. data/test/spi/bus_test.rb +76 -0
  259. data/test/spi/input_register_test.rb +140 -0
  260. data/test/spi/output_register_test.rb +93 -0
  261. data/test/test_helper.rb +223 -0
  262. data/test/uart/bitbang_test.rb +37 -0
  263. data/tutorial/01-led/led.fzz +0 -0
  264. data/tutorial/01-led/led.pdf +0 -0
  265. data/tutorial/01-led/led.rb +73 -0
  266. data/tutorial/02-button/button.fzz +0 -0
  267. data/tutorial/02-button/button.pdf +0 -0
  268. data/tutorial/02-button/button.rb +64 -0
  269. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  270. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  271. data/tutorial/03-potentiometer/potentiometer.rb +62 -0
  272. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  273. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  274. data/tutorial/04-pwm_led/pwm_led.rb +66 -0
  275. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  276. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  277. data/tutorial/05-rgb_led/rgb_led.rb +58 -0
  278. data/tutorial/05-rgb_led/rgb_mapping.rb +76 -0
  279. data/vendor/board-maps/.gitignore +56 -0
  280. data/vendor/board-maps/.gitmodules +21 -0
  281. data/vendor/board-maps/BoardMap.h +1364 -0
  282. data/vendor/board-maps/README.md +51 -0
  283. data/vendor/board-maps/lib/boards_parser.rb +66 -0
  284. data/vendor/board-maps/lib/header_parser.rb +164 -0
  285. data/vendor/board-maps/run.rb +47 -0
  286. data/vendor/board-maps/yaml/0XCB_HELIOS.yml +48 -0
  287. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2.yml +25 -0
  288. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_REVTFT.yml +25 -0
  289. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_TFT.yml +27 -0
  290. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3.yml +29 -0
  291. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_NOPSRAM.yml +29 -0
  292. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_REVTFT.yml +25 -0
  293. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_TFT.yml +27 -0
  294. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +30 -0
  295. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040.yml +48 -0
  296. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_CAN.yml +48 -0
  297. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_DVI.yml +48 -0
  298. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_PROP_MAKER.yml +48 -0
  299. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_RFM.yml +48 -0
  300. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_SCORPIO.yml +48 -0
  301. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_THINKINK.yml +48 -0
  302. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_USB_HOST.yml +48 -0
  303. data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_ESP32.yml +24 -0
  304. data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_RP2040.yml +48 -0
  305. data/vendor/board-maps/yaml/ADAFRUIT_KB2040_RP2040.yml +48 -0
  306. data/vendor/board-maps/yaml/ADAFRUIT_MACROPAD_RP2040.yml +48 -0
  307. data/vendor/board-maps/yaml/ADAFRUIT_MATRIXPORTAL_ESP32S3.yml +16 -0
  308. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +12 -0
  309. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +22 -0
  310. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +20 -0
  311. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +27 -0
  312. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_RP2040.yml +48 -0
  313. data/vendor/board-maps/yaml/ADAFRUIT_STEMMAFRIEND_RP2040.yml +48 -0
  314. data/vendor/board-maps/yaml/ADAFRUIT_TRINKEYQT_RP2040.yml +48 -0
  315. data/vendor/board-maps/yaml/ALKS.yml +34 -0
  316. data/vendor/board-maps/yaml/AMPERKA_WIFI_SLOT.yml +16 -0
  317. data/vendor/board-maps/yaml/AVR_ADK.yml +24 -0
  318. data/vendor/board-maps/yaml/AVR_BT.yml +16 -0
  319. data/vendor/board-maps/yaml/AVR_CIRCUITPLAY.yml +14 -0
  320. data/vendor/board-maps/yaml/AVR_DUEMILANOVE.yml +16 -0
  321. data/vendor/board-maps/yaml/AVR_ESPLORA.yml +20 -0
  322. data/vendor/board-maps/yaml/AVR_ETHERNET.yml +16 -0
  323. data/vendor/board-maps/yaml/AVR_FIO.yml +16 -0
  324. data/vendor/board-maps/yaml/AVR_GEMMA.yml +6 -0
  325. data/vendor/board-maps/yaml/AVR_INDUSTRIAL101.yml +20 -0
  326. data/vendor/board-maps/yaml/AVR_LEONARDO.yml +20 -0
  327. data/vendor/board-maps/yaml/AVR_LEONARDO_ETH.yml +20 -0
  328. data/vendor/board-maps/yaml/AVR_LILYPAD.yml +16 -0
  329. data/vendor/board-maps/yaml/AVR_LILYPAD_USB.yml +20 -0
  330. data/vendor/board-maps/yaml/AVR_LININO_ONE.yml +20 -0
  331. data/vendor/board-maps/yaml/AVR_MEGA.yml +24 -0
  332. data/vendor/board-maps/yaml/AVR_MEGA2560.yml +24 -0
  333. data/vendor/board-maps/yaml/AVR_MICRO.yml +20 -0
  334. data/vendor/board-maps/yaml/AVR_MINI.yml +16 -0
  335. data/vendor/board-maps/yaml/AVR_NANO.yml +16 -0
  336. data/vendor/board-maps/yaml/AVR_NANO_EVERY.yml +22 -0
  337. data/vendor/board-maps/yaml/AVR_NG.yml +16 -0
  338. data/vendor/board-maps/yaml/AVR_PRO.yml +16 -0
  339. data/vendor/board-maps/yaml/AVR_ROBOT_CONTROL.yml +22 -0
  340. data/vendor/board-maps/yaml/AVR_ROBOT_MOTOR.yml +19 -0
  341. data/vendor/board-maps/yaml/AVR_UNO.yml +16 -0
  342. data/vendor/board-maps/yaml/AVR_UNO_WIFI_DEV_ED.yml +16 -0
  343. data/vendor/board-maps/yaml/AVR_UNO_WIFI_REV2.yml +22 -0
  344. data/vendor/board-maps/yaml/AVR_YUN.yml +20 -0
  345. data/vendor/board-maps/yaml/AVR_YUNMINI.yml +20 -0
  346. data/vendor/board-maps/yaml/AirM2M_CORE_ESP32C3.yml +14 -0
  347. data/vendor/board-maps/yaml/BEE_DATA_LOGGER.yml +39 -0
  348. data/vendor/board-maps/yaml/BPI_BIT.yml +9 -0
  349. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +31 -0
  350. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040-7A.yml +48 -0
  351. data/vendor/board-maps/yaml/BeeMotionS3.yml +40 -0
  352. data/vendor/board-maps/yaml/Bee_Motion.yml +27 -0
  353. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +1 -0
  354. data/vendor/board-maps/yaml/Bee_S3.yml +38 -0
  355. data/vendor/board-maps/yaml/CHALLENGER_2040_LORA_RP2040.yml +39 -0
  356. data/vendor/board-maps/yaml/CHALLENGER_2040_LTE_RP2040.yml +38 -0
  357. data/vendor/board-maps/yaml/CHALLENGER_2040_NFC_RP2040.yml +32 -0
  358. data/vendor/board-maps/yaml/CHALLENGER_2040_SDRTC_RP2040.yml +36 -0
  359. data/vendor/board-maps/yaml/CHALLENGER_2040_SUBGHZ_RP2040.yml +39 -0
  360. data/vendor/board-maps/yaml/CHALLENGER_2040_UWB_RP2040.yml +39 -0
  361. data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_BLE_RP2040.yml +42 -0
  362. data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_RP2040.yml +38 -0
  363. data/vendor/board-maps/yaml/CHALLENGER_NB_2040_WIFI_RP2040.yml +38 -0
  364. data/vendor/board-maps/yaml/CRABIK_SLOT_ESP32_S3.yml +19 -0
  365. data/vendor/board-maps/yaml/CYTRON_MAKER_FEATHER_AIOT_S3.yml +26 -0
  366. data/vendor/board-maps/yaml/CYTRON_MAKER_NANO_RP2040.yml +48 -0
  367. data/vendor/board-maps/yaml/CYTRON_MAKER_PI_RP2040.yml +48 -0
  368. data/vendor/board-maps/yaml/CoreESP32.yml +49 -0
  369. data/vendor/board-maps/yaml/D1_MINI32.yml +36 -0
  370. data/vendor/board-maps/yaml/D1_UNO32.yml +28 -0
  371. data/vendor/board-maps/yaml/DATANOISETV_PICOADK.yml +48 -0
  372. data/vendor/board-maps/yaml/DENKY.yml +26 -0
  373. data/vendor/board-maps/yaml/DENKY_PICOV3.yml +26 -0
  374. data/vendor/board-maps/yaml/DENKY_WROOM32.yml +26 -0
  375. data/vendor/board-maps/yaml/DEPARTMENT_OF_ALCHEMY_MINIMAIN_ESP32S2.yml +26 -0
  376. data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32_C3.yml +14 -0
  377. data/vendor/board-maps/yaml/DFROBOT_BEETLE_RP2040.yml +48 -0
  378. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32E.yml +44 -0
  379. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32S3.yml +38 -0
  380. data/vendor/board-maps/yaml/DFROBOT_ROMEO_ESP32S3.yml +7 -0
  381. data/vendor/board-maps/yaml/DPU_ESP32.yml +26 -0
  382. data/vendor/board-maps/yaml/DYDK.yml +38 -0
  383. data/vendor/board-maps/yaml/DYDK1A.yml +37 -0
  384. data/vendor/board-maps/yaml/DYDK1Av2.yml +45 -0
  385. data/vendor/board-maps/yaml/DYG.yml +20 -0
  386. data/vendor/board-maps/yaml/DYM.yml +40 -0
  387. data/vendor/board-maps/yaml/DYMv2.yml +39 -0
  388. data/vendor/board-maps/yaml/D_Duino_32.yml +29 -0
  389. data/vendor/board-maps/yaml/ELECTRONICCATS_HUNTERCAT_NFC.yml +44 -0
  390. data/vendor/board-maps/yaml/ESP320.yml +8 -0
  391. data/vendor/board-maps/yaml/ESP32C3_DEV.yml +14 -0
  392. data/vendor/board-maps/yaml/ESP32C3_M1_I_KIT.yml +13 -0
  393. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +33 -0
  394. data/vendor/board-maps/yaml/ESP32S2_THING_PLUS.yml +34 -0
  395. data/vendor/board-maps/yaml/ESP32S2_USB.yml +33 -0
  396. data/vendor/board-maps/yaml/ESP32S3_CAM_LCD.yml +7 -0
  397. data/vendor/board-maps/yaml/ESP32S3_DEV.yml +38 -0
  398. data/vendor/board-maps/yaml/ESP32_DEV.yml +26 -0
  399. data/vendor/board-maps/yaml/ESP32_DEVKIT_LIPO.yml +26 -0
  400. data/vendor/board-maps/yaml/ESP32_EVB.yml +7 -0
  401. data/vendor/board-maps/yaml/ESP32_GATEWAY.yml +13 -0
  402. data/vendor/board-maps/yaml/ESP32_GATEWAY_C.yml +13 -0
  403. data/vendor/board-maps/yaml/ESP32_GATEWAY_E.yml +13 -0
  404. data/vendor/board-maps/yaml/ESP32_GATEWAY_F.yml +13 -0
  405. data/vendor/board-maps/yaml/ESP32_IOT_REDBOARD.yml +27 -0
  406. data/vendor/board-maps/yaml/ESP32_MICROMOD.yml +24 -0
  407. data/vendor/board-maps/yaml/ESP32_PICO.yml +26 -0
  408. data/vendor/board-maps/yaml/ESP32_POE.yml +7 -0
  409. data/vendor/board-maps/yaml/ESP32_POE_ISO.yml +7 -0
  410. data/vendor/board-maps/yaml/ESP32_S3_BOX.yml +16 -0
  411. data/vendor/board-maps/yaml/ESP32_S3_USB_OTG.yml +11 -0
  412. data/vendor/board-maps/yaml/ESP32_THING.yml +27 -0
  413. data/vendor/board-maps/yaml/ESP32_THING_PLUS.yml +30 -0
  414. data/vendor/board-maps/yaml/ESP32_THING_PLUS_C.yml +30 -0
  415. data/vendor/board-maps/yaml/ESP32_WROOM_DA.yml +26 -0
  416. data/vendor/board-maps/yaml/ESP32_WROVER_KIT.yml +26 -0
  417. data/vendor/board-maps/yaml/ESP8266_ADAFRUIT_HUZZAH.yml +9 -0
  418. data/vendor/board-maps/yaml/ESP8266_AGRUMINO_LEMON_V4.yml +8 -0
  419. data/vendor/board-maps/yaml/ESP8266_ARDUINO_PRIMO.yml +7 -0
  420. data/vendor/board-maps/yaml/ESP8266_ARDUINO_STAR_OTTO.yml +7 -0
  421. data/vendor/board-maps/yaml/ESP8266_ARDUINO_UNOWIFI.yml +9 -0
  422. data/vendor/board-maps/yaml/ESP8266_ESP01.yml +9 -0
  423. data/vendor/board-maps/yaml/ESP8266_ESP07.yml +20 -0
  424. data/vendor/board-maps/yaml/ESP8266_ESP12.yml +20 -0
  425. data/vendor/board-maps/yaml/ESP8266_ESP13.yml +17 -0
  426. data/vendor/board-maps/yaml/ESP8266_ESP210.yml +9 -0
  427. data/vendor/board-maps/yaml/ESP8266_ESPECTRO_CORE.yml +9 -0
  428. data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP12.yml +9 -0
  429. data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP13.yml +9 -0
  430. data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V1.yml +9 -0
  431. data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V2.yml +9 -0
  432. data/vendor/board-maps/yaml/ESP8266_GENERIC.yml +9 -0
  433. data/vendor/board-maps/yaml/ESP8266_INVENT_ONE.yml +22 -0
  434. data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12.yml +20 -0
  435. data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12E.yml +20 -0
  436. data/vendor/board-maps/yaml/ESP8266_OAK.yml +9 -0
  437. data/vendor/board-maps/yaml/ESP8266_PHOENIX_V1.yml +9 -0
  438. data/vendor/board-maps/yaml/ESP8266_PHOENIX_V2.yml +9 -0
  439. data/vendor/board-maps/yaml/ESP8266_SCHIRMILABS_EDUINO_WIFI.yml +25 -0
  440. data/vendor/board-maps/yaml/ESP8266_SONOFF_BASIC.yml +9 -0
  441. data/vendor/board-maps/yaml/ESP8266_SONOFF_S20.yml +9 -0
  442. data/vendor/board-maps/yaml/ESP8266_SONOFF_SV.yml +9 -0
  443. data/vendor/board-maps/yaml/ESP8266_SONOFF_TH.yml +9 -0
  444. data/vendor/board-maps/yaml/ESP8266_THING.yml +9 -0
  445. data/vendor/board-maps/yaml/ESP8266_THING_DEV.yml +9 -0
  446. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINI.yml +18 -0
  447. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINILITE.yml +18 -0
  448. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINIPRO.yml +18 -0
  449. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1R1.yml +25 -0
  450. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1WROOM02.yml +18 -0
  451. data/vendor/board-maps/yaml/ESP8266_WIO_LINK.yml +9 -0
  452. data/vendor/board-maps/yaml/ESP8266_XINABOX_CW01.yml +9 -0
  453. data/vendor/board-maps/yaml/ESPECTRO32.yml +27 -0
  454. data/vendor/board-maps/yaml/ESPea32.yml +27 -0
  455. data/vendor/board-maps/yaml/ESPino32.yml +27 -0
  456. data/vendor/board-maps/yaml/ET-Board.yml +26 -0
  457. data/vendor/board-maps/yaml/EXTREMEELEXTRONICS_RC2040.yml +46 -0
  458. data/vendor/board-maps/yaml/Edgebox-ESP-100.yml +7 -0
  459. data/vendor/board-maps/yaml/FEATHERS2.yml +33 -0
  460. data/vendor/board-maps/yaml/FEATHERS2NEO.yml +30 -0
  461. data/vendor/board-maps/yaml/FEATHERS3.yml +29 -0
  462. data/vendor/board-maps/yaml/FEATHER_ESP32.yml +28 -0
  463. data/vendor/board-maps/yaml/FLYBOARD2040_CORE.yml +48 -0
  464. data/vendor/board-maps/yaml/FRANZININHO_WIFI.yml +33 -0
  465. data/vendor/board-maps/yaml/FRANZININHO_WIFI_MSC.yml +33 -0
  466. data/vendor/board-maps/yaml/FROG_ESP32.yml +26 -0
  467. data/vendor/board-maps/yaml/FUNHOUSE_ESP32S2.yml +22 -0
  468. data/vendor/board-maps/yaml/GEN4_IOD.yml +9 -0
  469. data/vendor/board-maps/yaml/GENERIC_RP2040.yml +48 -0
  470. data/vendor/board-maps/yaml/HEALTHYPI_4.yml +27 -0
  471. data/vendor/board-maps/yaml/HONEYLEMON.yml +27 -0
  472. data/vendor/board-maps/yaml/HORNBILL_ESP32_DEV.yml +27 -0
  473. data/vendor/board-maps/yaml/HORNBILL_ESP32_MINIMA.yml +16 -0
  474. data/vendor/board-maps/yaml/ILABS_2040_RPICO32_RP2040.yml +47 -0
  475. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +19 -0
  476. data/vendor/board-maps/yaml/INTOROBOT_ESP32_DEV.yml +34 -0
  477. data/vendor/board-maps/yaml/LILYGO_T_DISPLAY_S3.yml +26 -0
  478. data/vendor/board-maps/yaml/LOLIN32.yml +27 -0
  479. data/vendor/board-maps/yaml/LOLIN32_LITE.yml +27 -0
  480. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +14 -0
  481. data/vendor/board-maps/yaml/LOLIN_D32.yml +27 -0
  482. data/vendor/board-maps/yaml/LOLIN_D32_PRO.yml +27 -0
  483. data/vendor/board-maps/yaml/LOLIN_S2_MINI.yml +34 -0
  484. data/vendor/board-maps/yaml/LOLIN_S2_PICO.yml +34 -0
  485. data/vendor/board-maps/yaml/LOLIN_S3.yml +32 -0
  486. data/vendor/board-maps/yaml/LOLIN_S3_MINI.yml +32 -0
  487. data/vendor/board-maps/yaml/LOLIN_S3_PRO.yml +32 -0
  488. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +18 -0
  489. data/vendor/board-maps/yaml/LoPy.yml +27 -0
  490. data/vendor/board-maps/yaml/LoPy4.yml +27 -0
  491. data/vendor/board-maps/yaml/M5STACK_CORES3.yml +8 -0
  492. data/vendor/board-maps/yaml/M5STACK_Core2.yml +9 -0
  493. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +10 -0
  494. data/vendor/board-maps/yaml/M5Stack-Timer-CAM.yml +10 -0
  495. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +10 -0
  496. data/vendor/board-maps/yaml/M5Stack_ATOMS3.yml +7 -0
  497. data/vendor/board-maps/yaml/M5Stack_CoreInk.yml +9 -0
  498. data/vendor/board-maps/yaml/M5Stack_Core_ESP32.yml +10 -0
  499. data/vendor/board-maps/yaml/M5Stack_Station.yml +10 -0
  500. data/vendor/board-maps/yaml/M5Stick_C.yml +10 -0
  501. data/vendor/board-maps/yaml/MAGTAG29_ESP32S2.yml +21 -0
  502. data/vendor/board-maps/yaml/MELOPERO_COOKIE_RP2040.yml +48 -0
  503. data/vendor/board-maps/yaml/MELOPERO_SHAKE_RP2040.yml +48 -0
  504. data/vendor/board-maps/yaml/METRO_ESP32S2.yml +34 -0
  505. data/vendor/board-maps/yaml/MGBOT_IOTIK32A.yml +27 -0
  506. data/vendor/board-maps/yaml/MGBOT_IOTIK32B.yml +27 -0
  507. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32DEVKIT.yml +27 -0
  508. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32MINIKIT.yml +27 -0
  509. data/vendor/board-maps/yaml/MICROS2.yml +34 -0
  510. data/vendor/board-maps/yaml/MOD_WIFI_ESP8266.yml +9 -0
  511. data/vendor/board-maps/yaml/Metro.yml +8 -0
  512. data/vendor/board-maps/yaml/NANO32.yml +27 -0
  513. data/vendor/board-maps/yaml/NANO_RP2040_CONNECT.yml +35 -0
  514. data/vendor/board-maps/yaml/NEBULAS3.yml +33 -0
  515. data/vendor/board-maps/yaml/NEKOSYSTEMS_BL2040_MINI.yml +48 -0
  516. data/vendor/board-maps/yaml/NULLBITS_BIT_C_PRO.yml +48 -0
  517. data/vendor/board-maps/yaml/Node32s.yml +27 -0
  518. data/vendor/board-maps/yaml/NodeMCU_32S.yml +27 -0
  519. data/vendor/board-maps/yaml/ODROID_ESP32.yml +10 -0
  520. data/vendor/board-maps/yaml/ONEHORSE_ESP32_DEV.yml +24 -0
  521. data/vendor/board-maps/yaml/OROCA_EDUBOT.yml +33 -0
  522. data/vendor/board-maps/yaml/PIMORONI_PGA2040.yml +48 -0
  523. data/vendor/board-maps/yaml/PROS3.yml +28 -0
  524. data/vendor/board-maps/yaml/PYCOM_GPY.yml +27 -0
  525. data/vendor/board-maps/yaml/Piranha.yml +16 -0
  526. data/vendor/board-maps/yaml/Pocket32.yml +27 -0
  527. data/vendor/board-maps/yaml/QUANTUM.yml +26 -0
  528. data/vendor/board-maps/yaml/RASPBERRY_PI_PICO.yml +48 -0
  529. data/vendor/board-maps/yaml/RASPBERRY_PI_PICO_W.yml +48 -0
  530. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +32 -0
  531. data/vendor/board-maps/yaml/RMP.yml +33 -0
  532. data/vendor/board-maps/yaml/SAMD_CIRCUITPLAYGROUND_EXPRESS.yml +12 -0
  533. data/vendor/board-maps/yaml/SAMD_MKR1000.yml +20 -0
  534. data/vendor/board-maps/yaml/SAMD_MKRFox1200.yml +19 -0
  535. data/vendor/board-maps/yaml/SAMD_MKRGSM1400.yml +15 -0
  536. data/vendor/board-maps/yaml/SAMD_MKRNB1500.yml +15 -0
  537. data/vendor/board-maps/yaml/SAMD_MKRVIDOR4000.yml +19 -0
  538. data/vendor/board-maps/yaml/SAMD_MKRWAN1300.yml +18 -0
  539. data/vendor/board-maps/yaml/SAMD_MKRWAN1310.yml +18 -0
  540. data/vendor/board-maps/yaml/SAMD_MKRWIFI1010.yml +19 -0
  541. data/vendor/board-maps/yaml/SAMD_MKRZERO.yml +19 -0
  542. data/vendor/board-maps/yaml/SAMD_NANO_33_IOT.yml +13 -0
  543. data/vendor/board-maps/yaml/SAMD_TIAN.yml +15 -0
  544. data/vendor/board-maps/yaml/SAMD_ZERO.yml +14 -0
  545. data/vendor/board-maps/yaml/SAM_DUE.yml +26 -0
  546. data/vendor/board-maps/yaml/SAM_ZERO.yml +15 -0
  547. data/vendor/board-maps/yaml/SEEED_INDICATOR_RP2040.yml +47 -0
  548. data/vendor/board-maps/yaml/SEEED_XIAO_RP2040.yml +29 -0
  549. data/vendor/board-maps/yaml/SOLDERPARTY_RP2040_STAMP.yml +48 -0
  550. data/vendor/board-maps/yaml/SONOFF_DUALR3.yml +26 -0
  551. data/vendor/board-maps/yaml/SPARKFUN_PROMICRO_RP2040.yml +48 -0
  552. data/vendor/board-maps/yaml/SPARKFUN_THINGPLUS_RP2040.yml +48 -0
  553. data/vendor/board-maps/yaml/STAMP_S3.yml +4 -0
  554. data/vendor/board-maps/yaml/TAMC_TERMOD_S3.yml +31 -0
  555. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1262.yml +23 -0
  556. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1268.yml +23 -0
  557. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1276.yml +23 -0
  558. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1278.yml +23 -0
  559. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1280.yml +23 -0
  560. data/vendor/board-maps/yaml/TBeam.yml +23 -0
  561. data/vendor/board-maps/yaml/TINYPICO.yml +26 -0
  562. data/vendor/board-maps/yaml/TINYS2.yml +33 -0
  563. data/vendor/board-maps/yaml/TINYS3.yml +25 -0
  564. data/vendor/board-maps/yaml/TTGO-T-OI-PLUS_DEV.yml +11 -0
  565. data/vendor/board-maps/yaml/TTGO_LoRa32_V1.yml +28 -0
  566. data/vendor/board-maps/yaml/TTGO_LoRa32_V2.yml +28 -0
  567. data/vendor/board-maps/yaml/TTGO_LoRa32_v21new.yml +28 -0
  568. data/vendor/board-maps/yaml/TTGO_T1.yml +27 -0
  569. data/vendor/board-maps/yaml/TTGO_T7_V13_Mini32.yml +27 -0
  570. data/vendor/board-maps/yaml/TTGO_T7_V14_Mini32.yml +27 -0
  571. data/vendor/board-maps/yaml/TWATCH_2020_V1.yml +10 -0
  572. data/vendor/board-maps/yaml/TWATCH_2020_V2.yml +10 -0
  573. data/vendor/board-maps/yaml/TWATCH_2020_V3.yml +10 -0
  574. data/vendor/board-maps/yaml/TWATCH_BASE.yml +10 -0
  575. data/vendor/board-maps/yaml/TWatch.yml +10 -0
  576. data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver.yml +18 -0
  577. data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver_MK_II.yml +18 -0
  578. data/vendor/board-maps/yaml/UBLOX_NINA_W10.yml +48 -0
  579. data/vendor/board-maps/yaml/UBLOX_NORA_W10.yml +43 -0
  580. data/vendor/board-maps/yaml/UPESY_RP2040_DEVKIT.yml +48 -0
  581. data/vendor/board-maps/yaml/VALTRACK_V4_MFW_ESP32_C3.yml +23 -0
  582. data/vendor/board-maps/yaml/VALTRACK_V4_VTS_ESP32_C3.yml +23 -0
  583. data/vendor/board-maps/yaml/VIYALAB_MIZU_RP2040.yml +48 -0
  584. data/vendor/board-maps/yaml/WATCHY.yml +7 -0
  585. data/vendor/board-maps/yaml/WATCHY_V10.yml +7 -0
  586. data/vendor/board-maps/yaml/WATCHY_V15.yml +7 -0
  587. data/vendor/board-maps/yaml/WATCHY_V20.yml +7 -0
  588. data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_0_96.yml +47 -0
  589. data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_1_28.yml +47 -0
  590. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +47 -0
  591. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PLUS.yml +48 -0
  592. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +47 -0
  593. data/vendor/board-maps/yaml/WESP32.yml +17 -0
  594. data/vendor/board-maps/yaml/WIDORA_AIR.yml +34 -0
  595. data/vendor/board-maps/yaml/WIFIDUINO_ESP8266.yml +23 -0
  596. data/vendor/board-maps/yaml/WIFINFO.yml +20 -0
  597. data/vendor/board-maps/yaml/WIPY3.yml +27 -0
  598. data/vendor/board-maps/yaml/WIZNET_5100S_EVB_PICO.yml +48 -0
  599. data/vendor/board-maps/yaml/WIZNET_5500_EVB_PICO.yml +48 -0
  600. data/vendor/board-maps/yaml/WIZNET_WIZFI360_EVB_PICO.yml +48 -0
  601. data/vendor/board-maps/yaml/WT32_ETH01.yml +8 -0
  602. data/vendor/board-maps/yaml/WiFiduino32S3.yml +27 -0
  603. data/vendor/board-maps/yaml/WiFiduinoV2.yml +27 -0
  604. data/vendor/board-maps/yaml/Wifiduino32.yml +40 -0
  605. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +22 -0
  606. data/vendor/board-maps/yaml/XIAO_ESP32S3.yml +36 -0
  607. data/vendor/board-maps/yaml/YD_RP2040.yml +48 -0
  608. data/vendor/board-maps/yaml/atmegazero_esp32s2.yml +30 -0
  609. data/vendor/board-maps/yaml/connaxio_espoir.yml +18 -0
  610. data/vendor/board-maps/yaml/esp32vn_iot_uno.yml +22 -0
  611. data/vendor/board-maps/yaml/fm_devkit.yml +15 -0
  612. data/vendor/board-maps/yaml/heltec_wifi_32_lora_V3.yml +31 -0
  613. data/vendor/board-maps/yaml/heltec_wifi_kit_32.yml +28 -0
  614. data/vendor/board-maps/yaml/heltec_wifi_kit_32_V3.yml +32 -0
  615. data/vendor/board-maps/yaml/heltec_wifi_lora_32.yml +27 -0
  616. data/vendor/board-maps/yaml/heltec_wifi_lora_32_V2.yml +27 -0
  617. data/vendor/board-maps/yaml/heltec_wireless_stick.yml +27 -0
  618. data/vendor/board-maps/yaml/heltec_wireless_stick_LITE.yml +27 -0
  619. data/vendor/board-maps/yaml/openkb.yml +27 -0
  620. data/vendor/board-maps/yaml/roboheart_hercules.yml +17 -0
  621. data/vendor/board-maps/yaml/sensesiot_weizen.yml +26 -0
  622. data/vendor/board-maps/yaml/uPesy_WROOM.yml +27 -0
  623. data/vendor/board-maps/yaml/uPesy_WROVER.yml +27 -0
  624. data/vendor/board-maps/yaml/unphone8.yml +32 -0
  625. data/vendor/board-maps/yaml/unphone9.yml +32 -0
  626. data/vendor/board-maps/yaml/wifi_kit_8.yml +15 -0
  627. metadata +800 -0
@@ -0,0 +1,179 @@
1
+ require_relative 'canvas'
2
+
3
+ module Denko
4
+ module Display
5
+ class SSD1306
6
+ include I2C::Peripheral
7
+
8
+ # Fundamental Commands
9
+ # Single byte (no need to OR with anything)
10
+ PIXELS_FROM_RAM = 0xA4
11
+ PIXELS_ALL_ON = 0xA5
12
+ INVERT_OFF = 0xA6
13
+ INVERT_ON = 0xA7
14
+ DISPLAY_OFF = 0xAE
15
+ DISPLAY_ON = 0xAF
16
+
17
+ # Double byte (following byte sets value)
18
+ CONTRAST = 0x81
19
+ # Values: 0x00 to 0xFF. Default is 0x7F
20
+
21
+ # Scrolling commands ignored.
22
+
23
+ # Address Setting Commands
24
+ # Single byte. OR with value. These are for page addressing mode only.
25
+ COLUMN_START_LOWER = 0x00 # lower 4 bytes of column
26
+ COLUMN_START_UPPER = 0x10 # upper 4 bytes of column
27
+ PAGE_START = 0xB0 # page 0-7
28
+
29
+ # Double byte. Following byte sets value.
30
+ ADDRESSING_MODE = 0x20
31
+ # Values: 0x00 = horizontal, 0x01 = vertical, 0x02 = page
32
+
33
+ # Triple byte. Following 2 bytes sets value. For H/V addressing modes only.
34
+ COLUMN_ADDRESS_RANGE = 0x21
35
+ PAGE_ADDRESS_RANGE = 0x22
36
+ # For both: first value = min column/row, second value = max column/row
37
+
38
+ # Hardware Configuration Commands
39
+ # Single byte. OR with value.
40
+ START_LINE = 0x40 # Value: lowest 6 bits set RAM start line (default 0b000000)
41
+ SEGMENT_REMAP = 0xA0 # Value: 0x00 = default, 0x01 = column draw order reversed (horizontal reflection)
42
+ COM_DIRECTION = 0xC0 # Value: 0x00 = default, 0x08 = row draw order reversed (vertical reflection)
43
+
44
+ # Double-byte commands. Following byte sets value.
45
+ CHARGE_PUMP = 0x8D # Value: 0x10 = disable/external, 0x14 = enable/internal
46
+ MULTIPLEX_RATIO = 0xA8 # Value: rows of display - 1
47
+ DISPLAY_OFFSET = 0xD3 # Value: lowest 5 bits. Vertically shifts COM by that amount.
48
+ COM_PIN_CONFIG = 0xDA
49
+ # 0x02 = sequential, left and right not swapped
50
+ # 0x12 = alternative, left and right not swapped (default)
51
+ # 0x22 = sequential, left and right sawpped
52
+ # 0x32 = alternative, left and right swapped
53
+
54
+ # Timing & Driving Commands
55
+ # Double-byte commands. Following byte sets value.
56
+ CLOCK = 0xD5 # Lowest 4 bits = divider. Upper 4 bits = oscillator frequency.
57
+ PRECHARGE_PERIOD = 0xD9 # Lowest 4 bits = phase 1. Upper 4 bits = phase 2. 0xF1 for internal charge pump. 0x22 for external.
58
+ VCOM_DESELECT_LEVEL = 0xDB # 0x00 = 0.65 x Vcc, 0x20 = x 0.77 * Vcc (default), 0x30 = 0.83 x Vcc
59
+
60
+ # Valid widths and heights for displays
61
+ WIDTHS = [64,96,128]
62
+ HEIGHTS = [16,32,48,64]
63
+
64
+ def before_initialize(options={})
65
+ @i2c_address = 0x3C
66
+ @i2c_frequency = 400000
67
+ super(options)
68
+ end
69
+
70
+ def after_initialize(options={})
71
+ super(options)
72
+
73
+ # Default to a 128x64 display.
74
+ @columns = options[:columns] || options[:width] || 128
75
+ @rows = options[:rows] || options[:height] || 64
76
+
77
+ # Validate known sizes.
78
+ raise ArgumentError, "error in SSD1306 width: #{@columns}. Must be in: #{WIDTHS.inspect}" unless WIDTHS.include?(@columns)
79
+ raise ArgumentError, "error in SSD1306 height: #{@rows}. Must be in: #{HEIGHTS.inspect}" unless HEIGHTS.include?(@rows)
80
+
81
+ # Everything except 96x16 size uses clock 0x80.
82
+ clock = 0x80
83
+ clock = 0x60 if (@columns == 96 && @rows == 16)
84
+
85
+ # 128x32 and 96x16 sizes use com pin config 0x02
86
+ com_pin_config = 0x12
87
+ com_pin_config = 0x02 if (@columns == 96 && @rows == 16) || (@columns == 128 && @rows == 32)
88
+
89
+ # Reflecting horizontally and vertically to effectively rotate 180 degrees.
90
+ seg_remap = options[:rotate] ? 0x01 : 0x00
91
+ com_direction = options[:rotate] ? 0x08 : 0x00
92
+
93
+ # Startup sequence
94
+ command [
95
+ MULTIPLEX_RATIO, @rows - 1,
96
+ DISPLAY_OFFSET, 0x00,
97
+ START_LINE | 0x00,
98
+ SEGMENT_REMAP | seg_remap,
99
+ COM_DIRECTION | com_direction,
100
+ COM_PIN_CONFIG, com_pin_config,
101
+ PIXELS_FROM_RAM,
102
+ INVERT_OFF,
103
+ CLOCK, clock,
104
+ VCOM_DESELECT_LEVEL, 0x20,
105
+ PRECHARGE_PERIOD, 0xF1, # Charge period for internal charge pump
106
+ CHARGE_PUMP, 0x14, # Internal charge pump
107
+ ADDRESSING_MODE, 0x00, # Horizontal addressing mode so pages auto increment
108
+ DISPLAY_ON
109
+ ]
110
+
111
+ # Create a new blank canvas and draw it.
112
+ self.canvas = Canvas.new(@columns, @rows)
113
+ draw
114
+ end
115
+
116
+ attr_accessor :canvas
117
+
118
+ def off
119
+ command(DISPLAY_OFF)
120
+ end
121
+
122
+ def on
123
+ command(DISPLAY_ON)
124
+ end
125
+
126
+ def contrast=(value)
127
+ raise ArgumentError, "contrast must be in range 0..255" if (value < 0 || value > 255)
128
+ command [CONTRAST, value]
129
+ end
130
+
131
+ def draw(x_min=0, x_max=(@columns-1), y_min=0, y_max=(@rows-1))
132
+ # Convert y-coords to page coords.
133
+ p_min = y_min / 8
134
+ p_max = y_max / 8
135
+
136
+ # If drawing the whole frame (default), bypass temp buffer to save time.
137
+ if (x_min == 0) && (x_max == @columns-1) && (p_min == 0) && (p_max == @rows/8)
138
+ draw_partial(canvas.framebuffer, x_min, x_max, p_min, p_max)
139
+
140
+ # Copy bytes for the given rectangle into a temp buffer.
141
+ else
142
+ temp_buffer = []
143
+ (p_min..p_max).each do |page|
144
+ src_start = (@columns * page) + x_min
145
+ src_end = (@columns * page) + x_max
146
+ temp_buffer += canvas.framebuffer[src_start..src_end]
147
+ end
148
+
149
+ # And draw them.
150
+ draw_partial(temp_buffer, x_min, x_max, p_min, p_max)
151
+ end
152
+ end
153
+
154
+ def draw_partial(buffer, x_min, x_max, p_min, p_max)
155
+ # Limit auto-incrementing GRAM address to the rectangle being drawn.
156
+ command [ COLUMN_ADDRESS_RANGE, x_min, x_max, PAGE_ADDRESS_RANGE, p_min, p_max ]
157
+
158
+ # Send all the bytes at once if within board I2C limit.
159
+ if buffer.length < (bus.board.i2c_limit - 1)
160
+ data(buffer)
161
+
162
+ # Or split into chunks.
163
+ else
164
+ buffer.each_slice(bus.board.i2c_limit - 1) { |slice| data(slice) }
165
+ end
166
+ end
167
+
168
+ # Commands are I2C messages prefixed with 0x00.
169
+ def command(bytes)
170
+ i2c_write([0x00] + bytes)
171
+ end
172
+
173
+ # Data are I2C messages prefixed with 0x40.
174
+ def data(bytes)
175
+ i2c_write([0x40] + bytes)
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,7 @@
1
+ module Denko
2
+ module Display
3
+ autoload :Canvas, "#{__dir__}/display/canvas"
4
+ autoload :HD44780, "#{__dir__}/display/hd44780"
5
+ autoload :SSD1306, "#{__dir__}/display/ssd1306"
6
+ end
7
+ end
@@ -0,0 +1,69 @@
1
+ module Denko
2
+ module EEPROM
3
+ class BuiltIn
4
+ include Behaviors::Component
5
+ include Behaviors::Reader
6
+
7
+ public :state=
8
+
9
+ def pin
10
+ 254
11
+ end
12
+
13
+ def after_initialize(options={})
14
+ super(options)
15
+ self.state = Array.new(board.eeprom_length, nil)
16
+ load
17
+ end
18
+
19
+ def load
20
+ state.each_slice(128).with_index do |slice, index|
21
+ read_using -> { board.eeprom_read(index * 128, slice.length) }
22
+ end
23
+ end
24
+
25
+ def save
26
+ @state_mutex.synchronize do
27
+ @state.each_slice(128).with_index do |slice, index|
28
+ board.eeprom_write(index * 128, slice)
29
+ end
30
+ end
31
+ load
32
+ end
33
+
34
+ #
35
+ # Specific Array-like methods for convenience.
36
+ #
37
+ def length; board.eeprom_length; end
38
+ alias :count :length
39
+
40
+ def [](index)
41
+ @state_mutex.synchronize { @state.send :[], index }
42
+ end
43
+
44
+ def []=(index, value)
45
+ @state_mutex.synchronize { @state.send :[]=, index, value }
46
+ end
47
+
48
+ def each(&block)
49
+ @state_mutex.synchronize { @state.send :each, &block }
50
+ end
51
+
52
+ def each_with_index(&block)
53
+ @state_mutex.synchronize { @state.send :each_with_index, &block }
54
+ end
55
+
56
+ def pre_callback_filter(message)
57
+ address = message.split("-", 2)[0].to_i
58
+ bytes = message.split("-", 2)[1].split(",").map(&:to_i)
59
+ {address: address, data: bytes}
60
+ end
61
+
62
+ def update_state(hash)
63
+ @state_mutex.synchronize do
64
+ @state[hash[:address], hash[:data].length] = hash[:data]
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ module Denko
2
+ module EEPROM
3
+ autoload :BuiltIn, "#{__dir__}/eeprom/built_in"
4
+ end
5
+ end
@@ -0,0 +1,106 @@
1
+ module Denko
2
+ module Fonts
3
+ #
4
+ # Adapted from:
5
+ # https://github.com/lexus2k/ssd1306/blob/master/src/ssd1306_fonts.c
6
+ #
7
+ FONT_6x8 = [
8
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # sp
9
+ [0x00, 0x00, 0x00, 0x2f, 0x00, 0x00], # !
10
+ [0x00, 0x00, 0x07, 0x00, 0x07, 0x00], # "
11
+ [0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14], # #
12
+ [0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12], # $
13
+ [0x00, 0x23, 0x13, 0x08, 0x64, 0x62], # %
14
+ [0x00, 0x36, 0x49, 0x55, 0x22, 0x50], # &
15
+ [0x00, 0x00, 0x05, 0x03, 0x00, 0x00], # '
16
+ [0x00, 0x00, 0x1c, 0x22, 0x41, 0x00], # (
17
+ [0x00, 0x00, 0x41, 0x22, 0x1c, 0x00], # )
18
+ [0x00, 0x14, 0x08, 0x3E, 0x08, 0x14], # *
19
+ [0x00, 0x08, 0x08, 0x3E, 0x08, 0x08], # +
20
+ [0x00, 0x00, 0x00, 0xA0, 0x60, 0x00], # ,
21
+ [0x00, 0x08, 0x08, 0x08, 0x08, 0x08], # -
22
+ [0x00, 0x00, 0x60, 0x60, 0x00, 0x00], # .
23
+ [0x00, 0x20, 0x10, 0x08, 0x04, 0x02], # /
24
+ [0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E], # 0
25
+ [0x00, 0x00, 0x42, 0x7F, 0x40, 0x00], # 1
26
+ [0x00, 0x42, 0x61, 0x51, 0x49, 0x46], # 2
27
+ [0x00, 0x21, 0x41, 0x45, 0x4B, 0x31], # 3
28
+ [0x00, 0x18, 0x14, 0x12, 0x7F, 0x10], # 4
29
+ [0x00, 0x27, 0x45, 0x45, 0x45, 0x39], # 5
30
+ [0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30], # 6
31
+ [0x00, 0x01, 0x71, 0x09, 0x05, 0x03], # 7
32
+ [0x00, 0x36, 0x49, 0x49, 0x49, 0x36], # 8
33
+ [0x00, 0x06, 0x49, 0x49, 0x29, 0x1E], # 9
34
+ [0x00, 0x00, 0x36, 0x36, 0x00, 0x00], # :
35
+ [0x00, 0x00, 0x56, 0x36, 0x00, 0x00], # ;
36
+ [0x00, 0x08, 0x14, 0x22, 0x41, 0x00], # <
37
+ [0x00, 0x14, 0x14, 0x14, 0x14, 0x14], # =
38
+ [0x00, 0x00, 0x41, 0x22, 0x14, 0x08], # >
39
+ [0x00, 0x02, 0x01, 0x51, 0x09, 0x06], # ?
40
+ [0x00, 0x32, 0x49, 0x59, 0x51, 0x3E], # @
41
+ [0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C], # A
42
+ [0x00, 0x7F, 0x49, 0x49, 0x49, 0x36], # B
43
+ [0x00, 0x3E, 0x41, 0x41, 0x41, 0x22], # C
44
+ [0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C], # D
45
+ [0x00, 0x7F, 0x49, 0x49, 0x49, 0x41], # E
46
+ [0x00, 0x7F, 0x09, 0x09, 0x09, 0x01], # F
47
+ [0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A], # G
48
+ [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F], # H
49
+ [0x00, 0x00, 0x41, 0x7F, 0x41, 0x00], # I
50
+ [0x00, 0x20, 0x40, 0x41, 0x3F, 0x01], # J
51
+ [0x00, 0x7F, 0x08, 0x14, 0x22, 0x41], # K
52
+ [0x00, 0x7F, 0x40, 0x40, 0x40, 0x40], # L
53
+ [0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F], # M
54
+ [0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F], # N
55
+ [0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E], # O
56
+ [0x00, 0x7F, 0x09, 0x09, 0x09, 0x06], # P
57
+ [0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E], # Q
58
+ [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46], # R
59
+ [0x00, 0x46, 0x49, 0x49, 0x49, 0x31], # S
60
+ [0x00, 0x01, 0x01, 0x7F, 0x01, 0x01], # T
61
+ [0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F], # U
62
+ [0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F], # V
63
+ [0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F], # W
64
+ [0x00, 0x63, 0x14, 0x08, 0x14, 0x63], # X
65
+ [0x00, 0x07, 0x08, 0x70, 0x08, 0x07], # Y
66
+ [0x00, 0x61, 0x51, 0x49, 0x45, 0x43], # Z
67
+ [0x00, 0x00, 0x7F, 0x41, 0x41, 0x00], # [
68
+ [0x00, 0x02, 0x04, 0x08, 0x10, 0x20], # \
69
+ [0x00, 0x00, 0x41, 0x41, 0x7F, 0x00], # ]
70
+ [0x00, 0x04, 0x02, 0x01, 0x02, 0x04], # ^
71
+ [0x00, 0x40, 0x40, 0x40, 0x40, 0x40], # _
72
+ [0x00, 0x00, 0x01, 0x02, 0x04, 0x00], # '
73
+ [0x00, 0x20, 0x54, 0x54, 0x54, 0x78], # a
74
+ [0x00, 0x7F, 0x48, 0x44, 0x44, 0x38], # b
75
+ [0x00, 0x38, 0x44, 0x44, 0x44, 0x20], # c
76
+ [0x00, 0x38, 0x44, 0x44, 0x48, 0x7F], # d
77
+ [0x00, 0x38, 0x54, 0x54, 0x54, 0x18], # e
78
+ [0x00, 0x08, 0x7E, 0x09, 0x01, 0x02], # f
79
+ [0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C], # g
80
+ [0x00, 0x7F, 0x08, 0x04, 0x04, 0x78], # h
81
+ [0x00, 0x00, 0x44, 0x7D, 0x40, 0x00], # i
82
+ [0x00, 0x40, 0x80, 0x84, 0x7D, 0x00], # j
83
+ [0x00, 0x7F, 0x10, 0x28, 0x44, 0x00], # k
84
+ [0x00, 0x00, 0x41, 0x7F, 0x40, 0x00], # l
85
+ [0x00, 0x7C, 0x04, 0x18, 0x04, 0x78], # m
86
+ [0x00, 0x7C, 0x08, 0x04, 0x04, 0x78], # n
87
+ [0x00, 0x38, 0x44, 0x44, 0x44, 0x38], # o
88
+ [0x00, 0xFC, 0x24, 0x24, 0x24, 0x18], # p
89
+ [0x00, 0x18, 0x24, 0x24, 0x18, 0xFC], # q
90
+ [0x00, 0x7C, 0x08, 0x04, 0x04, 0x08], # r
91
+ [0x00, 0x48, 0x54, 0x54, 0x54, 0x20], # s
92
+ [0x00, 0x04, 0x3F, 0x44, 0x40, 0x20], # t
93
+ [0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C], # u
94
+ [0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C], # v
95
+ [0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C], # w
96
+ [0x00, 0x44, 0x28, 0x10, 0x28, 0x44], # x
97
+ [0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C], # y
98
+ [0x00, 0x44, 0x64, 0x54, 0x4C, 0x44], # z
99
+ [0x00, 0x00, 0x08, 0x77, 0x00, 0x00], # {
100
+ [0x00, 0x00, 0x00, 0x7F, 0x00, 0x00], # |
101
+ [0x00, 0x00, 0x77, 0x08, 0x00, 0x00], # }
102
+ [0x00, 0x10, 0x08, 0x10, 0x08, 0x00], # ~
103
+ [0x14, 0x14, 0x14, 0x14, 0x14, 0x14], # horiz lines # DEL
104
+ ]
105
+ end
106
+ end
@@ -0,0 +1,52 @@
1
+ module Denko
2
+ module I2C
3
+ class Bus
4
+ include Behaviors::SinglePin
5
+ include Behaviors::BusControllerAddressed
6
+ include Behaviors::Reader
7
+
8
+ attr_reader :found_devices
9
+
10
+ def after_initialize(options={})
11
+ super(options)
12
+ @found_devices = []
13
+ bubble_callbacks
14
+ end
15
+
16
+ def search
17
+ addresses = read_using -> { board.i2c_search }
18
+ @found_devices = addresses.split(":").map(&:to_i) if addresses
19
+ end
20
+
21
+ def write(address, bytes, frequency=100000, repeated_start=false)
22
+ board.i2c_write(address, bytes, frequency, repeated_start)
23
+ end
24
+
25
+ def _read(address, register, num_bytes, frequency=100000, repeated_start=false)
26
+ board.i2c_read(address, register, num_bytes, frequency, repeated_start)
27
+ end
28
+
29
+ def bubble_callbacks
30
+ add_callback(:bus_controller) do |str|
31
+ if str && str.match(/\A\d+-/)
32
+ address, data = str.split("-", 2)
33
+ address = address.to_i
34
+
35
+ data = data.split(",").map(&:to_i)
36
+ data = nil if data.empty?
37
+
38
+ update_component(address, data)
39
+ end
40
+ end
41
+ end
42
+
43
+ def update_component(address, data)
44
+ components.each do |component|
45
+ if component.address == address
46
+ component.update(data)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,38 @@
1
+ module Denko
2
+ module I2C
3
+ module Peripheral
4
+ include Behaviors::BusPeripheralAddressed
5
+ include Behaviors::Reader
6
+
7
+ def before_initialize(options={})
8
+ # Allow peripherals to set @i2c_address.
9
+ @address ||= @i2c_address
10
+
11
+ # I2C defaults if peripheral does not set.
12
+ @i2c_frequency ||= 100000
13
+ @i2c_repeated_start ||= false
14
+
15
+ # Override defaults if given in options.
16
+ @i2c_frequency = options[:i2c_frequency] if options[:i2c_frequency]
17
+ @i2c_repeated_start = options[:i2c_repeated_start] if options[:i2c_frequency]
18
+
19
+ # Allow generic :address option to be given as :i2c_address before validation.
20
+ # Superclass method will hande override.
21
+ options[:address] ||= options[:i2c_address]
22
+
23
+ super(options)
24
+ end
25
+
26
+ attr_accessor :i2c_repeated_start, :i2c_frequency
27
+ alias :i2c_address :address
28
+
29
+ def i2c_write(bytes=[])
30
+ bus.write(address, bytes, i2c_frequency, i2c_repeated_start)
31
+ end
32
+
33
+ def i2c_read(register, num_bytes)
34
+ bus._read(address, register, num_bytes, i2c_frequency, i2c_repeated_start)
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/denko/i2c.rb ADDED
@@ -0,0 +1,6 @@
1
+ module Denko
2
+ module I2C
3
+ autoload :Bus, "#{__dir__}/i2c/bus"
4
+ autoload :Peripheral, "#{__dir__}/i2c/peripheral"
5
+ end
6
+ end
@@ -0,0 +1,87 @@
1
+ module Denko
2
+ module LED
3
+ class APA102
4
+ include SPI::Peripheral
5
+
6
+ attr_reader :length, :bpp, :brightness
7
+
8
+ def before_initialize(options={})
9
+ options[:pin] = 255
10
+ super(options)
11
+ end
12
+
13
+ def after_initialize(options={})
14
+ super(options)
15
+
16
+ raise ArgumentError, "no length given for APA102 array" unless options[:length]
17
+ @length = options[:length]
18
+
19
+ # Start frame is always 32 0-bits (4 bytes).
20
+ @start_frame = Array.new(4) { 0 }
21
+
22
+ # End frame must be at least @length/2 bits long, and 32 bits (4 bytes) minimum.
23
+ end_frame_bytes = (@length / 16.0).ceil
24
+ end_frame_bytes = 4 if end_frame_bytes < 4
25
+
26
+ # Use all 0's for end frame instead of 1's. Prevents extra pixel when using partial strip.
27
+ @end_frame = Array.new(end_frame_bytes) { 0 }
28
+
29
+ # This is BYTES per pixel, not bits per pixel.
30
+ # 0th byte is per-pixel brightness (PWM applied to all 3 colors).
31
+ @bpp = 4
32
+ @buffer = Array.new(length * bpp) { 0 }
33
+
34
+ # Default to max brightness.
35
+ self.brightness = 31
36
+
37
+ off
38
+ end
39
+
40
+ # Global (per-strip) brightness control.
41
+ def brightness=(value)
42
+ value = 31 if value > 31
43
+ value = 0 if value < 0
44
+ @brightness = value
45
+
46
+ # @masked_brightness needs to set the 3 bits above the 5 used.
47
+ @masked_brightness = 0b11100000 | @brightness
48
+
49
+ # Set brightness for all pixels.
50
+ (0..@length-1).each do |index|
51
+ @buffer[index*bpp+0] = @masked_brightness
52
+ end
53
+ end
54
+
55
+ def []=(index, array)
56
+ # Per-pixel brightness control, as optional 3rd indexed element of array.
57
+ if array[3]
58
+ @buffer[index*bpp+0] = 0b11100000 | array[3]
59
+ end
60
+
61
+ # APA102 uses BGR ordering.
62
+ @buffer[index*bpp+1] = array[2]
63
+ @buffer[index*bpp+2] = array[1]
64
+ @buffer[index*bpp+3] = array[0]
65
+ end
66
+
67
+ def all_on
68
+ self.brightness = 31
69
+ @buffer = @buffer.each_slice(bpp).map { [@masked_brightness,255,255,255] }.flatten
70
+ show
71
+ end
72
+
73
+ def off
74
+ clear
75
+ show
76
+ end
77
+
78
+ def clear
79
+ @buffer = @buffer.each_slice(bpp).map { [@masked_brightness,0,0,0] }.flatten
80
+ end
81
+
82
+ def show
83
+ spi_write(@start_frame + @buffer + @end_frame)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,12 @@
1
+ module Denko
2
+ module LED
3
+ class Base < PulseIO::PWMOutput
4
+ def blink(interval=0.5)
5
+ threaded_loop do
6
+ toggle
7
+ sleep interval
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ module Denko
2
+ module LED
3
+ class RGB
4
+ include Behaviors::MultiPin
5
+
6
+ def initialize_pins(options={})
7
+ proxy_pin :red, LED::Base
8
+ proxy_pin :green, LED::Base
9
+ proxy_pin :blue, LED::Base
10
+ end
11
+
12
+ # Format: [R, G, B]
13
+ COLORS = {
14
+ red: [255, 000, 000],
15
+ green: [000, 255, 000],
16
+ blue: [000, 000, 255],
17
+ cyan: [000, 255, 255],
18
+ yellow: [255, 255, 000],
19
+ magenta: [255, 000, 255],
20
+ white: [255, 255, 255],
21
+ off: [000, 000, 000]
22
+ }
23
+
24
+ def write(array)
25
+ red.write array[0]
26
+ green.write array[1]
27
+ blue.write array[2]
28
+ end
29
+
30
+ def color=(color)
31
+ return write(color) if color.class == Array
32
+
33
+ color = color.to_sym
34
+ write(COLORS[color]) if COLORS.include? color
35
+ end
36
+ end
37
+ end
38
+ end