denko 0.13.0 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.
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