denko 0.13.1 → 0.13.3

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 (455) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_avr.yml +2 -4
  3. data/.github/workflows/build_esp32.yml +2 -3
  4. data/.github/workflows/build_esp8266.yml +2 -3
  5. data/.github/workflows/build_megaavr.yml +3 -5
  6. data/.github/workflows/build_ra4m1.yml +57 -0
  7. data/.github/workflows/build_rp2040.yml +2 -4
  8. data/.github/workflows/build_sam3x.yml +1 -3
  9. data/.github/workflows/build_samd.yml +2 -4
  10. data/CHANGELOG.md +100 -0
  11. data/DEPS_CLI.md +13 -6
  12. data/DEPS_IDE.md +14 -7
  13. data/HARDWARE.md +104 -80
  14. data/README.md +19 -28
  15. data/benchmarks/i2c_ssd1306_refresh.rb +79 -0
  16. data/examples/analog_io/ads1115.rb +57 -0
  17. data/examples/analog_io/ads1118.rb +8 -9
  18. data/examples/analog_io/dac_loopback.rb +6 -4
  19. data/examples/analog_io/input.rb +39 -36
  20. data/examples/connection/tcp.rb +1 -1
  21. data/examples/display/hd44780.rb +3 -3
  22. data/examples/display/ssd1306.rb +1 -1
  23. data/lib/denko/analog_io/ads1115.rb +61 -0
  24. data/lib/denko/analog_io/ads1118.rb +10 -120
  25. data/lib/denko/analog_io/ads111x.rb +123 -0
  26. data/lib/denko/analog_io/output.rb +2 -1
  27. data/lib/denko/analog_io.rb +2 -0
  28. data/lib/denko/behaviors/reader.rb +14 -13
  29. data/lib/denko/behaviors/subcomponents.rb +2 -2
  30. data/lib/denko/board/core.rb +1 -1
  31. data/lib/denko/board/i2c.rb +1 -4
  32. data/lib/denko/board/led_array.rb +3 -6
  33. data/lib/denko/board/map.rb +9 -0
  34. data/lib/denko/board/servo.rb +2 -6
  35. data/lib/denko/board.rb +32 -20
  36. data/lib/denko/connection/board_uart.rb +3 -3
  37. data/lib/denko/connection/flow_control.rb +10 -2
  38. data/lib/denko/digital_io/output.rb +1 -1
  39. data/lib/denko/display/hd44780.rb +18 -18
  40. data/lib/denko/led/seven_segment.rb +18 -19
  41. data/lib/denko/message.rb +7 -15
  42. data/lib/denko/pulse_io/ir_transmitter.rb +1 -2
  43. data/lib/denko/version.rb +1 -1
  44. data/lib/denko_cli/packages.rb +7 -1
  45. data/lib/denko_cli/targets.rb +8 -5
  46. data/lib/denko_cli/usage.txt +8 -4
  47. data/src/denko_ethernet.ino +15 -23
  48. data/src/denko_serial.ino +3 -14
  49. data/src/denko_wifi.ino +72 -52
  50. data/src/lib/Denko.cpp +14 -6
  51. data/src/lib/Denko.h +6 -17
  52. data/src/lib/DenkoCoreIO.cpp +3 -3
  53. data/src/lib/DenkoDefines.h +73 -19
  54. data/src/lib/DenkoEEPROM.cpp +9 -1
  55. data/src/lib/DenkoI2C.cpp +11 -9
  56. data/src/lib/DenkoLEDArray.cpp +5 -11
  57. data/test/analog_io/input_test.rb +3 -3
  58. data/test/analog_io/output_test.rb +1 -1
  59. data/test/analog_io/potentiometer_test.rb +2 -2
  60. data/test/behaviors/bus_peripheral_addressed.rb +1 -1
  61. data/test/behaviors/bus_peripheral_test.rb +1 -1
  62. data/test/behaviors/callbacks_test.rb +4 -4
  63. data/test/behaviors/component_test.rb +2 -2
  64. data/test/behaviors/listener_test.rb +3 -3
  65. data/test/behaviors/poller_test.rb +3 -3
  66. data/test/behaviors/reader_test.rb +11 -4
  67. data/test/behaviors/subcomponents_test.rb +1 -1
  68. data/test/behaviors/threaded_test.rb +7 -7
  69. data/test/board/board_test.rb +8 -8
  70. data/test/board/core_test.rb +12 -12
  71. data/test/board/eeprom_test.rb +2 -2
  72. data/test/board/helper_test.rb +0 -4
  73. data/test/board/i2c_test.rb +5 -5
  74. data/test/board/infrared_test.rb +1 -1
  75. data/test/board/message_test.rb +1 -1
  76. data/test/board/one_wire_test.rb +4 -4
  77. data/test/board/pulse_test.rb +2 -2
  78. data/test/board/servo_test.rb +3 -3
  79. data/test/board/spi_test.rb +3 -3
  80. data/test/board/tone_test.rb +2 -2
  81. data/test/connection/serial_test.rb +13 -13
  82. data/test/digital_io/input_test.rb +7 -7
  83. data/test/digital_io/output_test.rb +5 -5
  84. data/test/digital_io/rotary_encoder_test.rb +4 -4
  85. data/test/display/hd44780_test.rb +11 -1
  86. data/test/eeprom/built_in_test.rb +1 -1
  87. data/test/i2c/bus_test.rb +5 -5
  88. data/test/i2c/peripheral_test.rb +4 -4
  89. data/test/led/base_test.rb +2 -2
  90. data/test/led/rgb_test.rb +6 -6
  91. data/test/led/seven_segment_test.rb +36 -14
  92. data/test/motor/servo_test.rb +6 -6
  93. data/test/motor/stepper_test.rb +5 -5
  94. data/test/one_wire/bus_test.rb +9 -9
  95. data/test/one_wire/peripheral_test.rb +17 -17
  96. data/test/pulse_io/buzzer_test.rb +4 -4
  97. data/test/pulse_io/ir_transmitter_test.rb +2 -2
  98. data/test/pulse_io/pwm_output_test.rb +4 -4
  99. data/test/rtc/ds3231_test.rb +4 -4
  100. data/test/sensor/dht_test.rb +3 -3
  101. data/test/sensor/ds18b20_test.rb +9 -9
  102. data/test/spi/bus_test.rb +4 -4
  103. data/test/spi/input_register_test.rb +8 -8
  104. data/test/spi/output_register_test.rb +4 -4
  105. data/test/test_helper.rb +17 -2
  106. data/test/uart/bitbang_test.rb +3 -3
  107. metadata +7 -350
  108. data/vendor/board-maps/.gitignore +0 -56
  109. data/vendor/board-maps/.gitmodules +0 -21
  110. data/vendor/board-maps/BoardMap.h +0 -1364
  111. data/vendor/board-maps/README.md +0 -51
  112. data/vendor/board-maps/lib/boards_parser.rb +0 -66
  113. data/vendor/board-maps/lib/header_parser.rb +0 -164
  114. data/vendor/board-maps/run.rb +0 -47
  115. data/vendor/board-maps/yaml/0XCB_HELIOS.yml +0 -48
  116. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2.yml +0 -25
  117. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_REVTFT.yml +0 -25
  118. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S2_TFT.yml +0 -27
  119. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3.yml +0 -29
  120. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_NOPSRAM.yml +0 -29
  121. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_REVTFT.yml +0 -25
  122. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_TFT.yml +0 -27
  123. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +0 -30
  124. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040.yml +0 -48
  125. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_CAN.yml +0 -48
  126. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_DVI.yml +0 -48
  127. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_PROP_MAKER.yml +0 -48
  128. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_RFM.yml +0 -48
  129. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_SCORPIO.yml +0 -48
  130. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_THINKINK.yml +0 -48
  131. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_USB_HOST.yml +0 -48
  132. data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_ESP32.yml +0 -24
  133. data/vendor/board-maps/yaml/ADAFRUIT_ITSYBITSY_RP2040.yml +0 -48
  134. data/vendor/board-maps/yaml/ADAFRUIT_KB2040_RP2040.yml +0 -48
  135. data/vendor/board-maps/yaml/ADAFRUIT_MACROPAD_RP2040.yml +0 -48
  136. data/vendor/board-maps/yaml/ADAFRUIT_MATRIXPORTAL_ESP32S3.yml +0 -16
  137. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +0 -12
  138. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +0 -22
  139. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +0 -20
  140. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +0 -27
  141. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_RP2040.yml +0 -48
  142. data/vendor/board-maps/yaml/ADAFRUIT_STEMMAFRIEND_RP2040.yml +0 -48
  143. data/vendor/board-maps/yaml/ADAFRUIT_TRINKEYQT_RP2040.yml +0 -48
  144. data/vendor/board-maps/yaml/ALKS.yml +0 -34
  145. data/vendor/board-maps/yaml/AMPERKA_WIFI_SLOT.yml +0 -16
  146. data/vendor/board-maps/yaml/AVR_ADK.yml +0 -24
  147. data/vendor/board-maps/yaml/AVR_BT.yml +0 -16
  148. data/vendor/board-maps/yaml/AVR_CIRCUITPLAY.yml +0 -14
  149. data/vendor/board-maps/yaml/AVR_DUEMILANOVE.yml +0 -16
  150. data/vendor/board-maps/yaml/AVR_ESPLORA.yml +0 -20
  151. data/vendor/board-maps/yaml/AVR_ETHERNET.yml +0 -16
  152. data/vendor/board-maps/yaml/AVR_FIO.yml +0 -16
  153. data/vendor/board-maps/yaml/AVR_GEMMA.yml +0 -6
  154. data/vendor/board-maps/yaml/AVR_INDUSTRIAL101.yml +0 -20
  155. data/vendor/board-maps/yaml/AVR_LEONARDO.yml +0 -20
  156. data/vendor/board-maps/yaml/AVR_LEONARDO_ETH.yml +0 -20
  157. data/vendor/board-maps/yaml/AVR_LILYPAD.yml +0 -16
  158. data/vendor/board-maps/yaml/AVR_LILYPAD_USB.yml +0 -20
  159. data/vendor/board-maps/yaml/AVR_LININO_ONE.yml +0 -20
  160. data/vendor/board-maps/yaml/AVR_MEGA.yml +0 -24
  161. data/vendor/board-maps/yaml/AVR_MEGA2560.yml +0 -24
  162. data/vendor/board-maps/yaml/AVR_MICRO.yml +0 -20
  163. data/vendor/board-maps/yaml/AVR_MINI.yml +0 -16
  164. data/vendor/board-maps/yaml/AVR_NANO.yml +0 -16
  165. data/vendor/board-maps/yaml/AVR_NANO_EVERY.yml +0 -22
  166. data/vendor/board-maps/yaml/AVR_NG.yml +0 -16
  167. data/vendor/board-maps/yaml/AVR_PRO.yml +0 -16
  168. data/vendor/board-maps/yaml/AVR_ROBOT_CONTROL.yml +0 -22
  169. data/vendor/board-maps/yaml/AVR_ROBOT_MOTOR.yml +0 -19
  170. data/vendor/board-maps/yaml/AVR_UNO.yml +0 -16
  171. data/vendor/board-maps/yaml/AVR_UNO_WIFI_DEV_ED.yml +0 -16
  172. data/vendor/board-maps/yaml/AVR_UNO_WIFI_REV2.yml +0 -22
  173. data/vendor/board-maps/yaml/AVR_YUN.yml +0 -20
  174. data/vendor/board-maps/yaml/AVR_YUNMINI.yml +0 -20
  175. data/vendor/board-maps/yaml/AirM2M_CORE_ESP32C3.yml +0 -14
  176. data/vendor/board-maps/yaml/BEE_DATA_LOGGER.yml +0 -39
  177. data/vendor/board-maps/yaml/BPI_BIT.yml +0 -9
  178. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -31
  179. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040-7A.yml +0 -48
  180. data/vendor/board-maps/yaml/BeeMotionS3.yml +0 -40
  181. data/vendor/board-maps/yaml/Bee_Motion.yml +0 -27
  182. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +0 -1
  183. data/vendor/board-maps/yaml/Bee_S3.yml +0 -38
  184. data/vendor/board-maps/yaml/CHALLENGER_2040_LORA_RP2040.yml +0 -39
  185. data/vendor/board-maps/yaml/CHALLENGER_2040_LTE_RP2040.yml +0 -38
  186. data/vendor/board-maps/yaml/CHALLENGER_2040_NFC_RP2040.yml +0 -32
  187. data/vendor/board-maps/yaml/CHALLENGER_2040_SDRTC_RP2040.yml +0 -36
  188. data/vendor/board-maps/yaml/CHALLENGER_2040_SUBGHZ_RP2040.yml +0 -39
  189. data/vendor/board-maps/yaml/CHALLENGER_2040_UWB_RP2040.yml +0 -39
  190. data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_BLE_RP2040.yml +0 -42
  191. data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI_RP2040.yml +0 -38
  192. data/vendor/board-maps/yaml/CHALLENGER_NB_2040_WIFI_RP2040.yml +0 -38
  193. data/vendor/board-maps/yaml/CRABIK_SLOT_ESP32_S3.yml +0 -19
  194. data/vendor/board-maps/yaml/CYTRON_MAKER_FEATHER_AIOT_S3.yml +0 -26
  195. data/vendor/board-maps/yaml/CYTRON_MAKER_NANO_RP2040.yml +0 -48
  196. data/vendor/board-maps/yaml/CYTRON_MAKER_PI_RP2040.yml +0 -48
  197. data/vendor/board-maps/yaml/CoreESP32.yml +0 -49
  198. data/vendor/board-maps/yaml/D1_MINI32.yml +0 -36
  199. data/vendor/board-maps/yaml/D1_UNO32.yml +0 -28
  200. data/vendor/board-maps/yaml/DATANOISETV_PICOADK.yml +0 -48
  201. data/vendor/board-maps/yaml/DENKY.yml +0 -26
  202. data/vendor/board-maps/yaml/DENKY_PICOV3.yml +0 -26
  203. data/vendor/board-maps/yaml/DENKY_WROOM32.yml +0 -26
  204. data/vendor/board-maps/yaml/DEPARTMENT_OF_ALCHEMY_MINIMAIN_ESP32S2.yml +0 -26
  205. data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32_C3.yml +0 -14
  206. data/vendor/board-maps/yaml/DFROBOT_BEETLE_RP2040.yml +0 -48
  207. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32E.yml +0 -44
  208. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32S3.yml +0 -38
  209. data/vendor/board-maps/yaml/DFROBOT_ROMEO_ESP32S3.yml +0 -7
  210. data/vendor/board-maps/yaml/DPU_ESP32.yml +0 -26
  211. data/vendor/board-maps/yaml/DYDK.yml +0 -38
  212. data/vendor/board-maps/yaml/DYDK1A.yml +0 -37
  213. data/vendor/board-maps/yaml/DYDK1Av2.yml +0 -45
  214. data/vendor/board-maps/yaml/DYG.yml +0 -20
  215. data/vendor/board-maps/yaml/DYM.yml +0 -40
  216. data/vendor/board-maps/yaml/DYMv2.yml +0 -39
  217. data/vendor/board-maps/yaml/D_Duino_32.yml +0 -29
  218. data/vendor/board-maps/yaml/ELECTRONICCATS_HUNTERCAT_NFC.yml +0 -44
  219. data/vendor/board-maps/yaml/ESP320.yml +0 -8
  220. data/vendor/board-maps/yaml/ESP32C3_DEV.yml +0 -14
  221. data/vendor/board-maps/yaml/ESP32C3_M1_I_KIT.yml +0 -13
  222. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -33
  223. data/vendor/board-maps/yaml/ESP32S2_THING_PLUS.yml +0 -34
  224. data/vendor/board-maps/yaml/ESP32S2_USB.yml +0 -33
  225. data/vendor/board-maps/yaml/ESP32S3_CAM_LCD.yml +0 -7
  226. data/vendor/board-maps/yaml/ESP32S3_DEV.yml +0 -38
  227. data/vendor/board-maps/yaml/ESP32_DEV.yml +0 -26
  228. data/vendor/board-maps/yaml/ESP32_DEVKIT_LIPO.yml +0 -26
  229. data/vendor/board-maps/yaml/ESP32_EVB.yml +0 -7
  230. data/vendor/board-maps/yaml/ESP32_GATEWAY.yml +0 -13
  231. data/vendor/board-maps/yaml/ESP32_GATEWAY_C.yml +0 -13
  232. data/vendor/board-maps/yaml/ESP32_GATEWAY_E.yml +0 -13
  233. data/vendor/board-maps/yaml/ESP32_GATEWAY_F.yml +0 -13
  234. data/vendor/board-maps/yaml/ESP32_IOT_REDBOARD.yml +0 -27
  235. data/vendor/board-maps/yaml/ESP32_MICROMOD.yml +0 -24
  236. data/vendor/board-maps/yaml/ESP32_PICO.yml +0 -26
  237. data/vendor/board-maps/yaml/ESP32_POE.yml +0 -7
  238. data/vendor/board-maps/yaml/ESP32_POE_ISO.yml +0 -7
  239. data/vendor/board-maps/yaml/ESP32_S3_BOX.yml +0 -16
  240. data/vendor/board-maps/yaml/ESP32_S3_USB_OTG.yml +0 -11
  241. data/vendor/board-maps/yaml/ESP32_THING.yml +0 -27
  242. data/vendor/board-maps/yaml/ESP32_THING_PLUS.yml +0 -30
  243. data/vendor/board-maps/yaml/ESP32_THING_PLUS_C.yml +0 -30
  244. data/vendor/board-maps/yaml/ESP32_WROOM_DA.yml +0 -26
  245. data/vendor/board-maps/yaml/ESP32_WROVER_KIT.yml +0 -26
  246. data/vendor/board-maps/yaml/ESP8266_ADAFRUIT_HUZZAH.yml +0 -9
  247. data/vendor/board-maps/yaml/ESP8266_AGRUMINO_LEMON_V4.yml +0 -8
  248. data/vendor/board-maps/yaml/ESP8266_ARDUINO_PRIMO.yml +0 -7
  249. data/vendor/board-maps/yaml/ESP8266_ARDUINO_STAR_OTTO.yml +0 -7
  250. data/vendor/board-maps/yaml/ESP8266_ARDUINO_UNOWIFI.yml +0 -9
  251. data/vendor/board-maps/yaml/ESP8266_ESP01.yml +0 -9
  252. data/vendor/board-maps/yaml/ESP8266_ESP07.yml +0 -20
  253. data/vendor/board-maps/yaml/ESP8266_ESP12.yml +0 -20
  254. data/vendor/board-maps/yaml/ESP8266_ESP13.yml +0 -17
  255. data/vendor/board-maps/yaml/ESP8266_ESP210.yml +0 -9
  256. data/vendor/board-maps/yaml/ESP8266_ESPECTRO_CORE.yml +0 -9
  257. data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP12.yml +0 -9
  258. data/vendor/board-maps/yaml/ESP8266_ESPINO_ESP13.yml +0 -9
  259. data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V1.yml +0 -9
  260. data/vendor/board-maps/yaml/ESP8266_ESPRESSO_LITE_V2.yml +0 -9
  261. data/vendor/board-maps/yaml/ESP8266_GENERIC.yml +0 -9
  262. data/vendor/board-maps/yaml/ESP8266_INVENT_ONE.yml +0 -22
  263. data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12.yml +0 -20
  264. data/vendor/board-maps/yaml/ESP8266_NODEMCU_ESP12E.yml +0 -20
  265. data/vendor/board-maps/yaml/ESP8266_OAK.yml +0 -9
  266. data/vendor/board-maps/yaml/ESP8266_PHOENIX_V1.yml +0 -9
  267. data/vendor/board-maps/yaml/ESP8266_PHOENIX_V2.yml +0 -9
  268. data/vendor/board-maps/yaml/ESP8266_SCHIRMILABS_EDUINO_WIFI.yml +0 -25
  269. data/vendor/board-maps/yaml/ESP8266_SONOFF_BASIC.yml +0 -9
  270. data/vendor/board-maps/yaml/ESP8266_SONOFF_S20.yml +0 -9
  271. data/vendor/board-maps/yaml/ESP8266_SONOFF_SV.yml +0 -9
  272. data/vendor/board-maps/yaml/ESP8266_SONOFF_TH.yml +0 -9
  273. data/vendor/board-maps/yaml/ESP8266_THING.yml +0 -9
  274. data/vendor/board-maps/yaml/ESP8266_THING_DEV.yml +0 -9
  275. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINI.yml +0 -18
  276. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINILITE.yml +0 -18
  277. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1MINIPRO.yml +0 -18
  278. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1R1.yml +0 -25
  279. data/vendor/board-maps/yaml/ESP8266_WEMOS_D1WROOM02.yml +0 -18
  280. data/vendor/board-maps/yaml/ESP8266_WIO_LINK.yml +0 -9
  281. data/vendor/board-maps/yaml/ESP8266_XINABOX_CW01.yml +0 -9
  282. data/vendor/board-maps/yaml/ESPECTRO32.yml +0 -27
  283. data/vendor/board-maps/yaml/ESPea32.yml +0 -27
  284. data/vendor/board-maps/yaml/ESPino32.yml +0 -27
  285. data/vendor/board-maps/yaml/ET-Board.yml +0 -26
  286. data/vendor/board-maps/yaml/EXTREMEELEXTRONICS_RC2040.yml +0 -46
  287. data/vendor/board-maps/yaml/Edgebox-ESP-100.yml +0 -7
  288. data/vendor/board-maps/yaml/FEATHERS2.yml +0 -33
  289. data/vendor/board-maps/yaml/FEATHERS2NEO.yml +0 -30
  290. data/vendor/board-maps/yaml/FEATHERS3.yml +0 -29
  291. data/vendor/board-maps/yaml/FEATHER_ESP32.yml +0 -28
  292. data/vendor/board-maps/yaml/FLYBOARD2040_CORE.yml +0 -48
  293. data/vendor/board-maps/yaml/FRANZININHO_WIFI.yml +0 -33
  294. data/vendor/board-maps/yaml/FRANZININHO_WIFI_MSC.yml +0 -33
  295. data/vendor/board-maps/yaml/FROG_ESP32.yml +0 -26
  296. data/vendor/board-maps/yaml/FUNHOUSE_ESP32S2.yml +0 -22
  297. data/vendor/board-maps/yaml/GEN4_IOD.yml +0 -9
  298. data/vendor/board-maps/yaml/GENERIC_RP2040.yml +0 -48
  299. data/vendor/board-maps/yaml/HEALTHYPI_4.yml +0 -27
  300. data/vendor/board-maps/yaml/HONEYLEMON.yml +0 -27
  301. data/vendor/board-maps/yaml/HORNBILL_ESP32_DEV.yml +0 -27
  302. data/vendor/board-maps/yaml/HORNBILL_ESP32_MINIMA.yml +0 -16
  303. data/vendor/board-maps/yaml/ILABS_2040_RPICO32_RP2040.yml +0 -47
  304. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +0 -19
  305. data/vendor/board-maps/yaml/INTOROBOT_ESP32_DEV.yml +0 -34
  306. data/vendor/board-maps/yaml/LILYGO_T_DISPLAY_S3.yml +0 -26
  307. data/vendor/board-maps/yaml/LOLIN32.yml +0 -27
  308. data/vendor/board-maps/yaml/LOLIN32_LITE.yml +0 -27
  309. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -14
  310. data/vendor/board-maps/yaml/LOLIN_D32.yml +0 -27
  311. data/vendor/board-maps/yaml/LOLIN_D32_PRO.yml +0 -27
  312. data/vendor/board-maps/yaml/LOLIN_S2_MINI.yml +0 -34
  313. data/vendor/board-maps/yaml/LOLIN_S2_PICO.yml +0 -34
  314. data/vendor/board-maps/yaml/LOLIN_S3.yml +0 -32
  315. data/vendor/board-maps/yaml/LOLIN_S3_MINI.yml +0 -32
  316. data/vendor/board-maps/yaml/LOLIN_S3_PRO.yml +0 -32
  317. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -18
  318. data/vendor/board-maps/yaml/LoPy.yml +0 -27
  319. data/vendor/board-maps/yaml/LoPy4.yml +0 -27
  320. data/vendor/board-maps/yaml/M5STACK_CORES3.yml +0 -8
  321. data/vendor/board-maps/yaml/M5STACK_Core2.yml +0 -9
  322. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -10
  323. data/vendor/board-maps/yaml/M5Stack-Timer-CAM.yml +0 -10
  324. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -10
  325. data/vendor/board-maps/yaml/M5Stack_ATOMS3.yml +0 -7
  326. data/vendor/board-maps/yaml/M5Stack_CoreInk.yml +0 -9
  327. data/vendor/board-maps/yaml/M5Stack_Core_ESP32.yml +0 -10
  328. data/vendor/board-maps/yaml/M5Stack_Station.yml +0 -10
  329. data/vendor/board-maps/yaml/M5Stick_C.yml +0 -10
  330. data/vendor/board-maps/yaml/MAGTAG29_ESP32S2.yml +0 -21
  331. data/vendor/board-maps/yaml/MELOPERO_COOKIE_RP2040.yml +0 -48
  332. data/vendor/board-maps/yaml/MELOPERO_SHAKE_RP2040.yml +0 -48
  333. data/vendor/board-maps/yaml/METRO_ESP32S2.yml +0 -34
  334. data/vendor/board-maps/yaml/MGBOT_IOTIK32A.yml +0 -27
  335. data/vendor/board-maps/yaml/MGBOT_IOTIK32B.yml +0 -27
  336. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32DEVKIT.yml +0 -27
  337. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32MINIKIT.yml +0 -27
  338. data/vendor/board-maps/yaml/MICROS2.yml +0 -34
  339. data/vendor/board-maps/yaml/MOD_WIFI_ESP8266.yml +0 -9
  340. data/vendor/board-maps/yaml/Metro.yml +0 -8
  341. data/vendor/board-maps/yaml/NANO32.yml +0 -27
  342. data/vendor/board-maps/yaml/NANO_RP2040_CONNECT.yml +0 -35
  343. data/vendor/board-maps/yaml/NEBULAS3.yml +0 -33
  344. data/vendor/board-maps/yaml/NEKOSYSTEMS_BL2040_MINI.yml +0 -48
  345. data/vendor/board-maps/yaml/NULLBITS_BIT_C_PRO.yml +0 -48
  346. data/vendor/board-maps/yaml/Node32s.yml +0 -27
  347. data/vendor/board-maps/yaml/NodeMCU_32S.yml +0 -27
  348. data/vendor/board-maps/yaml/ODROID_ESP32.yml +0 -10
  349. data/vendor/board-maps/yaml/ONEHORSE_ESP32_DEV.yml +0 -24
  350. data/vendor/board-maps/yaml/OROCA_EDUBOT.yml +0 -33
  351. data/vendor/board-maps/yaml/PIMORONI_PGA2040.yml +0 -48
  352. data/vendor/board-maps/yaml/PROS3.yml +0 -28
  353. data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -27
  354. data/vendor/board-maps/yaml/Piranha.yml +0 -16
  355. data/vendor/board-maps/yaml/Pocket32.yml +0 -27
  356. data/vendor/board-maps/yaml/QUANTUM.yml +0 -26
  357. data/vendor/board-maps/yaml/RASPBERRY_PI_PICO.yml +0 -48
  358. data/vendor/board-maps/yaml/RASPBERRY_PI_PICO_W.yml +0 -48
  359. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -32
  360. data/vendor/board-maps/yaml/RMP.yml +0 -33
  361. data/vendor/board-maps/yaml/SAMD_CIRCUITPLAYGROUND_EXPRESS.yml +0 -12
  362. data/vendor/board-maps/yaml/SAMD_MKR1000.yml +0 -20
  363. data/vendor/board-maps/yaml/SAMD_MKRFox1200.yml +0 -19
  364. data/vendor/board-maps/yaml/SAMD_MKRGSM1400.yml +0 -15
  365. data/vendor/board-maps/yaml/SAMD_MKRNB1500.yml +0 -15
  366. data/vendor/board-maps/yaml/SAMD_MKRVIDOR4000.yml +0 -19
  367. data/vendor/board-maps/yaml/SAMD_MKRWAN1300.yml +0 -18
  368. data/vendor/board-maps/yaml/SAMD_MKRWAN1310.yml +0 -18
  369. data/vendor/board-maps/yaml/SAMD_MKRWIFI1010.yml +0 -19
  370. data/vendor/board-maps/yaml/SAMD_MKRZERO.yml +0 -19
  371. data/vendor/board-maps/yaml/SAMD_NANO_33_IOT.yml +0 -13
  372. data/vendor/board-maps/yaml/SAMD_TIAN.yml +0 -15
  373. data/vendor/board-maps/yaml/SAMD_ZERO.yml +0 -14
  374. data/vendor/board-maps/yaml/SAM_DUE.yml +0 -26
  375. data/vendor/board-maps/yaml/SAM_ZERO.yml +0 -15
  376. data/vendor/board-maps/yaml/SEEED_INDICATOR_RP2040.yml +0 -47
  377. data/vendor/board-maps/yaml/SEEED_XIAO_RP2040.yml +0 -29
  378. data/vendor/board-maps/yaml/SOLDERPARTY_RP2040_STAMP.yml +0 -48
  379. data/vendor/board-maps/yaml/SONOFF_DUALR3.yml +0 -26
  380. data/vendor/board-maps/yaml/SPARKFUN_PROMICRO_RP2040.yml +0 -48
  381. data/vendor/board-maps/yaml/SPARKFUN_THINGPLUS_RP2040.yml +0 -48
  382. data/vendor/board-maps/yaml/STAMP_S3.yml +0 -4
  383. data/vendor/board-maps/yaml/TAMC_TERMOD_S3.yml +0 -31
  384. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1262.yml +0 -23
  385. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1268.yml +0 -23
  386. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1276.yml +0 -23
  387. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1278.yml +0 -23
  388. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1280.yml +0 -23
  389. data/vendor/board-maps/yaml/TBeam.yml +0 -23
  390. data/vendor/board-maps/yaml/TINYPICO.yml +0 -26
  391. data/vendor/board-maps/yaml/TINYS2.yml +0 -33
  392. data/vendor/board-maps/yaml/TINYS3.yml +0 -25
  393. data/vendor/board-maps/yaml/TTGO-T-OI-PLUS_DEV.yml +0 -11
  394. data/vendor/board-maps/yaml/TTGO_LoRa32_V1.yml +0 -28
  395. data/vendor/board-maps/yaml/TTGO_LoRa32_V2.yml +0 -28
  396. data/vendor/board-maps/yaml/TTGO_LoRa32_v21new.yml +0 -28
  397. data/vendor/board-maps/yaml/TTGO_T1.yml +0 -27
  398. data/vendor/board-maps/yaml/TTGO_T7_V13_Mini32.yml +0 -27
  399. data/vendor/board-maps/yaml/TTGO_T7_V14_Mini32.yml +0 -27
  400. data/vendor/board-maps/yaml/TWATCH_2020_V1.yml +0 -10
  401. data/vendor/board-maps/yaml/TWATCH_2020_V2.yml +0 -10
  402. data/vendor/board-maps/yaml/TWATCH_2020_V3.yml +0 -10
  403. data/vendor/board-maps/yaml/TWATCH_BASE.yml +0 -10
  404. data/vendor/board-maps/yaml/TWatch.yml +0 -10
  405. data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver.yml +0 -18
  406. data/vendor/board-maps/yaml/Trueverit_ESP32_Universal_IoT_Driver_MK_II.yml +0 -18
  407. data/vendor/board-maps/yaml/UBLOX_NINA_W10.yml +0 -48
  408. data/vendor/board-maps/yaml/UBLOX_NORA_W10.yml +0 -43
  409. data/vendor/board-maps/yaml/UPESY_RP2040_DEVKIT.yml +0 -48
  410. data/vendor/board-maps/yaml/VALTRACK_V4_MFW_ESP32_C3.yml +0 -23
  411. data/vendor/board-maps/yaml/VALTRACK_V4_VTS_ESP32_C3.yml +0 -23
  412. data/vendor/board-maps/yaml/VIYALAB_MIZU_RP2040.yml +0 -48
  413. data/vendor/board-maps/yaml/WATCHY.yml +0 -7
  414. data/vendor/board-maps/yaml/WATCHY_V10.yml +0 -7
  415. data/vendor/board-maps/yaml/WATCHY_V15.yml +0 -7
  416. data/vendor/board-maps/yaml/WATCHY_V20.yml +0 -7
  417. data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_0_96.yml +0 -47
  418. data/vendor/board-maps/yaml/WAVESHARE_RP2040_LCD_1_28.yml +0 -47
  419. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +0 -47
  420. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PLUS.yml +0 -48
  421. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +0 -47
  422. data/vendor/board-maps/yaml/WESP32.yml +0 -17
  423. data/vendor/board-maps/yaml/WIDORA_AIR.yml +0 -34
  424. data/vendor/board-maps/yaml/WIFIDUINO_ESP8266.yml +0 -23
  425. data/vendor/board-maps/yaml/WIFINFO.yml +0 -20
  426. data/vendor/board-maps/yaml/WIPY3.yml +0 -27
  427. data/vendor/board-maps/yaml/WIZNET_5100S_EVB_PICO.yml +0 -48
  428. data/vendor/board-maps/yaml/WIZNET_5500_EVB_PICO.yml +0 -48
  429. data/vendor/board-maps/yaml/WIZNET_WIZFI360_EVB_PICO.yml +0 -48
  430. data/vendor/board-maps/yaml/WT32_ETH01.yml +0 -8
  431. data/vendor/board-maps/yaml/WiFiduino32S3.yml +0 -27
  432. data/vendor/board-maps/yaml/WiFiduinoV2.yml +0 -27
  433. data/vendor/board-maps/yaml/Wifiduino32.yml +0 -40
  434. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -22
  435. data/vendor/board-maps/yaml/XIAO_ESP32S3.yml +0 -36
  436. data/vendor/board-maps/yaml/YD_RP2040.yml +0 -48
  437. data/vendor/board-maps/yaml/atmegazero_esp32s2.yml +0 -30
  438. data/vendor/board-maps/yaml/connaxio_espoir.yml +0 -18
  439. data/vendor/board-maps/yaml/esp32vn_iot_uno.yml +0 -22
  440. data/vendor/board-maps/yaml/fm_devkit.yml +0 -15
  441. data/vendor/board-maps/yaml/heltec_wifi_32_lora_V3.yml +0 -31
  442. data/vendor/board-maps/yaml/heltec_wifi_kit_32.yml +0 -28
  443. data/vendor/board-maps/yaml/heltec_wifi_kit_32_V3.yml +0 -32
  444. data/vendor/board-maps/yaml/heltec_wifi_lora_32.yml +0 -27
  445. data/vendor/board-maps/yaml/heltec_wifi_lora_32_V2.yml +0 -27
  446. data/vendor/board-maps/yaml/heltec_wireless_stick.yml +0 -27
  447. data/vendor/board-maps/yaml/heltec_wireless_stick_LITE.yml +0 -27
  448. data/vendor/board-maps/yaml/openkb.yml +0 -27
  449. data/vendor/board-maps/yaml/roboheart_hercules.yml +0 -17
  450. data/vendor/board-maps/yaml/sensesiot_weizen.yml +0 -26
  451. data/vendor/board-maps/yaml/uPesy_WROOM.yml +0 -27
  452. data/vendor/board-maps/yaml/uPesy_WROVER.yml +0 -27
  453. data/vendor/board-maps/yaml/unphone8.yml +0 -32
  454. data/vendor/board-maps/yaml/unphone9.yml +0 -32
  455. data/vendor/board-maps/yaml/wifi_kit_8.yml +0 -15
data/lib/denko/board.rb CHANGED
@@ -1,42 +1,54 @@
1
1
  # Require all files in board folder relative to this file.
2
- Dir["#{Denko.root}/lib/denko/board/*.rb"].each {|file| require file }
2
+ Dir["#{Denko.root}/lib/denko/board/*.rb"].each { |file| require file }
3
3
 
4
4
  module Denko
5
5
  class Board
6
- attr_reader :board_name, :version, :aux_limit, :eeprom_length
6
+ attr_reader :name, :version, :serial_buffer_size, :aux_limit, :eeprom_length
7
7
  attr_reader :low, :high, :analog_write_high, :analog_read_high
8
8
 
9
- def initialize(io, options={})
10
- # Connect the IO, and get the ACK.
11
- @io = io
12
- ack = io.handshake
13
- @name, @version, @aux_limit, @eeprom_length = ack.split(",")
9
+ def initialize(transport, options={})
10
+ # Shake hands
11
+ @transport = transport
12
+ ack = transport.handshake
14
13
 
15
- # Parse map, version and eeprom_legnth.
16
- @name = nil if @name.empty?
17
- @version = nil if @version.empty?
18
- @eeprom_length = @eeprom_length.to_i
14
+ # Split handshake acknowledgement into separate values.
15
+ @name, @version, @serial_buffer_size, @aux_limit, @eeprom_length, @i2c_limit = ack.split(",")
16
+
17
+ # Tell transport how much serial buffer the board has, for flow control.
18
+ @serial_buffer_size = @serial_buffer_size.to_i
19
+ raise StandardError, "no serial buffer size given in handshake" if @serial_buffer_size < 1
20
+ @transport.remote_buffer_size = @serial_buffer_size
21
+
22
+ # Load board map by name.
23
+ @name = nil if @name.empty?
24
+ load_map(@name)
19
25
 
20
26
  # Leave room for null termination of aux messages.
21
27
  @aux_limit = @aux_limit.to_i - 1
22
28
 
23
- # Load the board map.
24
- @map = load_map(@name)
29
+ # Set I2C transaction size limit. Safe minimum is 32.
30
+ # This makes I2C fail silently if board does not implement.
31
+ @i2c_limit = @i2c_limit.to_i
32
+ @i2c_limit = 32 if @i2c_limit == 0
33
+
34
+ # Remaining settings
35
+ @version = nil if @version.empty?
36
+ @eeprom_length = @eeprom_length.to_i
25
37
 
26
- # Allow the IO to call #update on the board when messages received.
27
- io.add_observer(self)
38
+ # Transport calls #update on board when data is received.
39
+ transport.add_observer(self)
28
40
 
29
41
  # Set digital and analog IO levels.
30
42
  @low = 0
31
43
  @high = 1
32
44
  self.analog_write_resolution = options[:write_bits] || 8
33
- self.analog_read_resolution = options[:read_bits] || 10
45
+ self.analog_read_resolution = options[:read_bits] || 10
34
46
  end
35
47
 
36
48
  def finish_write
37
- sleep 0.001 while @io.writing?
49
+ sleep 0.001 while @transport.writing?
38
50
  write "\n91\n"
39
- sleep 0.001 while @io.writing?
51
+ sleep 0.001 while @transport.writing?
40
52
  end
41
53
 
42
54
  def analog_write_resolution=(value)
@@ -64,7 +76,7 @@ module Denko
64
76
  alias :adc_high :analog_read_high
65
77
 
66
78
  def write(msg)
67
- @io.write(msg)
79
+ @transport.write(msg)
68
80
  end
69
81
 
70
82
  #
@@ -78,7 +90,7 @@ module Denko
78
90
  # signal is read by the TxRx, telling it to resume transmisison.
79
91
  #
80
92
  def write_and_halt(msg)
81
- @io.write(msg, true)
93
+ @transport.write(msg, true)
82
94
  end
83
95
 
84
96
  #
@@ -1,11 +1,11 @@
1
1
  module Denko
2
2
  module Connection
3
3
  class BoardUART < Base
4
- BAUD = 115200
4
+ DEFAULT_BAUD = 115200
5
5
 
6
- def initialize(uart, options={})
6
+ def initialize(uart, baud: DEFAULT_BAUD)
7
7
  @uart = uart
8
- @uart.start(options[:baud] || BAUD)
8
+ @uart.start(baud)
9
9
  end
10
10
 
11
11
  def baud
@@ -1,11 +1,19 @@
1
1
  module Denko
2
2
  module Connection
3
3
  module FlowControl
4
- BOARD_BUFFER = 63
5
4
  SLEEP_TIME = 0.001
6
5
 
6
+ # Let Board object tell us the remote buffer size after parsing handshake.
7
+ def remote_buffer_size=(size)
8
+ @transit_mutex.synchronize { @remote_buffer_size = size }
9
+ end
10
+
7
11
  def initialize(*args)
8
12
  super(*args)
13
+ # Start with minimum known buffer size. Board will update after handshake.
14
+ # WARNING: If not updated, and ack threshold on the board is > minimum,
15
+ # FlowControl will stop sending data, and appear to hang. Fix this.
16
+ @remote_buffer_size = 63
9
17
  reset_flow_control
10
18
  tx_resume
11
19
  end
@@ -93,7 +101,7 @@ module Denko
93
101
  # Keep transit mutex as short as possible, by only reserving bytes, and writing outside.
94
102
  def reserve_bytes(length)
95
103
  @transit_mutex.synchronize do
96
- available = BOARD_BUFFER - @transit_bytes
104
+ available = @remote_buffer_size - @transit_bytes
97
105
  reserved = (length > available) ? available : length
98
106
  @transit_bytes += reserved
99
107
  reserved
@@ -16,7 +16,7 @@ module Denko
16
16
  end
17
17
 
18
18
  def digital_write(value)
19
- board.digital_write(pin, value)
19
+ @board.digital_write(@pin, value)
20
20
  self.state = value
21
21
  end
22
22
 
@@ -63,7 +63,7 @@ module Denko
63
63
  end
64
64
 
65
65
  def after_initialize(options={})
66
- super(options) if defined?(super)
66
+ super(options)
67
67
 
68
68
  # Default to 16x2 display if no options given.
69
69
  @columns = options[:columns] || 16
@@ -212,7 +212,7 @@ module Denko
212
212
  send(byte, board.low)
213
213
  end
214
214
 
215
- def write(byte);
215
+ def write(byte)
216
216
  send(byte, board.high)
217
217
  end
218
218
 
@@ -229,27 +229,27 @@ module Denko
229
229
  end
230
230
 
231
231
  def write4(bits)
232
- d4.write bits[4]
233
- d5.write bits[5]
234
- d6.write bits[6]
235
- d7.write bits[7]
232
+ d4.write bits[4].to_i
233
+ d5.write bits[5].to_i
234
+ d6.write bits[6].to_i
235
+ d7.write bits[7].to_i
236
236
  pulse_enable
237
- d4.write bits[0]
238
- d5.write bits[1]
239
- d6.write bits[2]
240
- d7.write bits[3]
237
+ d4.write bits[0].to_i
238
+ d5.write bits[1].to_i
239
+ d6.write bits[2].to_i
240
+ d7.write bits[3].to_i
241
241
  pulse_enable
242
242
  end
243
243
 
244
244
  def write8(bits)
245
- d0.write bits[0]
246
- d1.write bits[1]
247
- d2.write bits[2]
248
- d3.write bits[3]
249
- d4.write bits[4]
250
- d5.write bits[5]
251
- d6.write bits[6]
252
- d7.write bits[7]
245
+ d0.write bits[0].to_i
246
+ d1.write bits[1].to_i
247
+ d2.write bits[2].to_i
248
+ d3.write bits[3].to_i
249
+ d4.write bits[4].to_i
250
+ d5.write bits[5].to_i
251
+ d6.write bits[6].to_i
252
+ d7.write bits[7].to_i
253
253
  pulse_enable
254
254
  end
255
255
 
@@ -3,6 +3,9 @@ module Denko
3
3
  class SevenSegment
4
4
  include Behaviors::MultiPin
5
5
 
6
+ ALL_OFF = [0,0,0,0,0,0,0]
7
+ BLANK = " "
8
+
6
9
  def initialize_pins(options={})
7
10
  [:a, :b, :c, :d, :e, :f, :g].each do |symbol|
8
11
  proxy_pin(symbol, DigitalIO::Output)
@@ -20,28 +23,30 @@ module Denko
20
23
  attr_reader :segments
21
24
 
22
25
  def clear
23
- segments.each do |pin|
24
- pin.low if cathode
25
- pin.high if anode
26
- end
26
+ write(BLANK)
27
27
  end
28
28
 
29
- def display(char)
30
- char = char.to_s
31
- return scroll(char) if char.length > 1
32
- off; write(char); on
29
+ def display(string)
30
+ on unless on?
31
+ string = string.to_s.upcase
32
+ (string.length > 1) ? scroll(string) : write(string)
33
33
  end
34
34
 
35
35
  def on
36
36
  anode.high if anode
37
37
  cathode.low if cathode
38
+ @on = true
38
39
  end
39
40
 
40
41
  def off
41
42
  anode.low if anode
42
43
  cathode.high if cathode
44
+ @on = false
43
45
  end
44
46
 
47
+ def on?; @on; end
48
+ def off?; !@on; end
49
+
45
50
  CHARACTERS = {
46
51
  '0' => [1,1,1,1,1,1,0],
47
52
  '1' => [0,1,1,0,0,0,0],
@@ -87,22 +92,16 @@ module Denko
87
92
  private
88
93
 
89
94
  def write(char)
90
- bits = CHARACTERS[char.to_s.upcase]
91
- unless bits
92
- clear
93
- else
94
- bits.each_with_index do |bit, index|
95
- if anode
96
- bit == 0 ? bit = 1 : bit = 0
97
- end
98
- segments[index].write(bit) unless (segments[index].state == bit)
99
- end
95
+ bits = CHARACTERS[char] || ALL_OFF
96
+ bits.each_with_index do |bit, index|
97
+ bit = 1^bit if anode
98
+ segments[index].write(bit) unless (segments[index].state == bit)
100
99
  end
101
100
  end
102
101
 
103
102
  def scroll(string)
104
103
  string.chars.each do |char|
105
- display(char)
104
+ write(char)
106
105
  sleep(0.5)
107
106
  end
108
107
  end
data/lib/denko/message.rb CHANGED
@@ -11,7 +11,7 @@ module Denko
11
11
  aux_message = aux_message.to_s
12
12
 
13
13
  # Validate aux_message before escaping characters.
14
- raise ArgumentError, 'aux_message is limited to 528 characters' if aux_message.length > 528
14
+ raise ArgumentError, 'aux_message is limited to 528 characters' if aux_message.length > 784
15
15
 
16
16
  # Escape \ and \n.
17
17
  aux_message = aux_message.gsub("\\","\\\\\\\\").gsub("\n", "\\\n")
@@ -57,7 +57,7 @@ module Denko
57
57
  message = "#{command}#{message}\n"
58
58
  end
59
59
 
60
- def self.pack(type, data, options={})
60
+ def self.pack(type, data, min: nil, max: nil)
61
61
  # Always pack as little endian.
62
62
  template = case type
63
63
  when :uint64 then 'Q<*'
@@ -70,20 +70,12 @@ module Denko
70
70
  # Can pass a single integer to get packed if we always [] then flatten.
71
71
  str = [data].flatten.pack(template)
72
72
 
73
- # Pad right with null bytes if asked.
74
- if options[:pad] && options[:pad] > str.length
75
- (options[:pad] - str.length).times do
76
- str = str + "\x00"
77
- end
78
- end
79
-
80
- if options[:min] && str.length < options[:min]
81
- raise ArgumentError, "too few bytes given (expected at least #{options[:min]})"
73
+ # Enforce min and max.
74
+ if min && str.length < min
75
+ raise ArgumentError, "too few bytes given (expected at least #{min})"
82
76
  end
83
-
84
- # Max should probably always be set to avoid overruning aux message RAM.
85
- if options[:max] && str.length > options[:max]
86
- raise ArgumentError, "too many bytes given (expected at most #{options[:max]})"
77
+ if max && str.length > max
78
+ raise ArgumentError, "too many bytes given (expected at most #{max})"
87
79
  end
88
80
 
89
81
  str
@@ -3,7 +3,7 @@ module Denko
3
3
  class IRTransmitter
4
4
  include Behaviors::OutputPin
5
5
 
6
- def emit(pulses=[], options={})
6
+ def emit(pulses=[], frequency: 38)
7
7
  if pulses.length > 256 || pulses.length < 1
8
8
  raise ArgumentError, 'wrong number of IR pulses (expected 1 to 256)'
9
9
  end
@@ -14,7 +14,6 @@ module Denko
14
14
  raise ArgumentError, 'pulse too long (max 65535 ms)' if pulse > 65535
15
15
  end
16
16
 
17
- frequency = options[:frequency] || 38
18
17
  board.infrared_emit(pin, frequency, pulses)
19
18
  end
20
19
  end
data/lib/denko/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Denko
2
- VERSION = "0.13.1"
2
+ VERSION = "0.13.3"
3
3
  end
@@ -12,10 +12,16 @@ PACKAGES = {
12
12
  "Denko.cpp",
13
13
  "DenkoCoreIO.cpp",
14
14
  "DenkoPulseInput.cpp",
15
- "DenkoEEPROM.cpp",
16
15
  "../../vendor/board-maps/BoardMap.h",
17
16
  ]
18
17
  },
18
+ eeprom: {
19
+ description: "Built-in EEPROM support",
20
+ directive: "DENKO_EEPROM",
21
+ files: [
22
+ "DenkoEEPROM.cpp",
23
+ ]
24
+ },
19
25
  one_wire: {
20
26
  description: "OneWire bus support",
21
27
  directive: "DENKO_ONE_WIRE",
@@ -11,14 +11,17 @@ class DenkoCLI::Generator
11
11
  mega168: [:core, :one_wire, :tone, :i2c, :spi, :servo],
12
12
 
13
13
  # Other ATmega chips do everything.
14
- # Add bit bang serial for 328p / UNO since ith as no extra hardware UART.
14
+ # Add bit bang serial for 328p / UNO since it has no extra hardware UART.
15
15
  mega: STANDARD_PACKAGES + [:uart_bb],
16
16
 
17
- # No tone or IR support on SAM3X / Due.
18
- sam3x: STANDARD_PACKAGES - [:tone, :ir_out],
17
+ # No tone, infrared or EEPROM on SAM3X / Due.
18
+ sam3x: STANDARD_PACKAGES - [:tone, :ir_out, :eeprom],
19
19
 
20
- # SAMD includes all standard packages.
21
- samd: STANDARD_PACKAGES,
20
+ # No EEPROM on SAMD / Zero.
21
+ samd: STANDARD_PACKAGES - [:eeprom],
22
+
23
+ # No IR out and WS2812 on the UNO R4. WS2812 compiles but doesn't work.
24
+ ra4m1: STANDARD_PACKAGES - [:ir_out, :led_array],
22
25
 
23
26
  # ESP8266 + ESP32 use a different IR library.
24
27
  esp8266: STANDARD_PACKAGES - [:ir_out] + [:ir_out_esp],
@@ -1,8 +1,10 @@
1
1
 
2
2
  Usage:
3
+
3
4
  denko task [options]
4
5
 
5
6
  Tasks:
7
+
6
8
  sketch SKETCH [options]
7
9
  help
8
10
  targets
@@ -12,23 +14,25 @@
12
14
  --target TARGET (default: mega. Run 'denko targets' for more info)
13
15
  --debug (default: off)
14
16
 
15
- Available sketches and sketch for each sketch:
17
+ Available sketches and options specific to each sketch:
16
18
 
17
19
  serial
18
- --baud BAUD (default: 115200)
20
+ --baud BAUD (default: 115200)
19
21
 
20
22
  ethernet
21
23
  --mac XX:XX:XX:XX:XX:XX (required)
22
24
  --ip XXX.XXX.XXX.XXX (required, no DHCP)
23
25
  --port PORT (default: 3466)
26
+ --baud BAUD (default: 115200, serial fallback)
24
27
 
25
28
  wifi
26
29
  --ssid SSID (required)
27
30
  --password PASSWORD (required)
28
31
  --port PORT (default: 3466)
32
+ --baud BAUD (default: 115200, serial fallback)
29
33
 
30
34
  Examples:
31
35
 
32
36
  denko sketch ethernet --mac 12:34:56:78:90:12 --ip 192.168.1.2
33
- denko sketch serial --baud 57600
34
- denko sketch serial --baud 9600 -target core
37
+ denko sketch serial --baud 57600 --target esp32
38
+ denko sketch serial --baud 9600 --target core
@@ -2,17 +2,6 @@
2
2
  #include <SPI.h>
3
3
  #include <Ethernet.h>
4
4
 
5
- // Define 'serial' as the serial interface to use.
6
- // Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
7
- // On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
8
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
9
- #define serial SerialUSB
10
- // Use this for Programming USB port (right) on Due and Zero.
11
- // #define serial Serial
12
- #else
13
- #define serial Serial
14
- #endif
15
-
16
5
  // Configure your MAC address, IP address, and HTTP port here.
17
6
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32 };
18
7
  IPAddress ip(192,168,0,77);
@@ -31,8 +20,8 @@ void printEthernetStatus() {
31
20
 
32
21
  void setup() {
33
22
  // Wait for serial ready.
34
- serial.begin(115200);
35
- while(!serial);
23
+ DENKO_SERIAL_IF.begin(115200);
24
+ while(!DENKO_SERIAL_IF);
36
25
 
37
26
  // Explicitly disable the SD card.
38
27
  pinMode(4,OUTPUT);
@@ -41,9 +30,7 @@ void setup() {
41
30
  // Start up the network connection and server.
42
31
  Ethernet.begin(mac, ip);
43
32
  server.begin();
44
- #ifdef debug
45
- printEthernetStatus();
46
- #endif
33
+ printEthernetStatus();
47
34
 
48
35
  // Add listener callbacks for local logic.
49
36
  denko.digitalListenCallback = onDigitalListen;
@@ -51,20 +38,25 @@ void setup() {
51
38
  }
52
39
 
53
40
  void loop() {
41
+ // End connection if client disconnects.
42
+ if (client && !client.connected()) {
43
+ client.stop();
44
+ }
45
+
54
46
  // Allow one client at a time to be connected. Set it as the denko IO stream.
55
47
  if (!client){
56
48
  client = server.available();
57
- if (client) denko.stream = &client;
49
+ if (client) {
50
+ // TCP Client
51
+ denko.stream = &client;
52
+ } else {
53
+ // Serial fallback
54
+ denko.stream = &DENKO_SERIAL_IF;
55
+ }
58
56
  }
59
57
 
60
58
  // Main loop of the denko library.
61
59
  denko.run();
62
-
63
- // End the connection when client disconnects and revert to serial IO.
64
- if (client && !client.connected()){
65
- client.stop();
66
- denko.stream = &serial;
67
- }
68
60
  }
69
61
 
70
62
  // This runs every time a digital pin that denko is listening to changes value.
data/src/denko_serial.ino CHANGED
@@ -2,24 +2,13 @@
2
2
 
3
3
  Denko denko;
4
4
 
5
- // Define 'serial' as the serial interface to use.
6
- // Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
7
- // On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
8
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
9
- #define serial SerialUSB
10
- // Use this for Programming USB port (right) on Due and Zero.
11
- // #define serial Serial
12
- #else
13
- #define serial Serial
14
- #endif
15
-
16
5
  void setup() {
17
6
  // Wait for serial ready.
18
- serial.begin(115200);
19
- while(!serial);
7
+ DENKO_SERIAL_IF.begin(115200);
8
+ while(!DENKO_SERIAL_IF);
20
9
 
21
10
  // Pass serial stream to denko so it can read/write.
22
- denko.stream = &serial;
11
+ denko.stream = &DENKO_SERIAL_IF;
23
12
 
24
13
  // Add listener callbacks for local logic.
25
14
  denko.digitalListenCallback = onDigitalListen;