denko 0.13.1 → 0.13.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,52 +1,55 @@
1
1
  #
2
- # This is an example of how to use the sensor class
3
- # You must register data callbacks and have the main thread
4
- # sleep or in someway keep running or your program
5
- # will exit before any callbacks can be called
2
+ # This example shows how to use your board's analog-to-digital-converter(ADC) pins,
3
+ # through the AnalogIO::Input class. ADC inputs can be connected to sensors
4
+ # which produce a variable output voltage, such as light dependent resistors,
5
+ # or a simple temperature sensor like the TMP36.
6
6
  #
7
7
  require 'bundler/setup'
8
8
  require 'denko'
9
9
 
10
10
  board = Denko::Board.new(Denko::Connection::Serial.new)
11
- sensor = Denko::AnalogIO::Sensor.new(pin: 'A0', board: board)
12
-
13
- # Single read with block as callback. Blocks main thread.
14
- # Callback fires only once then is removed automatically.
15
- sensor.read { |value| puts "#{Time.now} Single read: #{value}" }
16
-
17
- # Poll the sensor every 1 second with block as callback. Does not block main thread.
18
- # Callback fires every time data is received until #stop is called.
19
- sensor.poll(1) { |value| puts "#{Time.now} Polling: #{value}" }
20
- sleep 5
21
-
22
- # Stop polling. Automatically removes the callback from the #poll block.
23
- sensor.stop
24
-
25
- # Continuous listen with block as callback. Fires every time data is received until #stop is called.
26
- sensor.listen { |value| puts "#{Time.now} Listening: #{value}" }
11
+ input = Denko::AnalogIO::Input.new(pin: :A0, board: board)
12
+
13
+ # Single read that blocks the main thread. When a value is received, the given
14
+ # code block runs only once, and then the main thread continues.
15
+ input.read { |value| puts "#{Time.now} Single read #1: #{value}" }
16
+
17
+ # Read (poll) the input every half second. This happens in a separate thread,
18
+ # so sleep the main thread for a while to get some values.
19
+ # Given code block is added as a callback, and runs every time a value is received.
20
+ input.poll(0.5) { |value| puts "#{Time.now} Polling: #{value}" }
21
+ sleep 3
22
+
23
+ # Stop polling. Automatically removes the #poll callback.
24
+ input.stop
25
+
26
+ # Listening is similar to polling. The board reads the input and sends the value
27
+ # every time interval, except it's keeping time. We only send the initial command,
28
+ # not one for each read. Smaller intervals like 32 milliseconds are possible.
29
+ # Powers of 2 from 1 to 128 are supported for listener intervals.
30
+ input.listen(32) { |value| puts "#{Time.now} Listening: #{value}" }
27
31
  sleep 0.5
28
32
 
29
- # Stop listening. Automatically removes the callback from the #listen block.
30
- sensor.stop
31
-
32
- # Add a persistent callback.
33
- sensor.on_data { |value| puts "#{Time.now} Persistent callback: #{value}" }
33
+ # Stop listening. Automatically removes the #listen callback.
34
+ input.stop
34
35
 
35
- # Add a callback with a custom key.
36
- sensor.on_data(:test) { |value| puts "#{Time.now} Keyed callback: #{value}"}
36
+ # This adds a persistent callback, which runs no matter how a read happens.
37
+ # It will not be removed by #stop.
38
+ input.on_data { |value| puts "#{Time.now} Persistent callback: #{value}" }
37
39
 
38
- # Single read again. Block given fires only once. Callbacks added with #on_data fire also.
39
- sensor.read { |value| puts "#{Time.now} Single read again: #{value}" }
40
+ # This is a persistent callback with a custom key.
41
+ input.on_data(:test) { |value| puts "#{Time.now} Keyed callback: #{value}"}
40
42
 
41
- # Continuous listen. Block fires each time. Callbacks added with #on_data continue to fire.
42
- sensor.listen { |value| puts "#{Time.now } Listening again: #{value}" }
43
- sleep 0.5
43
+ # If we do a single read, the two persistent callbacks, and the block given, should run once each.
44
+ input.read { |value| puts "#{Time.now} Single read #2: #{value}" }
44
45
 
45
- # Stop listening. Automatically removes the callback from the #listen block.
46
- sensor.stop
46
+ # If we listen, the two persistent callbacks, and the block given should run many times.
47
+ input.listen(8) { |value| puts "#{Time.now } Listening again: #{value}" }
48
+ sleep 0.125
49
+ input.stop
47
50
 
48
51
  # Remove callbacks keyed with :test.
49
- sensor.remove_callbacks(:test)
52
+ input.remove_callbacks(:test)
50
53
 
51
54
  # Remove all callbacks.
52
- sensor.remove_callbacks
55
+ input.remove_callbacks
@@ -11,7 +11,7 @@ connection = Denko::Connection::TCP.new("192.168.0.77", 3466)
11
11
  # connection = Denko::Connection::TCP.new("192.168.1.2", 3466)
12
12
  #
13
13
  board = Denko::Board.new(connection)
14
- led = Denko::Led.new(pin: 13, board: board)
14
+ led = Denko::LED.new(board: board, pin: :LED_BUILTIN)
15
15
 
16
16
  [:on, :off].cycle do |switch|
17
17
  led.send(switch)
@@ -6,9 +6,9 @@ require 'denko'
6
6
 
7
7
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
8
  lcd = Denko::Display::HD44780.new board: board,
9
- pins: { rs: 8, enable: 9, d4: 4, d5: 5, d6: 6, d7: 7 },
10
- cols: 16,
11
- rows: 2
9
+ pins: { rs: 8, enable: 9, d4: 4, d5: 5, d6: 6, d7: 7 },
10
+ cols: 16,
11
+ rows: 2
12
12
 
13
13
  # Bitmap for a custom character. 5 bits wide x 8 high.
14
14
  # Useful for generating these: https://omerk.github.io/lcdchargen/
@@ -21,7 +21,7 @@ board = Denko::Board.new(Denko::Connection::Serial.new)
21
21
  # Only give the SDA pin of the I2C bus. SCL (clock) pin must be
22
22
  # connected for it to work, but we don't need to control it.
23
23
  #
24
- bus = Denko::I2C::Bus.new(board: board, pin: 'A4')
24
+ bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
25
25
  oled = Denko::Display::SSD1306.new(bus: bus, rotate: true)
26
26
  canvas = oled.canvas
27
27
 
@@ -0,0 +1,61 @@
1
+ module Denko
2
+ module AnalogIO
3
+ class ADS1115
4
+ include I2C::Peripheral
5
+ include ADS111X
6
+
7
+ # Config register values on startup. MSB-first.
8
+ # Matches datasheet, except MSB bit 7 unset to avoid conversion start.
9
+ # Same as: [0x05, 0x83] or [5, 131]
10
+ CONFIG_STARTUP = [0b00000101, 0b10000011]
11
+
12
+ # Base config bytes to mask settings into. Not same as startup config.
13
+ # MSB bits 0 and 7 set to enable single-shot mode.
14
+ # LSB bits 0 and 1 set to disable comparator.
15
+ BASE_MSB = 0b10000001
16
+ BASE_LSB = 0b00000011
17
+
18
+ # Register addresses.
19
+ CONFIG_ADDRESS = 0b01
20
+ CONVERSION_ADDRESS = 0b00
21
+
22
+ def before_initialize(options={})
23
+ @i2c_address = 0x48
24
+ @i2c_frequency = 400_000
25
+ super(options)
26
+ end
27
+
28
+ def after_initialize(options={})
29
+ super(options)
30
+
31
+ # Mutex and variables for BoardProxy behavior.
32
+ @mutex = Mutex.new
33
+ @active_pin = nil
34
+ @active_gain = nil
35
+
36
+ # Set register bytes to default and write to device.
37
+ @config_register = CONFIG_STARTUP.dup
38
+ i2c_write [CONFIG_ADDRESS] + @config_register
39
+
40
+ # Enable BoardProxy callbacks.
41
+ enable_proxy
42
+ end
43
+
44
+ def _read(config)
45
+ # Write config register to start reading.
46
+ i2c_write [CONFIG_ADDRESS] + config
47
+
48
+ # Sleep the right amount of time for conversion, based on sample rate bits.
49
+ sleep WAIT_TIMES[config[1] >> 5]
50
+
51
+ # Read the result, triggering callbacks.
52
+ i2c_read(CONVERSION_ADDRESS, 2)
53
+ end
54
+
55
+ # Readings are 2 bytes big-endian.
56
+ def pre_callback_filter(bytes)
57
+ bytes.pack("C*").unpack("s>")[0]
58
+ end
59
+ end
60
+ end
61
+ end
@@ -2,55 +2,18 @@ module Denko
2
2
  module AnalogIO
3
3
  class ADS1118
4
4
  include SPI::Peripheral
5
- include Behaviors::Reader
6
- include Behaviors::Threaded
5
+ include ADS111X
7
6
 
8
- PGA_SETTINGS = [ # Bitmask Full scale voltage
9
- 0.0001875, # 0b000 6.144 V
10
- 0.000125, # 0b001 4.095 V
11
- 0.0000625, # 0b010 2.048 V (default)
12
- 0.00003125, # 0b011 1.024 V
13
- 0.000015625, # 0b100 0.512 V
14
- 0.0000078125, # 0b101 0.256 V
15
- 0.0000078125, # 0b110 0.256 V
16
- 0.0000078125, # 0b111 0.256 V
17
- ]
18
- PGA_RANGE = (0..7).to_a
19
-
20
- # Sample rate bitmask maps to sample time in seconds.
21
- SAMPLE_TIMES = [ # Bitmask
22
- 0.125, # 0b000
23
- 0.0625, # 0b001
24
- 0.03125, # 0b010
25
- 0.015625, # 0b011
26
- 0.0078125, # 0b100 (default)
27
- 0.004, # 0b101
28
- 0.002105263, # 0b110
29
- 0.00116279, # 0b111
30
- ]
31
- SAMPLE_RATE_RANGE = (0..7).to_a
32
-
33
- # Wait times need to be slightly longer than the actual sample times.
34
- WAIT_TIMES = SAMPLE_TIMES.map { |time| time + 0.0005 }
35
-
36
- # Mux bits map to array of form [positive input, negative input].
37
- MUX_SETTINGS = {
38
- 0b000 => [0, 1],
39
- 0b001 => [0, 3],
40
- 0b010 => [1, 3],
41
- 0b011 => [2, 3],
42
- 0b100 => [0, nil],
43
- 0b101 => [1, nil],
44
- 0b110 => [2, nil],
45
- 0b111 => [3, nil],
46
- }
47
-
48
- # Config register values on startup.
49
- CONFIG_DEFAULT = [0x05, 0x8B]
7
+ # Config register values on startup. MSB-first.
8
+ # Matches datasheet. Same as: [0x05, 0x8B] or [5, 139]
9
+ CONFIG_STARTUP = [0b00000101, 0b10001011]
50
10
 
51
11
  # Base config bytes to mask settings into. Not same as default.
12
+ # MSB bits 0 and 7 set to enable single-shot mode.
13
+ # LSB bit 3 set to enable pullup resistor on MISO pin.
14
+ # LSB bit 1 set to flag valid data in the NOP bits.
52
15
  BASE_MSB = 0b10000001
53
- BASE_LSB = 0b00001011
16
+ BASE_LSB = 0b00001010
54
17
 
55
18
  def after_initialize(options={})
56
19
  super(options)
@@ -64,7 +27,7 @@ module Denko
64
27
  @active_gain = nil
65
28
 
66
29
  # Set register bytes to default and write to device.
67
- @config_register = CONFIG_DEFAULT.dup
30
+ @config_register = CONFIG_STARTUP.dup
68
31
  spi_write(@config_register)
69
32
 
70
33
  # Enable BoardProxy callbacks.
@@ -82,7 +45,7 @@ module Denko
82
45
  spi_read(2)
83
46
  end
84
47
 
85
- # Pack the 2 bytes back into a string, then unpack as big-endian int16.
48
+ # Pack the 2 bytes back into a string, then unpack as big-endian signed int16.
86
49
  def pre_callback_filter(message)
87
50
  bytes = message.split(",").map { |b| b.to_i }
88
51
  bytes.pack("C*").unpack("s>")[0]
@@ -104,79 +67,6 @@ module Denko
104
67
  block.call(temperature) if block_given?
105
68
  return temperature
106
69
  end
107
-
108
- #
109
- # BoardProxy behavior so AnalogIO classes can use this as a Board.
110
- #
111
- include Behaviors::BoardProxy
112
-
113
- # Mimic Board#update, but inside a callback, wrapped by #update.
114
- def enable_proxy
115
- self.add_callback(:board_proxy) do |value|
116
- components.each do |component|
117
- if @active_pin == component.pin
118
- component.volts_per_bit = PGA_SETTINGS[@active_gain]
119
- component.update(value)
120
- end
121
- end
122
- end
123
- end
124
-
125
- def analog_read(pin, negative_pin=nil, gain=nil, sample_rate=nil)
126
- # Wrap in mutex so calls and callbacks are atomic.
127
- @mutex.synchronize do
128
- # Default gain and sample rate.
129
- gain ||= 0b010
130
- sample_rate ||= 0b100
131
-
132
- # Set these for callbacks.
133
- @active_pin = pin
134
- @active_gain = gain
135
-
136
- # Set gain in upper config register.
137
- raise ArgumentError "wrong gain: #{gain.inspect} given for ADS1118" unless PGA_RANGE.include?(gain)
138
- @config_register[0] = BASE_MSB | (gain << 1)
139
-
140
- # Set mux bits in upper config register.
141
- mux_bits = pins_to_mux_bits(pin, negative_pin)
142
- @config_register[0] = @config_register[0] | (mux_bits << 4)
143
-
144
- # Set sample rate in lower config_register.
145
- raise ArgumentError "wrong sample_rate: #{sample_rate.inspect} given for ADS1118" unless SAMPLE_RATE_RANGE.include?(gain)
146
- @config_register[1] = BASE_LSB | (sample_rate << 5)
147
-
148
- read(@config_register)
149
- end
150
- end
151
-
152
- def pins_to_mux_bits(pin, negative_pin)
153
- # Pin 1 is negative input. Only pin 0 can be read.
154
- if negative_pin == 1
155
- raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 1 is negative input, only 0" unless pin == 0
156
- return 0b000
157
- end
158
-
159
- # Pin 3 is negative input. Pins 0..2 can be read.
160
- if negative_pin == 3
161
- raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 3 is negative input, only 0..2" unless [0,1,2].include? pin
162
- return 0b001 + pin
163
- end
164
-
165
- # No negative input. Any pin from 0 to 3 can be read.
166
- unless negative_pin
167
- raise ArgumentError, "given pin: #{pin.inspect} is out of range 0..3" unless [0,1,2,3].include? pin
168
- return (0b100 + pin)
169
- end
170
-
171
- raise ArgumentError, "only pins 1 and 3 can be used as negative input"
172
- end
173
-
174
- def analog_listen(pin, divider=nil)
175
- raise StandardError, "ADS1118 does not implement #listen for subcomponents. Use #read or #poll instead"
176
- end
177
-
178
- def stop_listener(pin)
179
- end
180
70
  end
181
71
  end
182
72
  end
@@ -0,0 +1,123 @@
1
+ module Denko
2
+ module AnalogIO
3
+ module ADS111X
4
+ #
5
+ # Functionality shared among the ADS111X class of ADC converters.
6
+ #
7
+ include Behaviors::Reader
8
+
9
+ PGA_SETTINGS = [ # Bitmask Full scale voltage
10
+ 0.0001875, # 0b000 6.144 V
11
+ 0.000125, # 0b001 4.095 V
12
+ 0.0000625, # 0b010 2.048 V (default)
13
+ 0.00003125, # 0b011 1.024 V
14
+ 0.000015625, # 0b100 0.512 V
15
+ 0.0000078125, # 0b101 0.256 V
16
+ 0.0000078125, # 0b110 0.256 V
17
+ 0.0000078125, # 0b111 0.256 V
18
+ ]
19
+ PGA_RANGE = (0..7).to_a
20
+
21
+ # Sample rate bitmask maps to sample time in seconds.
22
+ SAMPLE_TIMES = [ # Bitmask
23
+ 0.125, # 0b000
24
+ 0.0625, # 0b001
25
+ 0.03125, # 0b010
26
+ 0.015625, # 0b011
27
+ 0.0078125, # 0b100 (default)
28
+ 0.004, # 0b101
29
+ 0.002105263, # 0b110
30
+ 0.00116279, # 0b111
31
+ ]
32
+ SAMPLE_RATE_RANGE = (0..7).to_a
33
+
34
+ # Wait times need to be slightly longer than the actual sample times.
35
+ WAIT_TIMES = SAMPLE_TIMES.map { |time| time + 0.0005 }
36
+
37
+ # Mux bits map to array of form [positive input, negative input].
38
+ MUX_SETTINGS = {
39
+ 0b000 => [0, 1],
40
+ 0b001 => [0, 3],
41
+ 0b010 => [1, 3],
42
+ 0b011 => [2, 3],
43
+ 0b100 => [0, nil],
44
+ 0b101 => [1, nil],
45
+ 0b110 => [2, nil],
46
+ 0b111 => [3, nil],
47
+ }
48
+
49
+ #
50
+ # BoardProxy behavior so AnalogIO classes can use this as a Board.
51
+ #
52
+ include Behaviors::BoardProxy
53
+
54
+ # Mimic Board#update, but inside a callback, wrapped by #update.
55
+ def enable_proxy
56
+ self.add_callback(:board_proxy) do |value|
57
+ components.each do |component|
58
+ if @active_pin == component.pin
59
+ component.volts_per_bit = PGA_SETTINGS[@active_gain]
60
+ component.update(value)
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def analog_read(pin, negative_pin=nil, gain=nil, sample_rate=nil)
67
+ # Wrap in mutex so calls and callbacks are atomic.
68
+ @mutex.synchronize do
69
+ # Default gain and sample rate.
70
+ gain ||= 0b010
71
+ sample_rate ||= 0b100
72
+
73
+ # Set these for callbacks.
74
+ @active_pin = pin
75
+ @active_gain = gain
76
+
77
+ # Set gain in upper config register.
78
+ raise ArgumentError "wrong gain: #{gain.inspect} given for ADS111X" unless PGA_RANGE.include?(gain)
79
+ @config_register[0] = self.class::BASE_MSB | (gain << 1)
80
+
81
+ # Set mux bits in upper config register.
82
+ mux_bits = pins_to_mux_bits(pin, negative_pin)
83
+ @config_register[0] = @config_register[0] | (mux_bits << 4)
84
+
85
+ # Set sample rate in lower config_register.
86
+ raise ArgumentError "wrong sample_rate: #{sample_rate.inspect} given for ADS111X" unless SAMPLE_RATE_RANGE.include?(gain)
87
+ @config_register[1] = self.class::BASE_LSB | (sample_rate << 5)
88
+
89
+ read(@config_register)
90
+ end
91
+ end
92
+
93
+ def pins_to_mux_bits(pin, negative_pin)
94
+ # Pin 1 is negative input. Only pin 0 can be read.
95
+ if negative_pin == 1
96
+ raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 1 is negative input, only 0" unless pin == 0
97
+ return 0b000
98
+ end
99
+
100
+ # Pin 3 is negative input. Pins 0..2 can be read.
101
+ if negative_pin == 3
102
+ raise ArgumentError, "given pin: #{pin.inspect} cannot be used when pin 3 is negative input, only 0..2" unless [0,1,2].include? pin
103
+ return 0b001 + pin
104
+ end
105
+
106
+ # No negative input. Any pin from 0 to 3 can be read.
107
+ unless negative_pin
108
+ raise ArgumentError, "given pin: #{pin.inspect} is out of range 0..3" unless [0,1,2,3].include? pin
109
+ return (0b100 + pin)
110
+ end
111
+
112
+ raise ArgumentError, "only pins 1 and 3 can be used as negative input"
113
+ end
114
+
115
+ def analog_listen(pin, divider=nil)
116
+ raise StandardError, "ADS111X does not implement #listen for subcomponents. Use #read or #poll instead"
117
+ end
118
+
119
+ def stop_listener(pin)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -13,7 +13,8 @@ module Denko
13
13
  end
14
14
 
15
15
  def write(value)
16
- board.dac_write(pin, @state = value)
16
+ @board.dac_write(@pin, value)
17
+ self.state = value
17
18
  end
18
19
  end
19
20
  end
@@ -4,6 +4,8 @@ module Denko
4
4
  autoload :Output, "#{__dir__}/analog_io/output"
5
5
  autoload :Potentiometer, "#{__dir__}/analog_io/potentiometer"
6
6
  autoload :Sensor, "#{__dir__}/analog_io/sensor"
7
+ autoload :ADS111X, "#{__dir__}/analog_io/ads111x"
8
+ autoload :ADS1115, "#{__dir__}/analog_io/ads1115"
7
9
  autoload :ADS1118, "#{__dir__}/analog_io/ads1118"
8
10
  end
9
11
  end
@@ -12,28 +12,29 @@ module Denko
12
12
  end
13
13
 
14
14
  #
15
- # Delegate reading to another method that sends a command to the board.
16
- # Accepts blocks as one-time callbacks stored in the :read key.
17
- # Blocks until a value is recieved from the board.
18
- # Returns the value after #pre_callback_filter runs on it.
15
+ # Take a proc/lambda/method as the first agrument and use it to read.
16
+ # Arguments are passed through, allowing dynamic read methods to be defined.
17
+ # Eg. send commands (in args) to a bus, then wait for data read back.
18
+ #
19
+ # Block given is added as a one-time callback in the :read key, and
20
+ # the curent thread waits until data is received. Returns the result of
21
+ # calling #pre_callback_filter with the data.
19
22
  #
20
- # Give procs as methods to build more complex functionality for buses.
21
- #
22
- def read_using(method, *args, **kwargs, &block)
23
+ def read_using(reader, *args, **kwargs, &block)
23
24
  add_callback(:read, &block) if block_given?
24
25
 
25
- value = nil
26
+ return_value = nil
26
27
  add_callback(:read) do |filtered_data|
27
- value = filtered_data
28
+ return_value = filtered_data
28
29
  end
29
30
 
30
- method.call(*args, **kwargs)
31
- block_until_read
31
+ reader.call(*args, **kwargs)
32
+ wait_for_read
32
33
 
33
- value
34
+ return_value
34
35
  end
35
36
 
36
- def block_until_read
37
+ def wait_for_read
37
38
  loop do
38
39
  break if !callbacks[:read]
39
40
  sleep 0.001
@@ -10,8 +10,6 @@ module Denko
10
10
  end
11
11
 
12
12
  def add_component(component)
13
- components << component
14
-
15
13
  if component.respond_to?(:pin) && component.pin.class == Integer
16
14
  unless single_pin_components[component.pin]
17
15
  single_pin_components[component.pin] = component
@@ -20,6 +18,8 @@ module Denko
20
18
  "already in use by: #{single_pin_components[component.pin]}"
21
19
  end
22
20
  end
21
+
22
+ components << component
23
23
  end
24
24
 
25
25
  def remove_component(component)
@@ -119,7 +119,7 @@ module Denko
119
119
  # CMD = 95
120
120
  def set_register_divider(value)
121
121
  unless DIVIDERS.include?(value)
122
- raise ArgumentError, "error in divider: #{options[:divider]}. Should be one of: #{DIVIDERS.inspect}"
122
+ raise ArgumentError, "error in divider: #{value}. Should be one of: #{DIVIDERS.inspect}"
123
123
  end
124
124
  write Message.encode(command: 95, value: value)
125
125
  end
@@ -7,10 +7,7 @@ module Denko
7
7
  3400000 => 0x03,
8
8
  }
9
9
 
10
- # Might make this bigger based on board maps later, but stick with the lowest limit of the AVR boards for now.
11
- def i2c_limit
12
- 32
13
- end
10
+ attr_reader :i2c_limit
14
11
 
15
12
  def i2c_convert_frequency(freq)
16
13
  # Default to 100 kHz.
@@ -1,17 +1,14 @@
1
1
  module Denko
2
2
  class Board
3
3
  def show_ws2812(pin, pixel_buffer)
4
- length = pixel_buffer.length
5
-
6
4
  # Settings are blank for now.
7
5
  settings = pack :uint8, [0, 0, 0, 0]
8
6
 
9
- # Limit to 100 pixels (3-bytes each) for now
10
- packed_pixels = pack :uint8, pixel_buffer, max: 300
11
-
7
+ packed_pixels = pack :uint8, pixel_buffer
8
+
12
9
  write_and_halt Message.encode command: 19,
13
10
  pin: pin,
14
- value: length,
11
+ value: pixel_buffer.length,
15
12
  aux_message: settings + packed_pixels
16
13
  end
17
14
  end
@@ -6,10 +6,19 @@ module Denko
6
6
 
7
7
  attr_reader :map
8
8
 
9
+ def substitute_zero_pins
10
+ ["SDA", "SCL", "MOSI", "MISO", "SCK", "SS"].each do |name|
11
+ symbol = name.to_sym
12
+ zero_symbol = (name + "0").to_sym
13
+ @map[symbol] = @map[zero_symbol] if (@map[zero_symbol] && !@map[symbol])
14
+ end
15
+ end
16
+
9
17
  def load_map(board_name)
10
18
  if board_name
11
19
  map_path = File.join(MAPS_FOLDER, "#{board_name}.yml")
12
20
  @map = YAML.load_file(map_path)
21
+ substitute_zero_pins
13
22
  else
14
23
  @map = nil
15
24
  end
@@ -1,15 +1,11 @@
1
1
  module Denko
2
2
  class Board
3
3
  # CMD = 10
4
- def servo_toggle(pin, value=:off, options={})
5
- options[:min] ||= 544
6
- options[:max] ||= 2400
7
- aux = pack :uint16, [options[:min], options[:max]]
8
-
4
+ def servo_toggle(pin, value=:off, min: 544, max: 2400)
9
5
  write Message.encode command: 10,
10
6
  pin: pin,
11
7
  value: (value == :off) ? 0 : 1,
12
- aux_message: aux
8
+ aux_message: pack(:uint16, [min, max])
13
9
  end
14
10
 
15
11
  # CMD = 11