denko 0.13.6 → 0.15.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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +19 -18
  3. data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +19 -18
  4. data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +18 -17
  5. data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +19 -18
  6. data/.github/workflows/build_esp32.yml +19 -18
  7. data/.github/workflows/build_esp32c3.yml +58 -0
  8. data/.github/workflows/build_esp32c6.yml +59 -0
  9. data/.github/workflows/build_esp32h2.yml +58 -0
  10. data/.github/workflows/build_esp32s2.yml +59 -0
  11. data/.github/workflows/build_esp32s3.yml +59 -0
  12. data/.github/workflows/build_esp8266.yml +16 -15
  13. data/.github/workflows/build_ra4m1.yml +17 -16
  14. data/.github/workflows/build_rp2040.yml +19 -17
  15. data/.github/workflows/ruby.yml +20 -20
  16. data/CHANGELOG.md +398 -11
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +39 -39
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +73 -58
  22. data/Rakefile +1 -1
  23. data/build +1 -1
  24. data/denko.gemspec +11 -3
  25. data/lib/denko/analog_io/ads1100.rb +127 -0
  26. data/lib/denko/analog_io/ads1115.rb +8 -25
  27. data/lib/denko/analog_io/ads1118.rb +12 -27
  28. data/lib/denko/analog_io/ads111x.rb +39 -21
  29. data/lib/denko/analog_io/input.rb +29 -55
  30. data/lib/denko/analog_io/input_helper.rb +42 -0
  31. data/lib/denko/analog_io/joystick.rb +87 -0
  32. data/lib/denko/analog_io/output.rb +5 -5
  33. data/lib/denko/analog_io/potentiometer.rb +3 -9
  34. data/lib/denko/analog_io.rb +22 -7
  35. data/lib/denko/behaviors/board_proxy.rb +13 -1
  36. data/lib/denko/behaviors/bus_controller.rb +3 -1
  37. data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
  38. data/lib/denko/behaviors/bus_peripheral.rb +3 -4
  39. data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
  40. data/lib/denko/behaviors/callbacks.rb +18 -14
  41. data/lib/denko/behaviors/component.rb +12 -14
  42. data/lib/denko/behaviors/input_pin.rb +14 -15
  43. data/lib/denko/behaviors/lifecycle.rb +51 -0
  44. data/lib/denko/behaviors/listener.rb +9 -3
  45. data/lib/denko/behaviors/multi_pin.rb +22 -20
  46. data/lib/denko/behaviors/output_pin.rb +9 -4
  47. data/lib/denko/behaviors/poller.rb +11 -2
  48. data/lib/denko/behaviors/reader.rb +109 -21
  49. data/lib/denko/behaviors/single_pin.rb +3 -4
  50. data/lib/denko/behaviors/state.rb +24 -13
  51. data/lib/denko/behaviors/subcomponents.rb +72 -12
  52. data/lib/denko/behaviors/threaded.rb +19 -8
  53. data/lib/denko/behaviors.rb +36 -22
  54. data/lib/denko/board/core.rb +36 -18
  55. data/lib/denko/board/eeprom.rb +1 -1
  56. data/lib/denko/board/i2c.rb +15 -15
  57. data/lib/denko/board/i2c_bit_bang.rb +53 -0
  58. data/lib/denko/board/infrared.rb +6 -6
  59. data/lib/denko/board/led_array.rb +6 -5
  60. data/lib/denko/board/map.rb +6 -2
  61. data/lib/denko/board/one_wire.rb +3 -3
  62. data/lib/denko/board/spi.rb +35 -30
  63. data/lib/denko/board/spi_bit_bang.rb +14 -15
  64. data/lib/denko/board.rb +41 -36
  65. data/lib/denko/connection/binary_echo.rb +17 -0
  66. data/lib/denko/connection/flow_control.rb +12 -16
  67. data/lib/denko/connection/handshake.rb +2 -0
  68. data/lib/denko/connection/serial.rb +5 -5
  69. data/lib/denko/digital_io/button.rb +4 -0
  70. data/lib/denko/digital_io/c_bit_bang.rb +15 -0
  71. data/lib/denko/digital_io/input.rb +4 -5
  72. data/lib/denko/digital_io/output.rb +19 -10
  73. data/lib/denko/digital_io/pcf8574.rb +114 -0
  74. data/lib/denko/digital_io/relay.rb +2 -0
  75. data/lib/denko/digital_io/rotary_encoder.rb +83 -61
  76. data/lib/denko/digital_io.rb +24 -5
  77. data/lib/denko/display/canvas.rb +350 -157
  78. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  79. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  80. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  81. data/lib/denko/display/font.rb +22 -0
  82. data/lib/denko/display/hd44780.rb +152 -105
  83. data/lib/denko/display/il0373.rb +186 -0
  84. data/lib/denko/display/mono_oled.rb +193 -0
  85. data/lib/denko/display/pcd8544.rb +154 -0
  86. data/lib/denko/display/pixel_common.rb +83 -0
  87. data/lib/denko/display/sh1106.rb +38 -0
  88. data/lib/denko/display/sh1107.rb +10 -0
  89. data/lib/denko/display/spi_common.rb +35 -0
  90. data/lib/denko/display/spi_epaper_common.rb +30 -0
  91. data/lib/denko/display/ssd1306.rb +6 -168
  92. data/lib/denko/display/ssd1680.rb +14 -0
  93. data/lib/denko/display/ssd1681.rb +8 -0
  94. data/lib/denko/display/ssd168x.rb +227 -0
  95. data/lib/denko/display/st7302.rb +207 -0
  96. data/lib/denko/display/st7565.rb +166 -0
  97. data/lib/denko/display.rb +40 -3
  98. data/lib/denko/eeprom/at24c.rb +67 -0
  99. data/lib/denko/eeprom/board.rb +69 -0
  100. data/lib/denko/eeprom.rb +15 -1
  101. data/lib/denko/helpers/engine_check.rb +13 -0
  102. data/lib/denko/helpers/mutex_stub.rb +13 -0
  103. data/lib/denko/helpers.rb +6 -0
  104. data/lib/denko/i2c/bit_bang.rb +32 -0
  105. data/lib/denko/i2c/bus.rb +8 -36
  106. data/lib/denko/i2c/bus_common.rb +50 -0
  107. data/lib/denko/i2c/peripheral.rb +32 -19
  108. data/lib/denko/i2c.rb +17 -2
  109. data/lib/denko/led/apa102.rb +42 -30
  110. data/lib/denko/led/base.rb +13 -2
  111. data/lib/denko/led/rgb.rb +18 -14
  112. data/lib/denko/led/seven_segment.rb +24 -9
  113. data/lib/denko/led/ws2812.rb +10 -7
  114. data/lib/denko/led.rb +17 -8
  115. data/lib/denko/message.rb +5 -0
  116. data/lib/denko/motor/{stepper.rb → a3967.rb} +12 -15
  117. data/lib/denko/motor/l298.rb +11 -10
  118. data/lib/denko/motor/servo.rb +37 -15
  119. data/lib/denko/motor.rb +16 -3
  120. data/lib/denko/one_wire/bus.rb +31 -23
  121. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  122. data/lib/denko/one_wire/helper.rb +4 -2
  123. data/lib/denko/one_wire/peripheral.rb +0 -3
  124. data/lib/denko/one_wire.rb +18 -5
  125. data/lib/denko/pulse_io/buzzer.rb +11 -9
  126. data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +6 -5
  127. data/lib/denko/pulse_io/pwm_output.rb +94 -15
  128. data/lib/denko/pulse_io.rb +17 -3
  129. data/lib/denko/rtc/ds3231.rb +13 -14
  130. data/lib/denko/rtc.rb +14 -1
  131. data/lib/denko/sensor/aht.rb +35 -38
  132. data/lib/denko/sensor/bme280.rb +76 -92
  133. data/lib/denko/sensor/bmp180.rb +46 -48
  134. data/lib/denko/sensor/dht.rb +34 -7
  135. data/lib/denko/sensor/ds18b20.rb +41 -34
  136. data/lib/denko/sensor/hcsr04.rb +7 -5
  137. data/lib/denko/sensor/hdc1080.rb +174 -0
  138. data/lib/denko/sensor/helper.rb +37 -0
  139. data/lib/denko/sensor/htu21d.rb +57 -57
  140. data/lib/denko/sensor/htu31d.rb +36 -36
  141. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  142. data/lib/denko/sensor/qmp6988.rb +34 -48
  143. data/lib/denko/sensor/rcwl9620.rb +3 -5
  144. data/lib/denko/sensor/sht3x.rb +27 -24
  145. data/lib/denko/sensor/sht4x.rb +125 -0
  146. data/lib/denko/sensor/vl53l0x.rb +58 -0
  147. data/lib/denko/sensor.rb +33 -16
  148. data/lib/denko/spi/base_register.rb +25 -21
  149. data/lib/denko/spi/bit_bang.rb +17 -51
  150. data/lib/denko/spi/bus.rb +15 -29
  151. data/lib/denko/spi/bus_common.rb +33 -0
  152. data/lib/denko/spi/input_register.rb +37 -31
  153. data/lib/denko/spi/output_register.rb +33 -39
  154. data/lib/denko/spi/peripheral.rb +81 -14
  155. data/lib/denko/spi.rb +21 -6
  156. data/lib/denko/uart/bit_bang.rb +7 -30
  157. data/lib/denko/uart/common.rb +33 -0
  158. data/lib/denko/uart/hardware.rb +10 -34
  159. data/lib/denko/uart.rb +16 -2
  160. data/lib/denko/version.rb +1 -1
  161. data/lib/denko.rb +23 -16
  162. data/lib/denko_cli/generator.rb +2 -2
  163. data/lib/denko_cli/packages.rb +8 -10
  164. data/lib/denko_cli/targets.rb +13 -13
  165. data/lib/denko_cli/targets.txt +23 -24
  166. data/lib/denko_cli/usage.txt +1 -1
  167. data/src/denko_ethernet.ino +0 -14
  168. data/src/denko_serial.ino +0 -14
  169. data/src/denko_wifi.ino +6 -15
  170. data/src/lib/Denko.cpp +65 -16
  171. data/src/lib/Denko.h +46 -30
  172. data/src/lib/DenkoCoreIO.cpp +57 -102
  173. data/src/lib/DenkoDefines.h +32 -46
  174. data/src/lib/DenkoI2C.cpp +54 -45
  175. data/src/lib/DenkoI2CBB.cpp +238 -0
  176. data/src/lib/DenkoIROut.cpp +12 -7
  177. data/src/lib/DenkoLEDArray.cpp +29 -13
  178. data/src/lib/DenkoSPI.cpp +36 -33
  179. data/src/lib/DenkoSPIBB.cpp +19 -20
  180. data/target.yml +37 -2
  181. data/test/analog_io/input_test.rb +1 -1
  182. data/test/analog_io/potentiometer_test.rb +12 -12
  183. data/test/behaviors/board_proxy_test.rb +1 -1
  184. data/test/behaviors/bus_peripheral_test.rb +4 -4
  185. data/test/behaviors/callbacks_test.rb +28 -10
  186. data/test/behaviors/component_test.rb +32 -14
  187. data/test/behaviors/input_pin_test.rb +14 -9
  188. data/test/behaviors/multi_pin_test.rb +14 -4
  189. data/test/behaviors/output_pin_test.rb +11 -8
  190. data/test/behaviors/poller_test.rb +1 -0
  191. data/test/behaviors/reader_test.rb +3 -2
  192. data/test/behaviors/subcomponents_test.rb +22 -2
  193. data/test/board/board_test.rb +9 -9
  194. data/test/board/core_test.rb +15 -11
  195. data/test/board/i2c_test.rb +39 -33
  196. data/test/board/infrared_test.rb +1 -1
  197. data/test/board/message_test.rb +17 -11
  198. data/test/board/one_wire_test.rb +25 -14
  199. data/test/board/spi_test.rb +45 -29
  200. data/test/digital_io/button_test.rb +15 -0
  201. data/test/digital_io/input_test.rb +2 -2
  202. data/test/digital_io/relay_test.rb +18 -0
  203. data/test/digital_io/rotary_encoder_test.rb +80 -60
  204. data/test/display/canvas_test.rb +306 -0
  205. data/test/display/hd44780_test.rb +34 -7
  206. data/test/eeprom/board_test.rb +45 -0
  207. data/test/helpers/mruby_minitest.rb +95 -0
  208. data/test/helpers/mruby_runner.rb +13 -0
  209. data/test/i2c/bus_test.rb +108 -29
  210. data/test/i2c/peripheral_test.rb +38 -19
  211. data/test/led/apa102_test.rb +24 -0
  212. data/test/led/base_test.rb +2 -1
  213. data/test/led/rgb_test.rb +9 -9
  214. data/test/led/seven_segment_test.rb +7 -7
  215. data/test/motor/{stepper_test.rb → a3967_test.rb} +4 -4
  216. data/test/motor/servo_test.rb +1 -1
  217. data/test/one_wire/bus_enumerator_test.rb +1 -1
  218. data/test/one_wire/bus_test.rb +43 -35
  219. data/test/one_wire/peripheral_test.rb +5 -17
  220. data/test/pulse_io/buzzer_test.rb +7 -4
  221. data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +15 -10
  222. data/test/pulse_io/pwm_output_test.rb +74 -18
  223. data/test/rtc/ds3231_test.rb +13 -14
  224. data/test/sensor/dht_test.rb +12 -12
  225. data/test/sensor/ds18b20_test.rb +4 -8
  226. data/test/spi/bitbang_test.rb +27 -0
  227. data/test/spi/bus_test.rb +24 -34
  228. data/test/spi/input_register_test.rb +17 -17
  229. data/test/spi/output_register_test.rb +10 -28
  230. data/test/spi/peripheral_test.rb +73 -0
  231. data/test/test_helper.rb +44 -121
  232. data/vendor/board-maps/BoardMap.h +678 -54
  233. data/vendor/board-maps/lib/header_parser.rb +12 -2
  234. data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
  235. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
  236. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
  237. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
  238. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
  239. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
  240. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
  241. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
  242. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
  243. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  244. data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
  245. data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
  246. data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
  247. data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
  248. data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
  249. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  250. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  251. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  252. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  253. data/vendor/board-maps/yaml/BLING.yml +25 -0
  254. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
  255. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
  256. data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
  257. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  258. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  259. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  260. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  261. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
  262. data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
  263. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
  264. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
  265. data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
  266. data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
  267. data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
  268. data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
  269. data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
  270. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +14 -0
  271. data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
  272. data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
  273. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +14 -0
  274. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +12 -0
  275. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +12 -0
  276. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  277. data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +1 -1
  278. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +43 -0
  279. data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
  280. data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
  281. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  282. data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
  283. data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
  284. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  285. data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
  286. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  287. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +13 -0
  288. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  289. data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
  290. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  291. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  292. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  293. data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
  294. data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
  295. data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
  296. data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
  297. data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
  298. data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
  299. data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
  300. data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
  301. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  302. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  303. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
  304. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  305. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  306. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  307. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  308. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  309. data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
  310. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
  311. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
  312. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
  313. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
  314. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
  315. data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
  316. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  317. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +13 -0
  318. data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
  319. data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
  320. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
  321. data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
  322. data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
  323. data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
  324. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  325. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -2
  326. data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
  327. data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
  328. data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
  329. data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
  330. data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
  331. data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
  332. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
  333. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
  334. data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
  335. data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
  336. data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
  337. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
  338. data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
  339. data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
  340. data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
  341. data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
  342. data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
  343. data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
  344. data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
  345. data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
  346. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
  347. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
  348. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  349. data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
  350. data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
  351. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  352. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  353. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  354. data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
  355. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
  356. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
  357. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  358. data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
  359. data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
  360. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  361. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  362. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  363. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  364. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
  365. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +14 -0
  366. data/vendor/board-maps/yaml/TINYC6.yml +25 -0
  367. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  368. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  369. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  370. data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
  371. data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
  372. data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
  373. data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
  374. data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
  375. data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
  376. data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
  377. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  378. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  379. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  380. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  381. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  382. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  383. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  384. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  385. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  386. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  387. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  388. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  389. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  390. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  391. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  392. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  393. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  394. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  395. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  396. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  397. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  398. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  399. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  400. data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
  401. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
  402. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
  403. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
  404. data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
  405. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  406. data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
  407. data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
  408. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
  409. data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
  410. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  411. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  412. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  413. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  414. data/vendor/board-maps/yaml/mercury.yml +20 -0
  415. data/vendor/board-maps/yaml/unphone9.yml +8 -0
  416. metadata +259 -105
  417. data/.vscode/settings.json +0 -5
  418. data/.vscode/tasks.json +0 -20
  419. data/HARDWARE.md +0 -264
  420. data/benchmarks/i2c_ssd1306_refresh.rb +0 -84
  421. data/examples/advanced/m5_env.rb +0 -48
  422. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -48
  423. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -48
  424. data/examples/analog_io/ads1115.rb +0 -57
  425. data/examples/analog_io/ads1118.rb +0 -73
  426. data/examples/analog_io/dac_loopback.rb +0 -34
  427. data/examples/analog_io/input.rb +0 -55
  428. data/examples/connection/tcp.rb +0 -34
  429. data/examples/digital_io/button.rb +0 -13
  430. data/examples/digital_io/rotary_encoder.rb +0 -26
  431. data/examples/display/hd44780.png +0 -0
  432. data/examples/display/hd44780.rb +0 -39
  433. data/examples/display/ssd1306.rb +0 -40
  434. data/examples/display/ssd1306_s2_pico.rb +0 -29
  435. data/examples/eeprom/built_in.rb +0 -32
  436. data/examples/i2c/search.rb +0 -55
  437. data/examples/led/apa102_bounce.rb +0 -33
  438. data/examples/led/apa102_breathe.rb +0 -45
  439. data/examples/led/builtin_blink.rb +0 -12
  440. data/examples/led/seven_segment_char_echo.rb +0 -15
  441. data/examples/led/ws2812_bounce.rb +0 -32
  442. data/examples/led/ws2812_builtin_blink.rb +0 -21
  443. data/examples/motor/l298.rb +0 -43
  444. data/examples/motor/servo.rb +0 -16
  445. data/examples/motor/stepper.png +0 -0
  446. data/examples/motor/stepper.rb +0 -43
  447. data/examples/pulse_io/buzzer.rb +0 -30
  448. data/examples/pulse_io/ir_transmitter.rb +0 -55
  449. data/examples/rtc/ds3231.rb +0 -48
  450. data/examples/sensor/aht10.rb +0 -19
  451. data/examples/sensor/aht20.rb +0 -19
  452. data/examples/sensor/bme280.rb +0 -38
  453. data/examples/sensor/bmp180.rb +0 -22
  454. data/examples/sensor/dht.rb +0 -24
  455. data/examples/sensor/ds18b20.rb +0 -58
  456. data/examples/sensor/generic_pir.rb +0 -25
  457. data/examples/sensor/hcsr04.rb +0 -14
  458. data/examples/sensor/htu21d.rb +0 -54
  459. data/examples/sensor/htu31d.rb +0 -35
  460. data/examples/sensor/neat_tph_readings.rb +0 -26
  461. data/examples/sensor/qmp6988.rb +0 -53
  462. data/examples/sensor/rcwl9620.rb +0 -15
  463. data/examples/sensor/sht3x.rb +0 -34
  464. data/examples/spi/input_register.rb +0 -50
  465. data/examples/spi/output_register.rb +0 -49
  466. data/examples/spi/ssd_through_register.rb +0 -40
  467. data/examples/spi/two_registers.rb +0 -46
  468. data/examples/uart/bit_bang_read.rb +0 -16
  469. data/examples/uart/bit_bang_write.rb +0 -16
  470. data/examples/uart/board_passthrough.rb +0 -34
  471. data/examples/uart/hardware_loopback.rb +0 -16
  472. data/lib/denko/analog_io/sensor.rb +0 -6
  473. data/lib/denko/eeprom/built_in.rb +0 -69
  474. data/lib/denko/fonts.rb +0 -106
  475. data/lib/denko/sensor/virtual.rb +0 -42
  476. data/src/lib/DenkoIROutESP.cpp +0 -26
  477. data/test/eeprom/built_in_test.rb +0 -61
  478. data/tutorial/01-led/led.fzz +0 -0
  479. data/tutorial/01-led/led.pdf +0 -0
  480. data/tutorial/01-led/led.rb +0 -73
  481. data/tutorial/02-button/button.fzz +0 -0
  482. data/tutorial/02-button/button.pdf +0 -0
  483. data/tutorial/02-button/button.rb +0 -64
  484. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  485. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  486. data/tutorial/03-potentiometer/potentiometer.rb +0 -62
  487. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  488. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  489. data/tutorial/04-pwm_led/pwm_led.rb +0 -66
  490. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  491. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  492. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  493. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
  494. data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
  495. /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
  496. /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
  497. /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
  498. /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
  499. /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
@@ -7,7 +7,8 @@ module Denko
7
7
  module Display
8
8
  class HD44780
9
9
  include Behaviors::MultiPin
10
-
10
+ include Behaviors::Lifecycle
11
+
11
12
  # Commands
12
13
  LCD_CLEARDISPLAY = 0x01
13
14
  LCD_RETURNHOME = 0x02
@@ -17,13 +18,13 @@ module Denko
17
18
  LCD_FUNCTIONSET = 0x20
18
19
  LCD_SETCGRAMADDR = 0x40
19
20
  LCD_SETDDRAMADDR = 0x80
20
-
21
+
21
22
  # Flags for display entry mode
22
23
  LCD_ENTRYRIGHT = 0x00
23
24
  LCD_ENTRYLEFT = 0x02
24
25
  LCD_ENTRYSHIFTINCREMENT = 0x01
25
26
  LCD_ENTRYSHIFTDECREMENT = 0x00
26
-
27
+
27
28
  # Flags for display on/off control
28
29
  LCD_DISPLAYON = 0x04
29
30
  LCD_DISPLAYOFF = 0x00
@@ -31,13 +32,13 @@ module Denko
31
32
  LCD_CURSOROFF = 0x00
32
33
  LCD_BLINKON = 0x01
33
34
  LCD_BLINKOFF = 0x00
34
-
35
+
35
36
  # Flags for display/cursor shift
36
37
  LCD_DISPLAYMOVE = 0x08
37
38
  LCD_CURSORMOVE = 0x00
38
39
  LCD_MOVERIGHT = 0x04
39
40
  LCD_MOVELEFT = 0x00
40
-
41
+
41
42
  # Flags for function set
42
43
  LCD_8BITMODE = 0x10
43
44
  LCD_4BITMODE = 0x00
@@ -46,88 +47,110 @@ module Denko
46
47
  LCD_5x10DOTS = 0x04
47
48
  LCD_5x8DOTS = 0x00
48
49
 
50
+ def data_lines
51
+ @data_lines ||= 4
52
+ end
53
+
54
+ # Default to 16x2 display if columns and rows given.
55
+ def columns
56
+ @columns ||= params[:columns] || 16
57
+ end
58
+
59
+ def rows
60
+ @rows ||= params[:rows] || 2
61
+ end
62
+
63
+ # Fuction set byte to set up the LCD. These OR'ed defaults == 0x00.
64
+ def function
65
+ @function ||= LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS
66
+ end
67
+
68
+ # Offset memory address when moving cursor.
69
+ # Row 2 always starts at memory address 0x40.
70
+ # For 4 line LCDs:
71
+ # Row 3 is immediately after row 1, +16 or 20 bytes, depending on columns.
72
+ # Row 4 is immediately after row 2, +16 or 20 bytes, depending on columns.
73
+ def row_offsets
74
+ @row_offsets ||= [0x00, 0x40, 0x00+columns, 0x40+columns]
75
+ end
76
+
77
+ # Start with cursor off and no cursor blink.
78
+ def control
79
+ @control ||= LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF
80
+ end
81
+
82
+ def entry_mode
83
+ @entry_mode ||= LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT
84
+ end
85
+
86
+ attr_writer :columns, :rows, :function, :data_lines, :row_offsets, :control, :entry_mode
87
+
49
88
  def initialize_pins(options={})
50
89
  # All the required pins.
51
90
  [:rs, :enable, :d4, :d5, :d6, :d7].each do |symbol|
52
91
  proxy_pin(symbol, DigitalIO::Output)
53
92
  end
54
-
93
+
55
94
  # If any of d0-d3 was given, make them all non-optional.
56
95
  lower_bits_optional = (self.pins.keys & [:d0, :d1, :d2, :d3]).empty?
57
96
  [:d0, :d1, :d2, :d3].each do |symbol|
58
97
  proxy_pin(symbol, DigitalIO::Output, optional: lower_bits_optional)
59
98
  end
60
-
61
- # RW pin is mostly hard-wired to ground, but can given.
62
- proxy_pin(:rw, DigitalIO::Output, optional: true)
99
+
100
+ # RW pin can be hardwired to GND, or given. Will be always pulled low.
101
+ proxy_pin :rw, DigitalIO::Output, optional: true
102
+
103
+ # Backlight can be hardwired, given here, or modeled as a separate component.
104
+ # If HD44780 is on a digital register, and PWM is desired, use a separate component.
105
+ proxy_pin :backlight, LED::Base, optional: true
63
106
  end
64
107
 
65
- def after_initialize(options={})
66
- super(options)
67
-
68
- # Default to 16x2 display if no options given.
69
- @columns = options[:columns] || 16
70
- @rows = options[:rows] || 2
71
-
72
- # Create a fuction set byte to set up the LCD. These defaults equal 0x00.
73
- @function = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS
74
-
75
- # Set 8-bit mode in the mask if d0-d3 are present.
108
+ after_initialize do
109
+ # Switch to 8-bit mode if d0-d3 are present.
76
110
  if (d0 && d1 && d2 && d3)
77
- @bits = 8
78
- @function |= LCD_8BITMODE
79
- else
80
- @bits = 4
111
+ self.data_lines = 8
112
+ self.function |= LCD_8BITMODE
81
113
  end
82
114
 
83
115
  # Set 2 line (row) mode if needed.
84
- @function |= LCD_2LINE if (@rows > 1)
116
+ self.function |= LCD_2LINE if (rows > 1)
85
117
 
86
118
  # Some 1 line displays can use a 5x10 font.
87
- @function |= LCD_5x10DOTS if options[:tall_font] && (@rows == 1)
88
-
89
- # Offset memory address when moving cursor.
90
- # Row 2 always starts at memory address 0x40.
91
- # For 4 line LCDs:
92
- # Row 3 is immediately after row 1, +16 or 20 bytes, depending on columns.
93
- # Row 4 is immediately after row 2, +16 or 20 bytes, depending on columns.
94
- @row_offsets = [0x00, 0x40, 0x00+@columns, 0x40+@columns]
95
-
119
+ self.function |= LCD_5x10DOTS if params[:tall_font] && (rows == 1)
120
+
96
121
  # Wait 50ms for power to be > 2.7V, then pull everything low.
97
122
  micro_delay(50000)
98
123
  enable.low; rs.low; rw.low if rw
99
124
 
100
125
  # Start in 4-bit mode.
101
- if @bits == 4
126
+ if data_lines == 4
102
127
  # Keep setting 8-bit mode until ready.
103
128
  command(0x03); micro_delay(4500)
104
129
  command(0x03); micro_delay(4500)
105
130
  command(0x03); micro_delay(150)
106
-
131
+
107
132
  # Set 4-bit mode.
108
133
  command(0x02)
109
-
134
+
110
135
  # Or start in 8 bit mode.
111
136
  else
112
- command(LCD_FUNCTIONSET | @function)
137
+ command(LCD_FUNCTIONSET | function)
113
138
  micro_delay(4500)
114
- command(LCD_FUNCTIONSET | @function)
139
+ command(LCD_FUNCTIONSET | function)
115
140
  micro_delay(150)
116
- command(LCD_FUNCTIONSET | @function)
141
+ command(LCD_FUNCTIONSET | function)
117
142
  end
118
-
143
+
119
144
  # Set functions (lines, font size, etc.).
120
- command(LCD_FUNCTIONSET | @function)
145
+ command(LCD_FUNCTIONSET | function)
121
146
 
122
- # Start with cursor off and no cursor blink.
123
- @control = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF
124
147
  display_on
125
148
  clear
126
-
127
- # Set entry mode defaults.
128
- @mode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT
129
- command(LCD_ENTRYMODESET | @mode)
130
-
149
+ backlight.on if backlight
150
+
151
+ # Write entry mode.
152
+ command(LCD_ENTRYMODESET | entry_mode)
153
+
131
154
  # Need this small delay to avoid garbage data on startup.
132
155
  sleep 0.05
133
156
  end
@@ -142,17 +165,17 @@ module Denko
142
165
  micro_delay(2000)
143
166
  end
144
167
 
145
- def set_cursor(col, row)
168
+ def text_cursor(col, row)
146
169
  # Limit to the highest row, 0 indexed.
147
- row = (@rows - 1) if row > (@rows - 1)
148
- command(LCD_SETDDRAMADDR | (col + @row_offsets[row]))
170
+ row = (rows - 1) if row > (rows - 1)
171
+ command(LCD_SETDDRAMADDR | (col + row_offsets[row]))
149
172
  end
150
- alias :move_to :set_cursor
151
-
152
- def print(text)
153
- text.each_byte { |b| write b }
173
+ alias :move_to :text_cursor
174
+
175
+ def text(str)
176
+ str.each_byte { |b| write b }
154
177
  end
155
-
178
+
156
179
  #
157
180
  # Create a #key_on and #key_off method for each feature in this hash,
158
181
  # using the constant in the value to send a control signal.
@@ -160,58 +183,58 @@ module Denko
160
183
  # Eg. #display_on and #display_off.
161
184
  #
162
185
  CONTROL_TOGGLES = {
163
- display: LCD_DISPLAYON,
164
- cursor: LCD_CURSORON,
165
- blink: LCD_BLINKON,
186
+ "display" => LCD_DISPLAYON,
187
+ "cursor" => LCD_CURSORON,
188
+ "blink" => LCD_BLINKON,
166
189
  }
167
190
  CONTROL_TOGGLES.each_key do |key|
168
- define_method (key.to_s << "_off").to_sym do
169
- command LCD_DISPLAYCONTROL | (@control &= ~CONTROL_TOGGLES[key])
191
+ define_method (key + "_off") do
192
+ command LCD_DISPLAYCONTROL | (self.control &= ~CONTROL_TOGGLES[key])
170
193
  end
171
- define_method (key.to_s << "_on") do
172
- command LCD_DISPLAYCONTROL | (@control |= CONTROL_TOGGLES[key])
194
+ define_method (key + "_on") do
195
+ command LCD_DISPLAYCONTROL | (self.control |= CONTROL_TOGGLES[key])
173
196
  end
174
197
  end
175
-
198
+
176
199
  def left_to_right
177
- @mode |= LCD_ENTRYLEFT
178
- command(LCD_ENTRYMODESET | @mode)
200
+ self.entry_mode |= LCD_ENTRYLEFT
201
+ command(LCD_ENTRYMODESET | entry_mode)
179
202
  end
180
-
203
+
181
204
  def right_to_left
182
- @mode &= ~LCD_ENTRYLEFT
183
- command(LCD_ENTRYMODESET | @mode)
205
+ self.entry_mode &= ~LCD_ENTRYLEFT
206
+ command(LCD_ENTRYMODESET | entry_mode)
184
207
  end
185
-
208
+
186
209
  def scroll_left
187
210
  command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT)
188
211
  end
189
-
212
+
190
213
  def scroll_right
191
214
  command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT)
192
215
  end
193
-
216
+
194
217
  def autoscroll_on
195
- @mode |= LCD_ENTRYSHIFTINCREMENT;
196
- command(LCD_ENTRYMODESET | @mode);
218
+ self.entry_mode |= LCD_ENTRYSHIFTINCREMENT;
219
+ command(LCD_ENTRYMODESET | entry_mode);
197
220
  end
198
-
221
+
199
222
  def autoscroll_off
200
- @mode &= ~LCD_ENTRYSHIFTINCREMENT;
201
- command(LCD_ENTRYMODESET | @mode);
223
+ self.entry_mode &= ~LCD_ENTRYSHIFTINCREMENT;
224
+ command(LCD_ENTRYMODESET | entry_mode);
202
225
  end
203
-
226
+
204
227
  # Define custom characters as bitmaps.
205
228
  def create_char(location, bitmap)
206
229
  location &= 0x7
207
230
  command(LCD_SETCGRAMADDR | (location << 3))
208
231
  bitmap.each { |byte| write byte }
209
232
  end
210
-
233
+
211
234
  def command(byte)
212
235
  send(byte, board.low)
213
236
  end
214
-
237
+
215
238
  def write(byte)
216
239
  send(byte, board.high)
217
240
  end
@@ -219,38 +242,62 @@ module Denko
219
242
  def send(byte, rs_level)
220
243
  # RS pin goes low to send commands, high to send data.
221
244
  rs.write(rs_level) unless rs.state == rs_level
222
- rw.low if rw
223
-
245
+
224
246
  # Get the byte as a string of 0s and 1s, LSBFIRST.
225
247
  bits_from_byte = byte.to_s(2).rjust(8, "0").reverse
226
-
248
+
227
249
  # Write bits depending on connection.
228
- @bits == 8 ? write8(bits_from_byte) : write4(bits_from_byte)
250
+ data_lines == 8 ? write8(bits_from_byte) : write4(bits_from_byte)
229
251
  end
230
-
252
+
231
253
  def write4(bits)
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
- pulse_enable
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
- pulse_enable
254
+ if board.is_a_register?
255
+ board.bit_set(d4.pin, bits[4].to_i)
256
+ board.bit_set(d5.pin, bits[5].to_i)
257
+ board.bit_set(d6.pin, bits[6].to_i)
258
+ d7.write bits[7].to_i
259
+ pulse_enable
260
+ board.bit_set(d4.pin, bits[0].to_i)
261
+ board.bit_set(d5.pin, bits[1].to_i)
262
+ board.bit_set(d6.pin, bits[2].to_i)
263
+ d7.write bits[3].to_i
264
+ pulse_enable
265
+ else
266
+ d4.write bits[4].to_i
267
+ d5.write bits[5].to_i
268
+ d6.write bits[6].to_i
269
+ d7.write bits[7].to_i
270
+ pulse_enable
271
+ d4.write bits[0].to_i
272
+ d5.write bits[1].to_i
273
+ d6.write bits[2].to_i
274
+ d7.write bits[3].to_i
275
+ pulse_enable
276
+ end
242
277
  end
243
278
 
244
279
  def write8(bits)
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
- pulse_enable
280
+ if board.is_a_register?
281
+ board.bit_set(d0.pin, bits[0].to_i)
282
+ board.bit_set(d1.pin, bits[1].to_i)
283
+ board.bit_set(d2.pin, bits[2].to_i)
284
+ board.bit_set(d3.pin, bits[3].to_i)
285
+ board.bit_set(d4.pin, bits[4].to_i)
286
+ board.bit_set(d5.pin, bits[5].to_i)
287
+ board.bit_set(d6.pin, bits[6].to_i)
288
+ d7.write bits[7].to_i
289
+ pulse_enable
290
+ else
291
+ d0.write bits[0].to_i
292
+ d1.write bits[1].to_i
293
+ d2.write bits[2].to_i
294
+ d3.write bits[3].to_i
295
+ d4.write bits[4].to_i
296
+ d5.write bits[5].to_i
297
+ d6.write bits[6].to_i
298
+ d7.write bits[7].to_i
299
+ pulse_enable
300
+ end
254
301
  end
255
302
 
256
303
  def pulse_enable
@@ -0,0 +1,186 @@
1
+ module Denko
2
+ module Display
3
+ class IL0373
4
+ include SPIEPaperCommon
5
+ include Behaviors::Lifecycle
6
+
7
+ COLUMNS = 212
8
+ ROWS = 104
9
+
10
+ # Subset of used commands from datasheet:
11
+ PANEL_SETTING = 0x00
12
+ POWER_SETTING = 0x01
13
+ POWER_OFF = 0x02
14
+ POWER_OFF_SEQUENCE = 0x03
15
+ POWER_ON = 0x04
16
+ POWER_ON_MEASURE = 0x05
17
+ BOOSTER_SOFT_START = 0x06
18
+ DEEP_SLEEP = 0x07
19
+ DATA_START_1 = 0x10
20
+ DATA_STOP = 0x11
21
+ DISPLAY_REFRESH = 0x12
22
+ DATA_START_2 = 0x13
23
+ VCOM_DATA_SETTING = 0x50
24
+ RESOLUTION_SETTING = 0x61
25
+ PARTIAL_WINDOW = 0x90
26
+ PARTIAL_IN = 0x91
27
+ PARTIAL_OUT = 0x92
28
+
29
+ def set_power_setting
30
+ # Defaults from datasheet.
31
+ command [POWER_SETTING]
32
+ data [0x03, 0x00, 0x26, 0x26, 0x03]
33
+ end
34
+
35
+ def set_panel_setting
36
+ # NOT DEFAULTS
37
+ # From datasheet:
38
+ # Bits 7..6: Enable all source and gate channels
39
+ # Bit 5: 0 = LUT from OTP
40
+ # Bit 4: 0 = B/W/R mode, 1 = B/W mode
41
+ # Bit 3: 0 = Gate scan decrements (1 increments)
42
+ # Bit 2: 0 = Source scan decrements (1 increments)
43
+ # Bit 1: 1 = Enable booster
44
+ # Bit 0: 1 = Soft reset
45
+ value = 0b0000_0011
46
+
47
+ # Handle colors
48
+ value |= (1 << 4) if colors == 2
49
+
50
+ # Handle screen size
51
+ source_gate_bits = 0b11
52
+ source_gate_bits = 0b10 if (rows <= 128)
53
+ source_gate_bits = 0b01 if (rows <= 96) && (columns <= 252)
54
+ source_gate_bits = 0b00 if (rows <= 96) && (columns <= 230)
55
+ value |= source_gate_bits
56
+
57
+ # Handle hardware reflection/rotation
58
+ value |= (1 << 2) if @reflect_y
59
+ value |= (1 << 3) if @reflect_x
60
+
61
+ command [PANEL_SETTING]
62
+ data [value]
63
+ end
64
+
65
+ def reflect_x
66
+ @reflect_x = !@reflect_x
67
+ end
68
+
69
+ def reflect_y
70
+ @reflect_y = !@reflect_y
71
+ end
72
+
73
+ def rotate
74
+ @reflect_x = !@reflect_x
75
+ @reflect_y = !@reflect_y
76
+ end
77
+
78
+ def set_vcom_data_setting
79
+ # Default value from data sheet.
80
+ value = 0b0000_0111
81
+
82
+ # Datsheet may be wrong here. Bit 5 set seems to always invert DATA2, so Bit 4 does DATA1?
83
+ # In B/W mode: set bit 5 to avoid black channel inversion relative to Canvas.
84
+ # In B/W/R mode: set bit 4 to avoid black channel inversion relative to Canvas.
85
+ if (colors == 2)
86
+ value |= (1 << 4) unless @invert_black
87
+ else
88
+ value |= (1 << 5) unless @invert_black
89
+ end
90
+
91
+ command [VCOM_DATA_SETTING]
92
+ data [value]
93
+ end
94
+
95
+ def invert_black
96
+ @invert_black = !@invert_black
97
+ end
98
+
99
+ def set_resolution
100
+ command [RESOLUTION_SETTING]
101
+ data [
102
+ p_max+1 << 3,
103
+ (columns >> 8) & 0b1,
104
+ columns & 0xFF
105
+ ]
106
+ end
107
+
108
+ def booster_soft_start
109
+ # Defaults from datasheet.
110
+ command [BOOSTER_SOFT_START]
111
+ data [0x17, 0x17, 0x17]
112
+ end
113
+
114
+ def power_on
115
+ command [POWER_ON]
116
+ busy_wait
117
+ end
118
+
119
+ def wake
120
+ hw_reset
121
+ set_power_setting
122
+ set_panel_setting
123
+ set_vcom_data_setting
124
+ set_resolution
125
+ booster_soft_start
126
+ power_on
127
+ end
128
+
129
+ def deep_sleep
130
+ # Default from datasheet.
131
+ command [DEEP_SLEEP]
132
+ data [0xA5]
133
+ end
134
+
135
+ # Treat what the datasheet calls x as vertical (y, page), and vertical as horizontal (x).
136
+ def set_window(x_start=x_min, x_finish=x_max, p_start=p_min, p_finish=p_max)
137
+ command [PARTIAL_WINDOW]
138
+ data [
139
+ p_start << 3,
140
+ p_finish << 3,
141
+ (x_start >> 8) & 0b1,
142
+ x_start & 0xFF,
143
+ (x_finish >> 8) & 0b1,
144
+ x_finish & 0xFF,
145
+ 0b0
146
+ ]
147
+ command [PARTIAL_IN]
148
+ end
149
+
150
+ def draw(*args, **kwargs)
151
+ wake
152
+ super(*args, **kwargs)
153
+ end
154
+
155
+ def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
156
+ set_window(x_start, x_finish, p_start, p_finish)
157
+
158
+ if (colors == 2)
159
+ # In B/W/Red mode, red goes in DATA2, black in DATA1
160
+ (color == 2) ? command[DATA_START_2] : command[DATA_START_1]
161
+ else
162
+ # In B/W mode, always write to DATA2
163
+ command [DATA_START_2]
164
+ end
165
+
166
+ # Can't control address increment to go horizontally, always vertical.
167
+ # So get partial from the full buffer and reorder the bytes.
168
+ transformed_buffer = []
169
+ (x_start..x_finish).each do |x|
170
+ (p_start..p_finish).to_a.reverse.each do |page|
171
+ index = (page * columns) + x
172
+ transformed_buffer << buffer[index]
173
+ end
174
+ end
175
+ transformed_buffer.each_slice(transfer_limit) { |slice| data(slice) }
176
+
177
+ command [DATA_STOP]
178
+ end
179
+
180
+ def refresh
181
+ command [DISPLAY_REFRESH]
182
+ busy_wait
183
+ end
184
+ end
185
+ end
186
+ end