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
@@ -0,0 +1,193 @@
1
+ module Denko
2
+ module Display
3
+ module MonoOLED
4
+ include Behaviors::BusPeripheral
5
+ include Behaviors::Lifecycle
6
+
7
+ # I2C Defaults
8
+ I2C_ADDRESS = 0x3C
9
+ I2C_FREQUENCY = 400_000
10
+
11
+ # Fundamental Commands
12
+ # Single byte (no need to OR with anything)
13
+ PIXELS_FROM_RAM = 0xA4
14
+ PIXELS_ALL_ON = 0xA5
15
+ INVERT_OFF = 0xA6
16
+ INVERT_ON = 0xA7
17
+ DISPLAY_OFF = 0xAE
18
+ DISPLAY_ON = 0xAF
19
+
20
+ # Double byte (following byte sets value)
21
+ CONTRAST = 0x81
22
+ # Values: 0x00 to 0xFF. Default is 0x7F
23
+
24
+ # Scrolling commands ignored.
25
+
26
+ # Address Setting Commands
27
+ # Single byte. OR with value. These are for page addressing mode only.
28
+ COLUMN_START_LOWER = 0x00 # lower 4 bytes of column
29
+ COLUMN_START_UPPER = 0x10 # upper 4 bytes of column
30
+ PAGE_START = 0xB0 # page 0-7
31
+
32
+ # Double byte. Following byte sets value.
33
+ ADDRESSING_MODE = 0x20
34
+ # Values:
35
+ # 0x00 = horizontal (Pages auto-increment. Used for SSD1306)
36
+ # 0x01 = vertical
37
+ # 0x02 = page (Default. Page and column must be set each time. Needed on SH1106, SH1107)
38
+ ADDRESSING_MODE_DEFAULT = 0x00
39
+
40
+ # Triple byte. Following 2 bytes sets value. For H/V addressing modes only.
41
+ COLUMN_ADDRESS_RANGE = 0x21
42
+ PAGE_ADDRESS_RANGE = 0x22
43
+ # For both: first value = min column/row, second value = max column/row
44
+
45
+ # Hardware Configuration Commands
46
+ # Single byte. OR with value.
47
+ START_LINE = 0x40 # Value: lowest 6 bits set RAM start line (default 0b000000)
48
+ SEGMENT_REMAP = 0xA0 # Value: 0x00 = default, 0x01 = column draw order reversed (horizontal reflection)
49
+ COM_DIRECTION = 0xC0 # Value: 0x00 = default, 0x08 = row draw order reversed (vertical reflection)
50
+
51
+ # Double-byte commands. Following byte sets value.
52
+ CHARGE_PUMP = 0x8D # Value: 0x10 = disable/external, 0x14 = enable/internal
53
+ MULTIPLEX_RATIO = 0xA8 # Value: rows of display - 1
54
+ DISPLAY_OFFSET = 0xD3 # Value: lowest 5 bits. Vertically shifts COM by that amount.
55
+ COM_PIN_CONFIG = 0xDA
56
+ # 0x02 = sequential, left and right not swapped
57
+ # 0x12 = alternative, left and right not swapped (default)
58
+ # 0x22 = sequential, left and right sawpped
59
+ # 0x32 = alternative, left and right swapped
60
+
61
+ # Timing & Driving Commands
62
+ # Double-byte commands. Following byte sets value.
63
+ CLOCK = 0xD5 # Lowest 4 bits = divider. Upper 4 bits = oscillator frequency.
64
+ PRECHARGE_PERIOD = 0xD9 # Lowest 4 bits = phase 1. Upper 4 bits = phase 2. 0xF1 for internal charge pump. 0x22 for external.
65
+ VCOM_DESELECT_LEVEL = 0xDB # 0x00 = 0.65 x Vcc, 0x20 = x 0.77 * Vcc (default), 0x30 = 0.83 x Vcc
66
+
67
+ # Valid widths and heights for displays
68
+ WIDTHS = [64,96,128]
69
+ HEIGHTS = [16,32,48,64,128]
70
+
71
+ # Default to a 128x64 display.
72
+ COLUMNS = 128
73
+ ROWS = 64
74
+
75
+ # Decide whether this instance is I2C or SPI.
76
+ before_initialize do
77
+ bus = params[:bus] || params[:board]
78
+
79
+ if bus.class.ancestors.include?(Denko::I2C::BusCommon)
80
+ mutate_i2c
81
+ elsif bus.class.ancestors.include?(Denko::SPI::BusCommon)
82
+ mutate_spi
83
+ else
84
+ raise ArgumentError, "#{self.class} must be connected to either an I2C or SPI bus"
85
+ end
86
+ end
87
+
88
+ def mutate_i2c
89
+ singleton_class.class_eval do
90
+ include I2C::Peripheral
91
+ include PixelCommon
92
+
93
+ # Commands are I2C messages prefixed with 0x00.
94
+ def command(bytes)
95
+ i2c_write([0x00] + bytes)
96
+ end
97
+
98
+ # Data are I2C messages prefixed with 0x40.
99
+ def data(bytes)
100
+ i2c_write([0x40] + bytes)
101
+ end
102
+
103
+ # Data prefix always takes one byte, so subtract that.
104
+ def transfer_limit
105
+ @transfer_limit ||= bus.board.i2c_limit - 1
106
+ end
107
+ end
108
+ end
109
+
110
+ def mutate_spi
111
+ singleton_class.class_eval do
112
+ include SPICommon
113
+ end
114
+ end
115
+
116
+ after_initialize do
117
+ # Validate known sizes.
118
+ raise ArgumentError, "error in #{self.class} width: #{columns}. Must be in: #{WIDTHS.inspect}" unless WIDTHS.include?(columns)
119
+ raise ArgumentError, "error in #{self.class} height: #{rows}. Must be in: #{HEIGHTS.inspect}" unless HEIGHTS.include?(rows)
120
+
121
+ # Everything except 96x16 size uses clock 0x80.
122
+ clock = 0x80
123
+ clock = 0x60 if (columns == 96 && rows == 16)
124
+
125
+ # 128x32 and 96x16 sizes use com pin config 0x02
126
+ com_pin_config = 0x12
127
+ com_pin_config = 0x02 if (columns == 96 && rows == 16) || (columns == 128 && rows == 32)
128
+
129
+ # Defaul to no reflection or rotation.
130
+ @seg_remap = 0x00
131
+ @com_direction = 0x00
132
+
133
+ # Startup sequence. SPI needs 2 repeats for some reason.
134
+ startup_count = 1
135
+ startup_count = 2 if singleton_class.ancestors.include? Denko::SPI::Peripheral
136
+ startup_count.times do
137
+ command [
138
+ MULTIPLEX_RATIO, rows - 1,
139
+ DISPLAY_OFFSET, 0x00,
140
+ START_LINE | 0x00,
141
+ SEGMENT_REMAP | @seg_remap,
142
+ COM_DIRECTION | @com_direction,
143
+ COM_PIN_CONFIG, com_pin_config,
144
+ PIXELS_FROM_RAM,
145
+ INVERT_OFF,
146
+ CLOCK, clock,
147
+ VCOM_DESELECT_LEVEL, 0x20,
148
+ PRECHARGE_PERIOD, 0xF1, # Charge period for internal charge pump
149
+ CHARGE_PUMP, 0x14, # Internal charge pump
150
+ ADDRESSING_MODE, self.class::ADDRESSING_MODE_DEFAULT,
151
+ DISPLAY_ON
152
+ ]
153
+ end
154
+
155
+ draw
156
+ end
157
+
158
+ def off
159
+ command [DISPLAY_OFF]
160
+ end
161
+
162
+ def on
163
+ command [DISPLAY_ON]
164
+ end
165
+
166
+ def contrast=(value)
167
+ raise ArgumentError, "contrast must be in range 0..255" if (value < 0 || value > 255)
168
+ command [CONTRAST, value]
169
+ end
170
+
171
+ def reflect_x
172
+ # Swap @seg_remap to the other value and write it.
173
+ @seg_remap = (@seg_remap == 0x00) ? 0x01 : 0x00
174
+ command [SEGMENT_REMAP | @seg_remap]
175
+ end
176
+
177
+ def reflect_y
178
+ # Swap @com_direction to the other value and write it.
179
+ @com_direction = (@com_direction == 0x00) ? 0x08 : 0x00
180
+ command [COM_DIRECTION | @com_direction]
181
+ end
182
+
183
+ def rotate
184
+ reflect_x
185
+ reflect_y
186
+ end
187
+
188
+ def draw_partial(buffer, x_min, x_max, p_min, p_max)
189
+ raise NotImplementedError, "#draw_partial must be implemented for each class including MonoOLED"
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,154 @@
1
+ module Denko
2
+ module Display
3
+ class PCD8544
4
+ include Behaviors::Lifecycle
5
+ include SPICommon
6
+
7
+ COLUMNS = 84
8
+ ROWS = 48
9
+
10
+ FUNCTION_SET = 0b00100000
11
+ # OR these options into lowest 3 bits:
12
+ POWER_UP = 0b000
13
+ POWER_DOWN = 0b100
14
+ H_ADDRESSING = 0b00
15
+ V_ADDRESSING = 0b10
16
+ BASIC_INS_SET = 0b0
17
+ EXT_INS_SET = 0b1
18
+
19
+ #
20
+ # Basic Instruciton Set (H = 0)
21
+ #
22
+ DISPLAY_CONTROL_SET = 0b00001000
23
+ # OR these options into lowest 3 bits:
24
+ DISPLAY_BLANK = 0b000
25
+ DISPLAY_NORMAL = 0b100
26
+ DISPLAY_ALL_SEGS = 0b001
27
+ DISPLAY_INVERT = 0b101
28
+
29
+ RAM_Y_SET = 0b01000000 # OR Y value into lowest 3 bits
30
+ RAM_X_SET = 0b10000000 # OR X value into lowest 7 bits
31
+
32
+ #
33
+ # Extended Instruciton Set (H = 1)
34
+ #
35
+ TEMP_COEFF_SET = 0b00000100 # OR temperature coeff. into lowest 2 bits
36
+ BIAS_SET = 0b00010000 # OR bias system values into lowest 3 bits
37
+ VOP_SET = 0b10000000 # OR VOP values into lowest 7 bits
38
+
39
+ def power_up
40
+ @function_state = (function_state & 0b11111011) | POWER_UP
41
+ command [function_state]
42
+ end
43
+
44
+ def power_down
45
+ @function_state = (function_state & 0b11111011) | POWER_DOWN
46
+ command [function_state]
47
+ end
48
+
49
+ def basic_instruction_mode
50
+ @function_state = (function_state & 0b11111110) | BASIC_INS_SET
51
+ command [function_state]
52
+ end
53
+
54
+ def extended_instruction_mode
55
+ @function_state = (function_state & 0b11111110) | EXT_INS_SET
56
+ command [function_state]
57
+ end
58
+
59
+ def function_state
60
+ @function_state ||= FUNCTION_SET
61
+ end
62
+
63
+ VALID_VOPS = (0..127).to_a
64
+
65
+ def vop=(value)
66
+ raise ArgumentError, "invalid Vop: #{value}" unless VALID_VOPS.include?(value)
67
+ extended_instruction_mode
68
+ command [VOP_SET | value]
69
+ basic_instruction_mode
70
+ @vop = value
71
+ end
72
+
73
+ VALID_BIASES = (0..7).to_a
74
+
75
+ def bias=(value)
76
+ raise ArgumentError, "invalid bias: #{value}" unless VALID_BIASES.include?(value)
77
+ extended_instruction_mode
78
+ command [BIAS_SET | value]
79
+ basic_instruction_mode
80
+ @bias = value
81
+ end
82
+
83
+ VALID_TCOEFFS = (0..3).to_a
84
+
85
+ def temperature_coefficient=(value)
86
+ raise ArgumentError, "invalid temperature coefficient: #{value}" unless VALID_TCOEFFS.include?(value)
87
+ extended_instruction_mode
88
+ command [TEMP_COEFF_SET | value]
89
+ basic_instruction_mode
90
+ @temperature_coefficient = value
91
+ end
92
+
93
+ def vop
94
+ @vop ||= 0
95
+ end
96
+
97
+ def bias
98
+ @bias ||= 0
99
+ end
100
+
101
+ def temperature_coefficient
102
+ @temperature_coefficient ||= 0
103
+ end
104
+
105
+ def set_display_control(value)
106
+ command [DISPLAY_CONTROL_SET | value]
107
+ end
108
+
109
+ def blank
110
+ set_display_control(DISPLAY_BLANK)
111
+ end
112
+
113
+ def all_segments_on
114
+ set_display_control(DISPLAY_ALL_SEGS)
115
+ end
116
+
117
+ def invert
118
+ @inverted = !@inverted
119
+ value = @inverted ? DISPLAY_INVERT : DISPLAY_NORMAL
120
+ set_display_control(value)
121
+ end
122
+
123
+ after_initialize do
124
+ # Reset sequence.
125
+ reset.low if reset
126
+ sleep 0.001
127
+ reset.high if reset
128
+
129
+ self.vop = 56
130
+ self.bias = 4
131
+ set_display_control(DISPLAY_NORMAL)
132
+ self.temperature_coefficient = 0
133
+ end
134
+
135
+ def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
136
+ # Always use horizontal addressing mode.
137
+ basic_instruction_mode
138
+
139
+ (p_start..p_finish).each do |page|
140
+ # Set start page and column.
141
+ command [RAM_X_SET | x_start, RAM_Y_SET | page]
142
+
143
+ # Get needed bytes for this page only.
144
+ src_start = (columns * page) + x_start
145
+ src_end = (columns * page) + x_finish
146
+ partial_buffer = buffer[src_start..src_end]
147
+
148
+ # Send in chunks up to maximum transfer size.
149
+ partial_buffer.each_slice(transfer_limit) { |slice| data(slice) }
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,83 @@
1
+ module Denko
2
+ module Display
3
+ module PixelCommon
4
+ def columns
5
+ return @columns if @columns
6
+ @columns = self.class.const_get("COLUMNS") if self.class.const_defined?("COLUMNS")
7
+ @columns = params[:width] if params[:width]
8
+ @columns = params[:columns] if params[:columns]
9
+ @columns
10
+ end
11
+ alias :cols :columns
12
+
13
+ def rows
14
+ return @rows if @rows
15
+ @rows = self.class.const_get("ROWS") if self.class.const_defined?("ROWS")
16
+ @rows = params[:height] if params[:height]
17
+ @rows = params[:rows] if params[:rows]
18
+ @rows
19
+ end
20
+
21
+ def x_min
22
+ @x_min ||= 0
23
+ end
24
+
25
+ def x_max
26
+ @x_max ||= columns - 1
27
+ end
28
+
29
+ def y_min
30
+ @y_min ||= 0
31
+ end
32
+
33
+ def y_max
34
+ @y_max ||= rows - 1
35
+ end
36
+
37
+ def p_min
38
+ @p_min ||= 0
39
+ end
40
+
41
+ def p_max
42
+ @p_max ||= (rows / 8.0).ceil - 1
43
+ end
44
+
45
+ def colors
46
+ @colors ||= params[:colors] || 1
47
+ end
48
+
49
+ def canvas
50
+ @canvas ||= Canvas.new(columns, rows, colors: colors)
51
+ end
52
+
53
+ def refresh
54
+ end
55
+
56
+ def get_partial_buffer(buffer, x_start, x_finish, p_start, p_finish)
57
+ # If bounds == max bounds, just return the buffer.
58
+ return buffer if (x_start == x_min) && (x_finish == x_max) && (p_start == p_min) && (p_finish == p_max)
59
+
60
+ # Copy bytes for the given rectangle into a temp buffer.
61
+ temp_buffer = []
62
+ (p_start..p_finish).each do |page|
63
+ src_start = (columns * page) + x_start
64
+ src_end = (columns * page) + x_finish
65
+ temp_buffer += buffer[src_start..src_end]
66
+ end
67
+ temp_buffer
68
+ end
69
+
70
+ def draw(x_start=x_min, x_finish=x_max, y_start=y_min, y_finish=y_max)
71
+ # Convert y-coords to page coords.
72
+ p_start = y_start / 8
73
+ p_finish = y_finish / 8
74
+
75
+ colors.times do |i|
76
+ draw_partial(canvas.framebuffers[i], x_start, x_finish, p_start, p_finish, i+1)
77
+ end
78
+
79
+ refresh
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,38 @@
1
+ module Denko
2
+ module Display
3
+ class SH1106
4
+ include MonoOLED
5
+ #
6
+ # SH1106/SH1107 only support page addressing mode.
7
+ # Can't send all data as sequential pages and let page index auto-increment,
8
+ # like with horizontal addressing on the SSD1306.
9
+ #
10
+ ADDRESSING_MODE_DEFAULT = 0x02
11
+ RAM_X_OFFSET = 2
12
+ #
13
+ # SH1106 has RAM for 132 columns, but only 128 pixels, so offset by 2 to center.
14
+ def ram_x_offset
15
+ @ram_x_offset ||= self.class.const_get("RAM_X_OFFSET")
16
+ end
17
+
18
+ def draw_partial(buffer, x_start, x_finish, p_start, p_finish, color=1)
19
+ x = x_start + ram_x_offset
20
+ x_lower = (x & 0b00001111)
21
+ x_upper = (x & 0b11110000) >> 4
22
+
23
+ (p_start..p_finish).each do |page|
24
+ # Set the page and column to start writing at.
25
+ command [PAGE_START | page, COLUMN_START_LOWER | x_lower, COLUMN_START_UPPER | x_upper]
26
+
27
+ # Get needed bytes for this page only.
28
+ src_start = (columns * page) + x_start
29
+ src_end = (columns * page) + x_finish
30
+ partial_buffer = buffer[src_start..src_end]
31
+
32
+ # Send in chunks up to maximum transfer size.
33
+ partial_buffer.each_slice(transfer_limit) { |slice| data(slice) }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,10 @@
1
+ module Denko
2
+ module Display
3
+ class SH1107 < SH1106
4
+ COLUMNS = 128
5
+ ROWS = 128
6
+ # SH1107 RAM has 128 columns, unlike 132 on SH1106. Don't offset by 2.
7
+ RAM_X_OFFSET = 0
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ module Denko
2
+ module Display
3
+ module SPICommon
4
+ include SPI::Peripheral
5
+ include PixelCommon
6
+
7
+ #
8
+ # SPI displays use a D/C pin to toggle whether bytes being sent are data or commands.
9
+ # Most also have a RESET pin which is pulsed low to initalize, then held high.
10
+ #
11
+ def initialize_pins(options={})
12
+ super(options)
13
+ proxy_pin :dc, DigitalIO::Output
14
+ proxy_pin :reset, DigitalIO::Output, optional: true
15
+ reset.high if reset
16
+ end
17
+
18
+ # Commands are SPI bytes written while DC pin is low.
19
+ def command(bytes)
20
+ dc.low
21
+ spi_write(bytes)
22
+ end
23
+
24
+ # Display data are SPI SPI bytes written while DC pin is high.
25
+ def data(bytes)
26
+ dc.high
27
+ spi_write(bytes)
28
+ end
29
+
30
+ def transfer_limit
31
+ @transfer_limit ||= bus.board.spi_limit
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ module Denko
2
+ module Display
3
+ module SPIEPaperCommon
4
+ include SPICommon
5
+
6
+ # Defaults. Override in subclasses as needed.
7
+ BUSY_WAIT_TIME = 0.005
8
+ RESET_TIME = 0.010
9
+
10
+ def initialize_pins(options={})
11
+ super(options)
12
+ proxy_pin :busy, DigitalIO::Input, board: bus.board
13
+ busy.stop
14
+ end
15
+
16
+ def busy_wait
17
+ # #read is more compatible than #listen
18
+ sleep self.class::BUSY_WAIT_TIME while busy.read == 1
19
+ end
20
+
21
+ def hw_reset
22
+ if reset
23
+ reset.low
24
+ sleep self.class::RESET_TIME
25
+ reset.high
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end