denko 0.13.0 → 0.13.2

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 (218) 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 +2 -4
  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 +60 -0
  11. data/DEPS_CLI.md +8 -6
  12. data/DEPS_IDE.md +9 -7
  13. data/HARDWARE.md +98 -75
  14. data/README.md +48 -59
  15. data/benchmarks/i2c_ssd1306_refresh.rb +74 -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/examples/pulse_io/buzzer.rb +40 -0
  24. data/examples/sensor/aht20.rb +1 -1
  25. data/lib/denko/analog_io/ads1115.rb +61 -0
  26. data/lib/denko/analog_io/ads1118.rb +10 -120
  27. data/lib/denko/analog_io/ads111x.rb +123 -0
  28. data/lib/denko/analog_io/output.rb +2 -1
  29. data/lib/denko/analog_io.rb +2 -0
  30. data/lib/denko/behaviors/bus_peripheral_addressed.rb +1 -1
  31. data/lib/denko/behaviors/component.rb +1 -1
  32. data/lib/denko/behaviors/input_pin.rb +3 -0
  33. data/lib/denko/behaviors/reader.rb +14 -13
  34. data/lib/denko/behaviors/single_pin.rb +1 -3
  35. data/lib/denko/behaviors/state.rb +1 -0
  36. data/lib/denko/behaviors/subcomponents.rb +2 -2
  37. data/lib/denko/board/core.rb +1 -1
  38. data/lib/denko/board/i2c.rb +1 -4
  39. data/lib/denko/board/map.rb +9 -0
  40. data/lib/denko/board/servo.rb +2 -6
  41. data/lib/denko/board.rb +32 -20
  42. data/lib/denko/connection/board_uart.rb +3 -3
  43. data/lib/denko/connection/flow_control.rb +10 -2
  44. data/lib/denko/digital_io/output.rb +1 -1
  45. data/lib/denko/display/hd44780.rb +18 -18
  46. data/lib/denko/led/seven_segment.rb +18 -19
  47. data/lib/denko/message.rb +6 -14
  48. data/lib/denko/one_wire/bus.rb +1 -1
  49. data/lib/denko/one_wire/{bus_enumeration.rb → bus_enumerator.rb} +16 -8
  50. data/lib/denko/one_wire/helper.rb +1 -1
  51. data/lib/denko/one_wire.rb +1 -1
  52. data/lib/denko/pulse_io/ir_transmitter.rb +1 -2
  53. data/lib/denko/sensor/ds18b20.rb +1 -1
  54. data/lib/denko/version.rb +1 -1
  55. data/lib/denko_cli/packages.rb +7 -1
  56. data/lib/denko_cli/targets.rb +8 -5
  57. data/lib/denko_cli/usage.txt +8 -4
  58. data/src/denko_ethernet.ino +15 -23
  59. data/src/denko_serial.ino +3 -14
  60. data/src/denko_wifi.ino +35 -50
  61. data/src/lib/Denko.cpp +23 -6
  62. data/src/lib/Denko.h +6 -16
  63. data/src/lib/DenkoCoreIO.cpp +3 -3
  64. data/src/lib/DenkoDefines.h +62 -16
  65. data/src/lib/DenkoEEPROM.cpp +9 -1
  66. data/src/lib/DenkoI2C.cpp +11 -9
  67. data/src/lib/DenkoLEDArray.cpp +1 -1
  68. data/target.yml +35 -1
  69. data/test/behaviors/reader_test.rb +8 -1
  70. data/test/board/helper_test.rb +0 -4
  71. data/test/display/hd44780_test.rb +10 -0
  72. data/test/led/seven_segment_test.rb +30 -8
  73. data/test/one_wire/bus_enumerator_test.rb +4 -0
  74. data/test/one_wire/helper_test.rb +5 -5
  75. data/test/sensor/ds18b20_test.rb +10 -0
  76. data/test/test_helper.rb +17 -2
  77. data/vendor/board-maps/.gitmodules +3 -0
  78. data/vendor/board-maps/BoardMap.h +40 -12
  79. data/vendor/board-maps/README.md +1 -0
  80. data/vendor/board-maps/lib/header_parser.rb +30 -5
  81. data/vendor/board-maps/run.rb +11 -1
  82. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3.yml +6 -1
  83. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_NOPSRAM.yml +6 -1
  84. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +5 -1
  85. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +20 -0
  86. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +2 -1
  87. data/vendor/board-maps/yaml/ARTRONSHOP_RP2_NANO.yml +32 -0
  88. data/vendor/board-maps/yaml/AVR_CIRCUITPLAY.yml +1 -1
  89. data/vendor/board-maps/yaml/AVR_ESPLORA.yml +1 -1
  90. data/vendor/board-maps/yaml/AVR_INDUSTRIAL101.yml +1 -1
  91. data/vendor/board-maps/yaml/AVR_LEONARDO.yml +1 -1
  92. data/vendor/board-maps/yaml/AVR_LEONARDO_ETH.yml +1 -1
  93. data/vendor/board-maps/yaml/AVR_LILYPAD_USB.yml +1 -1
  94. data/vendor/board-maps/yaml/AVR_LININO_ONE.yml +1 -1
  95. data/vendor/board-maps/yaml/AVR_MICRO.yml +1 -1
  96. data/vendor/board-maps/yaml/AVR_ROBOT_CONTROL.yml +1 -1
  97. data/vendor/board-maps/yaml/AVR_ROBOT_MOTOR.yml +1 -1
  98. data/vendor/board-maps/yaml/AVR_YUN.yml +1 -1
  99. data/vendor/board-maps/yaml/AVR_YUNMINI.yml +1 -1
  100. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +11 -1
  101. data/vendor/board-maps/yaml/BeeMotionS3.yml +6 -1
  102. data/vendor/board-maps/yaml/Bee_Motion.yml +3 -0
  103. data/vendor/board-maps/yaml/Bee_S3.yml +1 -1
  104. data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI6_BLE_RP2040.yml +42 -0
  105. data/vendor/board-maps/yaml/CYTRON_MAKER_FEATHER_AIOT_S3.yml +4 -1
  106. data/vendor/board-maps/yaml/CoreESP32.yml +5 -1
  107. data/vendor/board-maps/yaml/D1_MINI32.yml +10 -1
  108. data/vendor/board-maps/yaml/DENKY.yml +10 -1
  109. data/vendor/board-maps/yaml/DENKY_PICOV3.yml +10 -1
  110. data/vendor/board-maps/yaml/DENKY_WROOM32.yml +10 -1
  111. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32E.yml +6 -1
  112. data/vendor/board-maps/yaml/DPU_ESP32.yml +10 -1
  113. data/vendor/board-maps/yaml/D_Duino_32.yml +9 -1
  114. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +11 -1
  115. data/vendor/board-maps/yaml/ESP32S2_THING_PLUS.yml +11 -1
  116. data/vendor/board-maps/yaml/ESP32S2_USB.yml +11 -1
  117. data/vendor/board-maps/yaml/ESP32_DEV.yml +10 -1
  118. data/vendor/board-maps/yaml/ESP32_DEVKIT_LIPO.yml +10 -1
  119. data/vendor/board-maps/yaml/ESP32_IOT_REDBOARD.yml +10 -1
  120. data/vendor/board-maps/yaml/ESP32_PICO.yml +10 -1
  121. data/vendor/board-maps/yaml/ESP32_S3_BOX.yml +4 -1
  122. data/vendor/board-maps/yaml/ESP32_THING.yml +10 -1
  123. data/vendor/board-maps/yaml/ESP32_THING_PLUS.yml +4 -1
  124. data/vendor/board-maps/yaml/ESP32_THING_PLUS_C.yml +4 -1
  125. data/vendor/board-maps/yaml/ESP32_WROOM_DA.yml +10 -1
  126. data/vendor/board-maps/yaml/ESP32_WROVER_KIT.yml +10 -1
  127. data/vendor/board-maps/yaml/ESPECTRO32.yml +10 -1
  128. data/vendor/board-maps/yaml/ESPea32.yml +10 -1
  129. data/vendor/board-maps/yaml/ESPino32.yml +10 -1
  130. data/vendor/board-maps/yaml/FEATHERS2.yml +11 -1
  131. data/vendor/board-maps/yaml/FEATHERS2NEO.yml +2 -1
  132. data/vendor/board-maps/yaml/FEATHERS3.yml +3 -0
  133. data/vendor/board-maps/yaml/FEATHER_ESP32.yml +5 -1
  134. data/vendor/board-maps/yaml/FRANZININHO_WIFI.yml +11 -1
  135. data/vendor/board-maps/yaml/FRANZININHO_WIFI_MSC.yml +11 -1
  136. data/vendor/board-maps/yaml/FROG_ESP32.yml +10 -1
  137. data/vendor/board-maps/yaml/HEALTHYPI_4.yml +10 -1
  138. data/vendor/board-maps/yaml/HONEYLEMON.yml +10 -1
  139. data/vendor/board-maps/yaml/HORNBILL_ESP32_DEV.yml +10 -1
  140. data/vendor/board-maps/yaml/HORNBILL_ESP32_MINIMA.yml +4 -1
  141. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +5 -1
  142. data/vendor/board-maps/yaml/LILYGO_T_DISPLAY_S3.yml +7 -1
  143. data/vendor/board-maps/yaml/LOLIN32.yml +10 -1
  144. data/vendor/board-maps/yaml/LOLIN32_LITE.yml +10 -1
  145. data/vendor/board-maps/yaml/LOLIN_D32.yml +10 -1
  146. data/vendor/board-maps/yaml/LOLIN_D32_PRO.yml +10 -1
  147. data/vendor/board-maps/yaml/LOLIN_S2_MINI.yml +11 -1
  148. data/vendor/board-maps/yaml/LOLIN_S2_PICO.yml +11 -1
  149. data/vendor/board-maps/yaml/LOLIN_S3.yml +9 -1
  150. data/vendor/board-maps/yaml/LOLIN_S3_MINI.yml +9 -1
  151. data/vendor/board-maps/yaml/LOLIN_S3_PRO.yml +9 -1
  152. data/vendor/board-maps/yaml/LoPy.yml +11 -1
  153. data/vendor/board-maps/yaml/LoPy4.yml +11 -1
  154. data/vendor/board-maps/yaml/MAGTAG29_ESP32S2.yml +11 -1
  155. data/vendor/board-maps/yaml/METRO_ESP32S2.yml +11 -1
  156. data/vendor/board-maps/yaml/MGBOT_IOTIK32A.yml +10 -1
  157. data/vendor/board-maps/yaml/MGBOT_IOTIK32B.yml +10 -1
  158. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32DEVKIT.yml +10 -1
  159. data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32MINIKIT.yml +10 -1
  160. data/vendor/board-maps/yaml/MICROS2.yml +11 -1
  161. data/vendor/board-maps/yaml/MINIMA.yml +15 -0
  162. data/vendor/board-maps/yaml/NANO32.yml +10 -1
  163. data/vendor/board-maps/yaml/Node32s.yml +10 -1
  164. data/vendor/board-maps/yaml/NodeMCU_32S.yml +10 -1
  165. data/vendor/board-maps/yaml/ONEHORSE_ESP32_DEV.yml +11 -1
  166. data/vendor/board-maps/yaml/PIMORONI_PLASMA2040.yml +29 -0
  167. data/vendor/board-maps/yaml/PORTENTA_C33.yml +28 -0
  168. data/vendor/board-maps/yaml/PROS3.yml +6 -1
  169. data/vendor/board-maps/yaml/PYCOM_GPY.yml +11 -1
  170. data/vendor/board-maps/yaml/Piranha.yml +7 -1
  171. data/vendor/board-maps/yaml/Pocket32.yml +10 -1
  172. data/vendor/board-maps/yaml/QUANTUM.yml +10 -1
  173. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +11 -1
  174. data/vendor/board-maps/yaml/RMP.yml +11 -1
  175. data/vendor/board-maps/yaml/SAMD_CIRCUITPLAYGROUND_EXPRESS.yml +0 -1
  176. data/vendor/board-maps/yaml/SAM_DUE.yml +3 -1
  177. data/vendor/board-maps/yaml/SONOFF_DUALR3.yml +10 -1
  178. data/vendor/board-maps/yaml/TAMC_TERMOD_S3.yml +11 -1
  179. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1262.yml +6 -1
  180. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1268.yml +6 -1
  181. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1276.yml +6 -1
  182. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1278.yml +6 -1
  183. data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1280.yml +6 -1
  184. data/vendor/board-maps/yaml/TBeam.yml +6 -1
  185. data/vendor/board-maps/yaml/TINYPICO.yml +10 -1
  186. data/vendor/board-maps/yaml/TINYS2.yml +11 -1
  187. data/vendor/board-maps/yaml/TTGO_LoRa32_V1.yml +11 -1
  188. data/vendor/board-maps/yaml/TTGO_LoRa32_V2.yml +11 -1
  189. data/vendor/board-maps/yaml/TTGO_LoRa32_v21new.yml +11 -1
  190. data/vendor/board-maps/yaml/TTGO_T1.yml +10 -1
  191. data/vendor/board-maps/yaml/TTGO_T7_V13_Mini32.yml +10 -1
  192. data/vendor/board-maps/yaml/TTGO_T7_V14_Mini32.yml +10 -1
  193. data/vendor/board-maps/yaml/TWATCH_2020_V1.yml +0 -1
  194. data/vendor/board-maps/yaml/TWATCH_2020_V2.yml +0 -1
  195. data/vendor/board-maps/yaml/TWATCH_2020_V3.yml +0 -1
  196. data/vendor/board-maps/yaml/TWATCH_BASE.yml +0 -1
  197. data/vendor/board-maps/yaml/TWatch.yml +0 -1
  198. data/vendor/board-maps/yaml/UBLOX_NINA_W10.yml +10 -1
  199. data/vendor/board-maps/yaml/UNOWIFIR4.yml +17 -0
  200. data/vendor/board-maps/yaml/WIPY3.yml +11 -1
  201. data/vendor/board-maps/yaml/XIAO_ESP32S3.yml +2 -1
  202. data/vendor/board-maps/yaml/connaxio_espoir.yml +7 -1
  203. data/vendor/board-maps/yaml/esp32vn_iot_uno.yml +10 -1
  204. data/vendor/board-maps/yaml/heltec_wifi_32_lora_V3.yml +11 -1
  205. data/vendor/board-maps/yaml/heltec_wifi_kit_32.yml +11 -1
  206. data/vendor/board-maps/yaml/heltec_wifi_kit_32_V3.yml +11 -1
  207. data/vendor/board-maps/yaml/heltec_wifi_lora_32.yml +10 -1
  208. data/vendor/board-maps/yaml/heltec_wifi_lora_32_V2.yml +10 -1
  209. data/vendor/board-maps/yaml/heltec_wireless_stick.yml +10 -1
  210. data/vendor/board-maps/yaml/heltec_wireless_stick_LITE.yml +10 -1
  211. data/vendor/board-maps/yaml/openkb.yml +11 -1
  212. data/vendor/board-maps/yaml/roboheart_hercules.yml +10 -1
  213. data/vendor/board-maps/yaml/sensesiot_weizen.yml +10 -1
  214. data/vendor/board-maps/yaml/uPesy_WROOM.yml +10 -1
  215. data/vendor/board-maps/yaml/uPesy_WROVER.yml +10 -1
  216. data/vendor/board-maps/yaml/unphone8.yml +11 -1
  217. data/vendor/board-maps/yaml/unphone9.yml +11 -1
  218. metadata +15 -3
@@ -1,8 +1,10 @@
1
1
 
2
2
  Usage:
3
+
3
4
  denko task [options]
4
5
 
5
6
  Tasks:
7
+
6
8
  sketch SKETCH [options]
7
9
  help
8
10
  targets
@@ -12,23 +14,25 @@
12
14
  --target TARGET (default: mega. Run 'denko targets' for more info)
13
15
  --debug (default: off)
14
16
 
15
- Available sketches and sketch for each sketch:
17
+ Available sketches and options specific to each sketch:
16
18
 
17
19
  serial
18
- --baud BAUD (default: 115200)
20
+ --baud BAUD (default: 115200)
19
21
 
20
22
  ethernet
21
23
  --mac XX:XX:XX:XX:XX:XX (required)
22
24
  --ip XXX.XXX.XXX.XXX (required, no DHCP)
23
25
  --port PORT (default: 3466)
26
+ --baud BAUD (default: 115200, serial fallback)
24
27
 
25
28
  wifi
26
29
  --ssid SSID (required)
27
30
  --password PASSWORD (required)
28
31
  --port PORT (default: 3466)
32
+ --baud BAUD (default: 115200, serial fallback)
29
33
 
30
34
  Examples:
31
35
 
32
36
  denko sketch ethernet --mac 12:34:56:78:90:12 --ip 192.168.1.2
33
- denko sketch serial --baud 57600
34
- denko sketch serial --baud 9600 -target core
37
+ denko sketch serial --baud 57600 --target esp32
38
+ denko sketch serial --baud 9600 --target core
@@ -2,17 +2,6 @@
2
2
  #include <SPI.h>
3
3
  #include <Ethernet.h>
4
4
 
5
- // Define 'serial' as the serial interface to use.
6
- // Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
7
- // On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
8
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
9
- #define serial SerialUSB
10
- // Use this for Programming USB port (right) on Due and Zero.
11
- // #define serial Serial
12
- #else
13
- #define serial Serial
14
- #endif
15
-
16
5
  // Configure your MAC address, IP address, and HTTP port here.
17
6
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32 };
18
7
  IPAddress ip(192,168,0,77);
@@ -31,8 +20,8 @@ void printEthernetStatus() {
31
20
 
32
21
  void setup() {
33
22
  // Wait for serial ready.
34
- serial.begin(115200);
35
- while(!serial);
23
+ DENKO_SERIAL_IF.begin(115200);
24
+ while(!DENKO_SERIAL_IF);
36
25
 
37
26
  // Explicitly disable the SD card.
38
27
  pinMode(4,OUTPUT);
@@ -41,9 +30,7 @@ void setup() {
41
30
  // Start up the network connection and server.
42
31
  Ethernet.begin(mac, ip);
43
32
  server.begin();
44
- #ifdef debug
45
- printEthernetStatus();
46
- #endif
33
+ printEthernetStatus();
47
34
 
48
35
  // Add listener callbacks for local logic.
49
36
  denko.digitalListenCallback = onDigitalListen;
@@ -51,20 +38,25 @@ void setup() {
51
38
  }
52
39
 
53
40
  void loop() {
41
+ // End connection if client disconnects.
42
+ if (client && !client.connected()) {
43
+ client.stop();
44
+ }
45
+
54
46
  // Allow one client at a time to be connected. Set it as the denko IO stream.
55
47
  if (!client){
56
48
  client = server.available();
57
- if (client) denko.stream = &client;
49
+ if (client) {
50
+ // TCP Client
51
+ denko.stream = &client;
52
+ } else {
53
+ // Serial fallback
54
+ denko.stream = &DENKO_SERIAL_IF;
55
+ }
58
56
  }
59
57
 
60
58
  // Main loop of the denko library.
61
59
  denko.run();
62
-
63
- // End the connection when client disconnects and revert to serial IO.
64
- if (client && !client.connected()){
65
- client.stop();
66
- denko.stream = &serial;
67
- }
68
60
  }
69
61
 
70
62
  // This runs every time a digital pin that denko is listening to changes value.
data/src/denko_serial.ino CHANGED
@@ -2,24 +2,13 @@
2
2
 
3
3
  Denko denko;
4
4
 
5
- // Define 'serial' as the serial interface to use.
6
- // Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
7
- // On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
8
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
9
- #define serial SerialUSB
10
- // Use this for Programming USB port (right) on Due and Zero.
11
- // #define serial Serial
12
- #else
13
- #define serial Serial
14
- #endif
15
-
16
5
  void setup() {
17
6
  // Wait for serial ready.
18
- serial.begin(115200);
19
- while(!serial);
7
+ DENKO_SERIAL_IF.begin(115200);
8
+ while(!DENKO_SERIAL_IF);
20
9
 
21
10
  // Pass serial stream to denko so it can read/write.
22
- denko.stream = &serial;
11
+ denko.stream = &DENKO_SERIAL_IF;
23
12
 
24
13
  // Add listener callbacks for local logic.
25
14
  denko.digitalListenCallback = onDigitalListen;
data/src/denko_wifi.ino CHANGED
@@ -17,18 +17,6 @@
17
17
  #define WIFI_STATUS_LED 13
18
18
  #endif
19
19
 
20
-
21
- // Define 'serial' as the serial interface to use.
22
- // Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
23
- // On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
24
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
25
- #define serial SerialUSB
26
- // Use this for Programming USB port (right) on Due and Zero.
27
- // #define serial Serial
28
- #else
29
- #define serial Serial
30
- #endif
31
-
32
20
  // Configure your WiFi options here. IP address is not configurable. Uses DHCP.
33
21
  int port = 3466;
34
22
  char* ssid = "yourNetwork";
@@ -50,16 +38,16 @@ void indicateWiFi(byte value) {
50
38
  }
51
39
 
52
40
  void printWifiStatus() {
53
- serial.println("WiFi Connected");
54
- serial.print("SSID: ");
55
- serial.println(WiFi.SSID());
56
- serial.print("Signal Strength (RSSI):");
57
- serial.print(WiFi.RSSI());
58
- serial.println(" dBm");
59
- serial.print("IP Address: ");
60
- serial.println(WiFi.localIP());
61
- serial.print("Denko TCP Port: ");
62
- serial.println(port);
41
+ DENKO_SERIAL_IF.println("WiFi Connected");
42
+ DENKO_SERIAL_IF.print("SSID: ");
43
+ DENKO_SERIAL_IF.println(WiFi.SSID());
44
+ DENKO_SERIAL_IF.print("Signal Strength (RSSI):");
45
+ DENKO_SERIAL_IF.print(WiFi.RSSI());
46
+ DENKO_SERIAL_IF.println(" dBm");
47
+ DENKO_SERIAL_IF.print("IP Address: ");
48
+ DENKO_SERIAL_IF.println(WiFi.localIP());
49
+ DENKO_SERIAL_IF.print("Denko TCP Port: ");
50
+ DENKO_SERIAL_IF.println(port);
63
51
  indicateWiFi(true);
64
52
  }
65
53
 
@@ -70,37 +58,29 @@ void connect(){
70
58
  #endif
71
59
 
72
60
  // Try to connect.
73
- serial.print("Connecting to WiFi ");
61
+ DENKO_SERIAL_IF.print("Connecting to WiFi ");
74
62
  WiFi.begin(ssid, pass);
75
63
 
76
64
  // Delay until connected.
77
65
  while (WiFi.status() != WL_CONNECTED) {
78
66
  delay(500);
79
- serial.print(".");
67
+ DENKO_SERIAL_IF.print(".");
80
68
  }
81
69
  connected = true;
70
+ printWifiStatus();
82
71
  }
83
72
 
84
73
  void maintainWiFi(){
85
- if (connected == true){
86
- if (WiFi.status() == WL_CONNECTED) return;
74
+ if (WiFi.status() != WL_CONNECTED) {
87
75
  connected = false;
88
76
  connect();
89
77
  }
90
- if (connected == false){
91
- if (WiFi.status() != WL_CONNECTED) {
92
- connect();
93
- return;
94
- }
95
- connected = true;
96
- printWifiStatus();
97
- }
98
78
  }
99
79
 
100
80
  void setup() {
101
81
  // Wait for serial ready.
102
- serial.begin(115200);
103
- while(!serial);
82
+ DENKO_SERIAL_IF.begin(115200);
83
+ while(!DENKO_SERIAL_IF);
104
84
 
105
85
  // Enable over the air updates on the ESP8266.
106
86
  #if defined(ESP8266)
@@ -117,33 +97,38 @@ void setup() {
117
97
  denko.digitalListenCallback = onDigitalListen;
118
98
  denko.analogListenCallback = onAnalogListen;
119
99
 
120
- // Use serial as the denko IO stream until we get a TCP connection.
121
- denko.stream = &serial;
100
+ // Use DENKO_SERIAL_IF as the denko IO stream until we get a TCP connection.
101
+ denko.stream = &DENKO_SERIAL_IF;
122
102
  }
123
103
 
124
104
  void loop() {
125
105
  // Reconnect if we've lost WiFi.
126
106
  maintainWiFi();
127
107
 
108
+ // Handle OTA updates.
109
+ #if defined(ESP8266)
110
+ ArduinoOTA.handle();
111
+ #endif
112
+
113
+ // End connection if client disconnects.
114
+ if (client && !client.connected()) {
115
+ client.stop();
116
+ }
117
+
128
118
  // Allow one client at a time to be connected. Set it as the denko IO stream.
129
119
  if (!client){
130
120
  client = server.available();
131
- if (client) denko.stream = &client;
121
+ if (client) {
122
+ // TCP Client
123
+ denko.stream = &client;
124
+ } else {
125
+ // Serial fallback
126
+ denko.stream = &DENKO_SERIAL_IF;
127
+ }
132
128
  }
133
129
 
134
130
  // Main loop of the denko library.
135
131
  denko.run();
136
-
137
- // End the connection when client disconnects and revert to serial IO.
138
- if (client && !client.connected()){
139
- client.stop();
140
- denko.stream = &serial;
141
- }
142
-
143
- // Handle OTA updates.
144
- #if defined(ESP8266)
145
- ArduinoOTA.handle();
146
- #endif
147
132
  }
148
133
 
149
134
  // This runs every time a digital pin that denko is listening to changes value.
data/src/lib/Denko.cpp CHANGED
@@ -36,7 +36,7 @@ void Denko::run(){
36
36
  parse(stream->read());
37
37
  rxBytes ++;
38
38
  // Acknowledge when we've received half as many bytes as the serial buffer.
39
- if (rxBytes >= rxNotifyLimit) rxNotify();
39
+ if (rxBytes >= DENKO_RX_ACK_INTERVAL) rxNotify();
40
40
  }
41
41
 
42
42
  #ifdef DENKO_UARTS
@@ -113,7 +113,7 @@ void Denko::process() {
113
113
  case 6: setListener (pin, val, auxMsg[0], auxMsg[1], false); break;
114
114
 
115
115
  // Implemented in DenkoEEPROM.cpp
116
- #ifdef EEPROM_PRESENT
116
+ #ifdef DENKO_EEPROM
117
117
  case 7: eepromRead (); break;
118
118
  case 8: eepromWrite (); break;
119
119
  #endif
@@ -198,6 +198,7 @@ void Denko::process() {
198
198
  case 90: handshake (); break;
199
199
  case 91: resetState (); break;
200
200
  case 92: sendReady (); break;
201
+ case 93: enumerate (); break;
201
202
  case 95: setRegisterDivider (); break;
202
203
  case 96: setAnalogWriteResolution (); break;
203
204
  case 97: setAnalogReadResolution (); break;
@@ -262,19 +263,27 @@ void Denko::handshake() {
262
263
  #ifdef DENKO_VERSION
263
264
  stream->print(DENKO_VERSION);
264
265
  #endif
266
+
267
+ // Third is serial buffer size.
268
+ stream->print(',');
269
+ stream->print(DENKO_SERIAL_BUFFER_SIZE);
265
270
 
266
- // Third is AUX_SIZE.
271
+ // Fourth is AUX_SIZE.
267
272
  stream->print(',');
268
273
  stream->print(AUX_SIZE);
269
274
 
270
- // Fourth is EEPROM size in bytes. None on Due or Zero.
275
+ // Fifth is EEPROM size. None on Due or Zero.
271
276
  stream->print(',');
272
277
  #if defined(EEPROM_EMULATED)
273
278
  stream->print(EMULATED_EEPROM_LENGTH);
274
279
  #elif defined(EEPROM_PRESENT)
275
280
  stream->print(EEPROM.length());
276
- #else
277
- stream->print('0');
281
+ #endif
282
+
283
+ // Sixth is I2C buffer size.
284
+ stream->print(',');
285
+ #ifdef DENKO_I2C
286
+ stream->print(DENKO_I2C_BUFFER_SIZE);
278
287
  #endif
279
288
 
280
289
  // End
@@ -297,6 +306,14 @@ void Denko::resetState() {
297
306
  lastTime = micros();
298
307
  }
299
308
 
309
+ // CMD = 93
310
+ void Denko::enumerate() {
311
+ stream->print("ENUMERATION:");
312
+ #ifdef A0
313
+ stream->println(A0);
314
+ #endif
315
+ }
316
+
300
317
  // CMD = 95
301
318
  // Set the register read divider. Powers of 2 up to 128 are valid.
302
319
  void Denko::setRegisterDivider() {
data/src/lib/Denko.h CHANGED
@@ -154,6 +154,8 @@ class Denko {
154
154
  void spiClearListeners ();
155
155
 
156
156
  // I2C
157
+ bool i2cStarted = false;
158
+ byte i2cSpeed = 0;
157
159
  void i2cBegin ();
158
160
  void i2cEnd ();
159
161
  void i2cSetSpeed (uint8_t code);
@@ -175,6 +177,7 @@ class Denko {
175
177
  //
176
178
  void handshake (); //cmd = 90
177
179
  void resetState (); //cmd = 91
180
+ void enumerate (); //cmd = 92
178
181
  void setRegisterDivider (); //cmd = 97
179
182
  void setAnalogWriteResolution (); //cmd = 96
180
183
  void setAnalogReadResolution (); //cmd = 97
@@ -205,30 +208,17 @@ class Denko {
205
208
  //
206
209
  // Flow control stuff.
207
210
  //
208
- // Notify the computer when the board has received half a serial buffer of bytes.
209
- //
211
+ // Notify computer that board has received bytes.
210
212
  void rxNotify();
211
213
  uint8_t rxBytes = 0;
212
- //
213
- // ESP32 uses a 128 byte FIFO buffer for UART Rx. Notify every 63 bytes instead of 32
214
- // so serial over native USB performs better.
215
- //
216
- // Using 63 instead of 64 since the ATmega32u4 (Leonardo) is limited to 63.
217
- //
218
- #ifdef ESP32
219
- uint8_t rxNotifyLimit = 63;
220
- #else
221
- uint8_t rxNotifyLimit = 32;
222
- #endif
223
-
224
214
  //
225
215
  // Tell the computer to halt or resume sending data to the board.
226
216
  //
227
- // Only use these if running a function on the board that disables interrupts for
217
+ // Use these if running a function on the board that disables interrupts for
228
218
  // longer than a single serial character (~85us at 115,200 baud).
229
219
  //
230
220
  // If the function was initiated by the computer (eg. writing to a WS2812 strip), do
231
- // not call sendHalt(). The computer should have halted transmission itself after sending
221
+ // not call sendHalt(). The computer should halt transmission itself after sending
232
222
  // the WS2812 command. Only call sendReady() after data is written out to the strip.
233
223
  //
234
224
  // If the function was initiated on the board (eg. New IR input triggered by an interrupt),
@@ -27,8 +27,8 @@ void Denko::setMode(byte p, byte m) {
27
27
  if (m != 0b100) dacDisable(p);
28
28
  #endif
29
29
 
30
- // On the SAMD21, mode needs to be INPUT when using the DAC.
31
- #ifdef __SAMD21G18A__
30
+ // On the SAMD21 and RA4M1, mode needs to be INPUT when using the DAC.
31
+ #if defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
32
32
  if (m == 0b100){
33
33
  pinMode(p, INPUT);
34
34
  return;
@@ -196,7 +196,7 @@ void Denko::dacWrite(byte p, int v, boolean echo) {
196
196
  ::dacWrite(p, v);
197
197
  #endif
198
198
 
199
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
199
+ #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
200
200
  analogWrite(p, v);
201
201
  #endif
202
202
  }
@@ -8,6 +8,7 @@
8
8
  #define DENKO_VERSION __VERSION__
9
9
 
10
10
  // Uncomment these to include features beyond core features.
11
+ // #define DENKO_EEPROM
11
12
  // #define DENKO_ONE_WIRE
12
13
  // #define DENKO_TONE
13
14
  // #define DENKO_SPI_BB
@@ -39,30 +40,24 @@
39
40
  #define PIN_COUNT 22
40
41
  #endif
41
42
 
42
- // No EEPROM on the Due or Zero.
43
- #if !defined(__SAM3X8E__) && !defined(__SAMD21G18A__)
44
- #define EEPROM_PRESENT
45
- #include <EEPROM.h>
46
- #endif
47
-
48
- // Emulate 512 bytes of EEPROM on ESP chips and the RP2040.
49
- #if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
50
- # define EEPROM_EMULATED
51
- # define EMULATED_EEPROM_LENGTH 512
52
- #endif
53
-
54
43
  // Figure out how many LEDC channels are available on ESP32 boards.
55
44
  #ifdef ESP32
56
- #define LEDC_CHANNEL_COUNT 16
45
+ #if CONFIG_IDF_TARGET_ESP32
46
+ #define LEDC_CHANNEL_COUNT 16
47
+ #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
48
+ #define LEDC_CHANNEL_COUNT 8
49
+ #elif CONFIG_IDF_TARGET_ESP32C3
50
+ #define LEDC_CHANNEL_COUNT 6
51
+ #endif
57
52
  #endif
58
53
 
59
54
  // Filter for boards that can set their analog write resolution.
60
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(ESP8266)
55
+ #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(ESP8266)
61
56
  #define WRITE_RESOLUTION_SETTER
62
57
  #endif
63
58
 
64
59
  // Filter for boards that can set their analog read resolution.
65
- #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
60
+ #if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
66
61
  #define READ_RESOLUTION_SETTER
67
62
  #endif
68
63
 
@@ -88,7 +83,7 @@
88
83
  #elif defined(ESP8266) && defined(SERIAL_PORT_HARDWARE_OPEN)
89
84
  #define DENKO_UARTS 1
90
85
 
91
- // This works for all the Atmel cores.
86
+ // This works for all the Atmel cores except RA4M1.
92
87
  #else
93
88
  #if defined(SERIAL_PORT_HARDWARE3)
94
89
  #define DENKO_UARTS 3
@@ -114,3 +109,54 @@
114
109
  #else
115
110
  #define AUX_SIZE 272
116
111
  #endif
112
+
113
+ // Define 'DENKO_SERIAL_IF' as the serial interface to use.
114
+ // Uses SerialUSB (left port), which is native USB, on Arduino Due & Zero, or Serial otherwise.
115
+ // On many boards, eg. Arduino Leonardo, RP2040, ESP32-S3, Serial is native USB regardless.
116
+ #if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
117
+ #define DENKO_SERIAL_IF SerialUSB
118
+ #define DENKO_USB_CDC
119
+ // To use programming USB (right) on Due and Zero, comment 2 lines above, uncomment 1 line below.
120
+ // #define DENKO_SERIAL_IF Serial
121
+ #else
122
+ #define DENKO_SERIAL_IF Serial
123
+ #endif
124
+
125
+ // Figure out how much serial buffer we have, tell the computer, and set the ack interval.
126
+ // Best performance acknowledging at 64 bytes, or 32 if buffer is only 64.
127
+ //
128
+ // These are 256/64 regardless of whether native USB CDC or UART bridge.
129
+ #if defined(ARDUINO_ARCH_RP2040) || defined(ESP32) || defined(ESP8266) || defined(__SAM3X8E__)
130
+ #define DENKO_SERIAL_BUFFER_SIZE 256
131
+ #define DENKO_RX_ACK_INTERVAL 64
132
+ // RA4M1 has a 512 Serial buffer.
133
+ #elif defined(_RENESAS_RA_)
134
+ #define DENKO_SERIAL_BUFFER_SIZE 512
135
+ #define DENKO_RX_ACK_INTERVAL 64
136
+ // SAMD21 is 256/64 in native USB mode ONLY. Must use defaults on programming port to avoid data loss.
137
+ #elif defined(__SAMD21G18A__) && defined(DENKO_USB_CDC)
138
+ #define DENKO_SERIAL_BUFFER_SIZE 256
139
+ #define DENKO_RX_ACK_INTERVAL 64
140
+ // 32u4 is odd. Size is 63 instead of 64. Interval must be 31. 32 doesn't work at all. Off by 1 errors?
141
+ #elif defined(__AVR_ATmega32U4__)
142
+ #define DENKO_SERIAL_BUFFER_SIZE 63
143
+ #define DENKO_RX_ACK_INTERVAL 31
144
+ // Defaults
145
+ #else
146
+ #define DENKO_SERIAL_BUFFER_SIZE 64
147
+ #define DENKO_RX_ACK_INTERVAL 32
148
+ #endif
149
+
150
+ // Figure out how big the buffer is on the built-in Wire / I2C library.
151
+ #ifdef DENKO_I2C
152
+ // RP2040 and SAMD21 can do up to 256, but 255 since 1 byte for length.
153
+ #if defined(ARDUINO_ARCH_RP2040) || defined(__SAMD21G18A__)
154
+ #define DENKO_I2C_BUFFER_SIZE 255
155
+ // ESP32, ESP8266 and megaAVR can do up to 128.
156
+ #elif defined(ESP32) || defined(ESP8266) || defined(__AVR_ATmega4809__)
157
+ #define DENKO_I2C_BUFFER_SIZE 128
158
+ // Fall back to 32 bytes.
159
+ #else
160
+ #define DENKO_I2C_BUFFER_SIZE 32
161
+ #endif
162
+ #endif
@@ -3,7 +3,15 @@
3
3
  //
4
4
  #include "Denko.h"
5
5
 
6
- #ifdef EEPROM_PRESENT
6
+ #ifdef DENKO_EEPROM
7
+ #include <EEPROM.h>
8
+
9
+ // Emulate 512 bytes of EEPROM on ESP chips and the RP2040.
10
+ #if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
11
+ #define EEPROM_EMULATED
12
+ #define EMULATED_EEPROM_LENGTH 512
13
+ #endif
14
+
7
15
  // CMD = 6
8
16
  // Read from the microcontroller's EEPROM.
9
17
  //
data/src/lib/DenkoI2C.cpp CHANGED
@@ -6,20 +6,20 @@
6
6
 
7
7
  #include <Wire.h>
8
8
 
9
- bool i2cStarted = false;
10
-
11
9
  // Only start the I2C interface if not already started.
12
10
  // Lazy initialization in case user wants to use I2C pins for something else.
13
11
  void Denko::i2cBegin() {
14
12
  if (!i2cStarted) {
15
13
  Wire.begin();
16
14
  i2cStarted = true;
15
+ i2cSetSpeed(0);
17
16
  }
18
17
  }
19
18
 
20
19
  // End the I2C interface.
21
20
  // This is mostly used as a Reset in Denko::handshake.
22
21
  void Denko::i2cEnd(){
22
+ i2cSetSpeed(0);
23
23
  // ESP8266 core does not define Wire.end()
24
24
  #ifndef ESP8266
25
25
  Wire.end();
@@ -36,6 +36,7 @@ void Denko::i2cSetSpeed(uint8_t code) {
36
36
  case 3: Wire.setClock(3400000); break;
37
37
  default: Wire.setClock(100000); break;
38
38
  }
39
+ i2cSpeed = code;
39
40
  }
40
41
 
41
42
  // CMD = 33
@@ -43,7 +44,8 @@ void Denko::i2cSetSpeed(uint8_t code) {
43
44
  void Denko::i2cSearch() {
44
45
  byte error;
45
46
  uint8_t addr;
46
- i2cBegin();
47
+ if (!i2cStarted) i2cBegin();
48
+ i2cSetSpeed(0);
47
49
  stream->print(SDA);
48
50
 
49
51
  // Only addresses from 0x08 to 0x77 are usable (8 to 127).
@@ -77,10 +79,10 @@ void Denko::i2cWrite() {
77
79
  uint8_t dataLength = (uint8_t)val;
78
80
 
79
81
  // Limit to 32 bytes.
80
- if (dataLength > 32) dataLength = 32;
82
+ if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
81
83
 
82
- i2cBegin();
83
- i2cSetSpeed(auxMsg[0]);
84
+ if (!i2cStarted) i2cBegin();
85
+ if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
84
86
 
85
87
  Wire.beginTransmission(address);
86
88
  Wire.write(&auxMsg[1], dataLength);
@@ -116,10 +118,10 @@ void Denko::i2cRead() {
116
118
  uint8_t dataLength = (uint8_t)val;
117
119
 
118
120
  // Limit to 32 bytes.
119
- if (dataLength > 32) dataLength = 32;
121
+ if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
120
122
 
121
- i2cBegin();
122
- i2cSetSpeed(auxMsg[0]);
123
+ if (!i2cStarted) i2cBegin();
124
+ if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
123
125
 
124
126
  // Optionally write up to a 4 byte register address before reading.
125
127
  if ((auxMsg[1] > 0) && (auxMsg[1] < 5)) {
@@ -8,7 +8,7 @@
8
8
  // WS2812 / NeoPixel support using Adafruit library from:
9
9
  // https://github.com/adafruit/Adafruit_NeoPixel
10
10
  //
11
- # ifdef DENKO_LED_WS2812
11
+ #ifdef DENKO_LED_WS2812
12
12
  #include <Adafruit_NeoPixel.h>
13
13
  #endif
14
14
 
data/target.yml CHANGED
@@ -1,3 +1,37 @@
1
+ # name: rp2040
2
+ # fqbn: rp2040:rp2040:rpipicow
3
+ # port: /dev/cu.usbmodem14B01
4
+
5
+ # name: mega
6
+ # fqbn: arduino:avr:uno
7
+ # ort: /dev/cu.usbmodem14B01
8
+
9
+ # name: mega
10
+ # fqbn: arduino:avr:mega
11
+ # port: /dev/cu.usbmodem14C01
12
+
1
13
  name: mega
2
- fqbn: arduino:avr:uno
14
+ fqbn: arduino:avr:leonardo
3
15
  port: /dev/cu.usbmodem14B01
16
+
17
+ # name: esp32
18
+ # fqbn: esp32:esp32:esp32doit-devkit-v1
19
+ # port: /dev/cu.SLAB_USBtoUART
20
+
21
+ # name: esp8266
22
+ # fqbn: esp8266:esp8266:nodemcuv2
23
+ # port: /dev/cu.SLAB_USBtoUART
24
+
25
+ # name: sam3x
26
+ # fqbn: arduino:sam:arduino_due_x
27
+ # port: /dev/cu.usbmodem14C0
28
+
29
+ # name: samd
30
+ # fqbn: arduino:samd:arduino_zero_native
31
+ # port: /dev/cu.usbmodem14C01
32
+
33
+ # Native USB ESP32 shouldn't be used since this doesn't enable USB CDC on boot.
34
+
35
+ # name: esp32
36
+ # fqbn: esp32:esp32:lolin_s3
37
+ # port: /dev/cu.usbmodem14C01