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
@@ -51,13 +51,20 @@ class ReaderTest < Minitest::Test
51
51
  assert_equal part.read, 42
52
52
  end
53
53
 
54
- def test_read_using
54
+ def test_read_using_with_lambda
55
55
  inject(1)
56
56
  reader = MiniTest::Mock.new.expect :call, nil
57
57
  part.read_using -> { reader.call }
58
58
  reader.verify
59
59
  end
60
60
 
61
+ def test_read_using_with_method_and_args
62
+ inject(1)
63
+ reader = MiniTest::Mock.new.expect :call, nil, [10, 20], test_arg: 2
64
+ part.read_using reader, 10, 20, test_arg: 2
65
+ reader.verify
66
+ end
67
+
61
68
  def test_add_run_remove_callback
62
69
  cb = MiniTest::Mock.new.expect :call, nil
63
70
  inject(1)
@@ -20,10 +20,6 @@ class APIHelperTest < Minitest::Test
20
20
  assert_equal pack(:uint8, [25,26]), "\x19\x1A"
21
21
  end
22
22
 
23
- def test_padding
24
- assert_equal pack(:uint8, 25, pad: 2), "\x19\x00"
25
- end
26
-
27
23
  def test_min
28
24
  assert_raises(ArgumentError) { pack(:uint8, 25, min: 2) }
29
25
  end
@@ -20,4 +20,14 @@ class HD44780Test < MiniTest::Test
20
20
 
21
21
  end
22
22
  end
23
+
24
+ def test_write4
25
+ part.write4 "10100101"
26
+
27
+ # Pin states should match lower 4 bits, since they are sent last.
28
+ assert_equal 1, part.d4.state
29
+ assert_equal 0, part.d5.state
30
+ assert_equal 1, part.d6.state
31
+ assert_equal 0, part.d7.state
32
+ end
23
33
  end
@@ -60,14 +60,17 @@ class SevenSegmentLEDTest < MiniTest::Test
60
60
  end
61
61
 
62
62
  def test_scroll
63
- mock = MiniTest::Mock.new.expect :call, nil, ['foo']
64
- part.stub(:scroll, mock) do
65
- part.display('foo')
63
+ mock = MiniTest::Mock.new
64
+ mock.expect :call, nil, ['H']
65
+ mock.expect :call, nil, ['I']
66
+ part.stub(:write, mock) do
67
+ part.display('hi')
66
68
  end
67
69
  mock.verify
68
70
  end
69
71
 
70
72
  def test_display_ensures_on
73
+ part.off
71
74
  mock = MiniTest::Mock.new.expect :call, nil
72
75
  part.stub(:on, mock) do
73
76
  part.display(1)
@@ -75,12 +78,31 @@ class SevenSegmentLEDTest < MiniTest::Test
75
78
  mock.verify
76
79
  end
77
80
 
78
- def test_display_clears_if_unknown_char
79
- mock = MiniTest::Mock.new.expect :call, nil
80
- part.stub(:clear, mock) do
81
- part.display('+')
81
+ def test_write_clears_if_unknown_char
82
+ # Turn all the segments on.
83
+ part.display('8')
84
+
85
+ # Expect every segment to get #write(1). Inverted logic because anode.
86
+ mocks = []
87
+ part.segments.each do
88
+ mocks << MiniTest::Mock.new.expect(:call, nil, [1])
82
89
  end
83
- mock.verify
90
+ part.segments[0].stub(:write, mocks[0]) do
91
+ part.segments[1].stub(:write, mocks[1]) do
92
+ part.segments[2].stub(:write, mocks[2]) do
93
+ part.segments[3].stub(:write, mocks[3]) do
94
+ part.segments[4].stub(:write, mocks[4]) do
95
+ part.segments[5].stub(:write, mocks[5]) do
96
+ part.segments[6].stub(:write, mocks[6]) do
97
+ part.display('+')
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ mocks.each { |mock| mock.verify}
84
106
  end
85
107
  # Test with cathode
86
108
  end
@@ -131,4 +131,8 @@ class OneWireEnumeratorTest < Minitest::Test
131
131
  found_addresses = bus.found_devices.map { |d| d[:address] }
132
132
  assert_equal found_addresses.sort, bus_sim.addresses.sort
133
133
  end
134
+
135
+ def test_includes_constants
136
+ assert Denko::OneWire::BusEnumerator.ancestors.include?(Denko::OneWire::Constants)
137
+ end
134
138
  end
@@ -3,16 +3,16 @@ require_relative '../test_helper'
3
3
  class OneWireHelper < Minitest::Test
4
4
 
5
5
  def test_with_valid_crc
6
- assert Denko::OneWire::Helper.crc_check(18086456125349333800)
7
- assert Denko::OneWire::Helper.crc_check([121, 117, 144, 185, 6, 165, 43, 26])
6
+ assert Denko::OneWire::Helper.crc(18086456125349333800)
7
+ assert Denko::OneWire::Helper.crc([121, 117, 144, 185, 6, 165, 43, 26])
8
8
  end
9
9
 
10
10
  def test_with_invalid_crc
11
- refute Denko::OneWire::Helper.crc_check(18086456125349333801)
11
+ refute Denko::OneWire::Helper.crc(18086456125349333801)
12
12
  end
13
13
 
14
14
  def test_arbitrary_length_read
15
- assert Denko::OneWire::Helper.crc_check([181, 1, 75, 70, 127, 255, 11, 16, 163])
16
- refute Denko::OneWire::Helper.crc_check([181, 1, 75, 70, 127, 255, 11, 16, 164])
15
+ assert Denko::OneWire::Helper.crc([181, 1, 75, 70, 127, 255, 11, 16, 163])
16
+ refute Denko::OneWire::Helper.crc([181, 1, 75, 70, 127, 255, 11, 16, 164])
17
17
  end
18
18
  end
@@ -43,6 +43,16 @@ class DS18B20Test < MiniTest::Test
43
43
  assert_equal 0.75, part.instance_variable_get(:@convert_time)
44
44
  end
45
45
 
46
+ def test_pre_callback_filter_does_crc_and_returns_error_on_fail
47
+ raw_bytes = [239, 1, 75, 70, 127, 255, 1, 16, 245]
48
+ mock = MiniTest::Mock.new.expect(:call, false, [raw_bytes])
49
+
50
+ Denko::OneWire::Helper.stub(:crc, mock) do
51
+ assert_equal({crc_error: true}, part.pre_callback_filter(raw_bytes))
52
+ end
53
+ mock.verify
54
+ end
55
+
46
56
  # test resolution=
47
57
 
48
58
  def test_convert_is_atomic
data/test/test_helper.rb CHANGED
@@ -100,7 +100,12 @@ module Constants
100
100
  opts[:on].send(:remove_const, const) if self.class.const_defined?(const)
101
101
  opts[:on].const_set(const, value)
102
102
  end
103
- ACK = "SAMD_ZERO,0.13.0,528,1024"
103
+ # Imaginary handshake ack from the board. Not a real SAMD_ZERO device.
104
+ # Serial buffer = 256
105
+ # Aux size = 528
106
+ # EEPROM size = 1024
107
+ # I2C buffer = 32
108
+ ACK = "SAMD_ZERO,0.13.0,256,528,1024,32"
104
109
 
105
110
  # Some test redefine RUBY_PLATFORM. Save the original to reset it.
106
111
  ORIGINAL_RUBY_PLATFORM = RUBY_PLATFORM
@@ -137,6 +142,9 @@ class ConnectionMock
137
142
  def handshake
138
143
  Constants::ACK
139
144
  end
145
+ def remote_buffer_size=(size)
146
+ @remote_buffer_size = size
147
+ end
140
148
  end
141
149
 
142
150
  class BoardMock < Denko::Board
@@ -211,7 +219,7 @@ module TestPacker
211
219
  end
212
220
  end
213
221
 
214
- # Speed up one wire tests.
222
+ # Speed up tests which use long delays.
215
223
  module Denko
216
224
  module OneWire
217
225
  class Bus
@@ -220,4 +228,11 @@ module Denko
220
228
  end
221
229
  end
222
230
  end
231
+ module LED
232
+ class SevenSegment
233
+ def sleep(time)
234
+ super(0.001)
235
+ end
236
+ end
237
+ end
223
238
  end
@@ -19,3 +19,6 @@
19
19
  [submodule "cores/sam3x"]
20
20
  path = cores/sam3x
21
21
  url = https://github.com/arduino/ArduinoCore-sam
22
+ [submodule "cores/ra4m1"]
23
+ path = cores/ra4m1
24
+ url = https://github.com/arduino/ArduinoCore-renesas.git
@@ -378,18 +378,6 @@
378
378
  #define BOARD_MAP "ADAFRUIT_FEATHER_ESP32S2_REVTFT"
379
379
  #endif
380
380
 
381
- #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32S2
382
- #define BOARD_MAP "ADAFRUIT_QTPY_ESP32S2"
383
- #endif
384
-
385
- #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32C3
386
- #define BOARD_MAP "ADAFRUIT_QTPY_ESP32C3"
387
- #endif
388
-
389
- #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32_PICO
390
- #define BOARD_MAP "ADAFRUIT_QTPY_ESP32_PICO"
391
- #endif
392
-
393
381
  #ifdef ARDUINO_ADAFRUIT_FEATHER_ESP32_V2
394
382
  #define BOARD_MAP "ADAFRUIT_FEATHER_ESP32_V2"
395
383
  #endif
@@ -410,10 +398,26 @@
410
398
  #define BOARD_MAP "ADAFRUIT_FEATHER_ESP32S3_REVTFT"
411
399
  #endif
412
400
 
401
+ #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32_PICO
402
+ #define BOARD_MAP "ADAFRUIT_QTPY_ESP32_PICO"
403
+ #endif
404
+
405
+ #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32C3
406
+ #define BOARD_MAP "ADAFRUIT_QTPY_ESP32C3"
407
+ #endif
408
+
409
+ #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32S2
410
+ #define BOARD_MAP "ADAFRUIT_QTPY_ESP32S2"
411
+ #endif
412
+
413
413
  #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM
414
414
  #define BOARD_MAP "ADAFRUIT_QTPY_ESP32S3_NOPSRAM"
415
415
  #endif
416
416
 
417
+ #ifdef ARDUINO_ADAFRUIT_QTPY_ESP32S3_N4R2
418
+ #define BOARD_MAP "ADAFRUIT_QTPY_ESP32S3_N4R2"
419
+ #endif
420
+
417
421
  #ifdef ARDUINO_ADAFRUIT_ITSYBITSY_ESP32
418
422
  #define BOARD_MAP "ADAFRUIT_ITSYBITSY_ESP32"
419
423
  #endif
@@ -1142,6 +1146,10 @@
1142
1146
  #define BOARD_MAP "NANO_RP2040_CONNECT"
1143
1147
  #endif
1144
1148
 
1149
+ #ifdef ARDUINO_ARTRONSHOP_RP2_NANO
1150
+ #define BOARD_MAP "ARTRONSHOP_RP2_NANO"
1151
+ #endif
1152
+
1145
1153
  #ifdef ARDUINO_BRIDGETEK_IDM2040-7A
1146
1154
  #define BOARD_MAP "BRIDGETEK_IDM2040-7A"
1147
1155
  #endif
@@ -1194,6 +1202,10 @@
1194
1202
  #define BOARD_MAP "CHALLENGER_2040_WIFI_BLE_RP2040"
1195
1203
  #endif
1196
1204
 
1205
+ #ifdef ARDUINO_CHALLENGER_2040_WIFI6_BLE_RP2040
1206
+ #define BOARD_MAP "CHALLENGER_2040_WIFI6_BLE_RP2040"
1207
+ #endif
1208
+
1197
1209
  #ifdef ARDUINO_CHALLENGER_NB_2040_WIFI_RP2040
1198
1210
  #define BOARD_MAP "CHALLENGER_NB_2040_WIFI_RP2040"
1199
1211
  #endif
@@ -1234,6 +1246,10 @@
1234
1246
  #define BOARD_MAP "PIMORONI_PGA2040"
1235
1247
  #endif
1236
1248
 
1249
+ #ifdef ARDUINO_PIMORONI_PLASMA2040
1250
+ #define BOARD_MAP "PIMORONI_PLASMA2040"
1251
+ #endif
1252
+
1237
1253
  #ifdef ARDUINO_SOLDERPARTY_RP2040_STAMP
1238
1254
  #define BOARD_MAP "SOLDERPARTY_RP2040_STAMP"
1239
1255
  #endif
@@ -1362,3 +1378,15 @@
1362
1378
  #define BOARD_MAP "SAMD_TIAN"
1363
1379
  #endif
1364
1380
 
1381
+ #ifdef ARDUINO_PORTENTA_C33
1382
+ #define BOARD_MAP "PORTENTA_C33"
1383
+ #endif
1384
+
1385
+ #ifdef ARDUINO_MINIMA
1386
+ #define BOARD_MAP "MINIMA"
1387
+ #endif
1388
+
1389
+ #ifdef ARDUINO_UNOWIFIR4
1390
+ #define BOARD_MAP "UNOWIFIR4"
1391
+ #endif
1392
+
@@ -18,6 +18,7 @@ This is the exact use case this was deisgned for, in support of the [denko](http
18
18
  - [megaavr](https://github.com/arduino/ArduinoCore-megaavr)
19
19
  - [sam](https://github.com/arduino/ArduinoCore-sam)
20
20
  - [samd](https://github.com/arduino/ArduinoCore-samd)
21
+ - [renesas](https://github.com/arduino/ArduinoCore-renesas)
21
22
  - [esp8266](https://github.com/esp8266/Arduino)
22
23
  - [esp32](https://github.com/espressif/arduino-esp32)
23
24
  - [rp2040](https://github.com/earlephilhower/arduino-pico)
@@ -27,6 +27,9 @@ class HeaderParser
27
27
  file.each_line do |line|
28
28
  # Reject comments.
29
29
  next if line.match /\A\/\//
30
+
31
+ # Reject anything to do with QSPI.
32
+ next if line.match /QSPI/
30
33
 
31
34
  # Reject lines that end with pin-style identifiers, instead of numbers.
32
35
  next if line.match /(PIN_)*(A|D|DAC|T)(\d+)\s*;*\s*\z/
@@ -41,22 +44,43 @@ class HeaderParser
41
44
 
42
45
  # Match RP2040 analog overrides and store them with prefixed keys like :_A0
43
46
  # Will substitute them later in #clean_map
44
- rp2040_analog = line.match /__PIN(_A\d+)\s*\(?(\d+)\w*\)?/
47
+ rp2040_analog = line.match /__PIN(_A\d+)\s+\(?(\d+)\w*\)?/
45
48
  if rp2040_analog
46
49
  @map[rp2040_analog[1].to_sym] = rp2040_analog[2].to_i
47
50
  next
48
51
  end
49
52
 
50
53
  #
51
- # Match analog input and DAC pins declared like:
54
+ # Match analog input pins declared like:
52
55
  # #define PIN_A0 (14ul)
53
- # #define PIN_DAC0 (14)
54
56
  # #define PIN_A0 14
55
57
  # #define A0 14
56
58
  #
57
- pin = line.match /(PIN_)*((A|DAC)\d+)\s*\(?(\d+)\w*\)?/
59
+ pin = line.match /(PIN_)*(A\d+)\s+\(?(\d+)\w*\)?/
58
60
  if pin
59
- @map[pin[2].to_sym] = pin[4].to_i
61
+ @map[pin[2].to_sym] = pin[3].to_i
62
+ next
63
+ end
64
+
65
+ #
66
+ # Strict matcher for DAC pins in Arduino SAMD core:
67
+ # #define DAC A0
68
+ # #define DAC1 14
69
+ #
70
+ pin = line.match /(PIN_)(DAC\d+)\s+\(?(\d+)\w*\)?/
71
+ if pin
72
+ @map[pin[2].to_sym] = pin[3].to_i
73
+ next
74
+ end
75
+
76
+ #
77
+ # Match I2C/SPI pins declared like: (first seen in UNO R4)
78
+ # #define WIRE_SDA_PIN 20
79
+ # #define WIRE_SCL1_PIN 20
80
+ #
81
+ pin = line.match /(WIRE(\d*)_(SCL_|SDA_)PIN)\s*\(?(\d+)\w*\)?/
82
+ if pin
83
+ @map[pin[1].gsub("_PIN", "").to_sym] = pin[4].to_i
60
84
  next
61
85
  end
62
86
 
@@ -73,6 +97,7 @@ class HeaderParser
73
97
  next
74
98
  end
75
99
 
100
+ # This mostly affectes SAM3X, ESP32 and ESP8266.
76
101
  #
77
102
  # Match custom labeled D* pins (eg. ESP8266) declared like:
78
103
  # static const uint D4 = (2)
@@ -1,7 +1,7 @@
1
1
  require_relative "lib/boards_parser"
2
2
  require_relative "lib/header_parser"
3
3
 
4
- CORES = ["avr", "esp32", "esp8266", "megaavr", "rp2040", "sam3x", "samd"]
4
+ CORES = ["avr", "esp32", "esp8266", "megaavr", "rp2040", "sam3x", "samd", "ra4m1"]
5
5
 
6
6
  # This will end up containing a map for each board identified. Each key
7
7
  # is a board's identifier and the value is its pin map as a hash.
@@ -15,11 +15,21 @@ CORES.each do |core|
15
15
 
16
16
  # For each board, parse its header and add it to the hash of maps.
17
17
  board_headers.each do |board, header_folder|
18
+ # No idea what this is, but doesn't seem to be a real board.
19
+ next if board.match /muxto/i
20
+
18
21
  parser = HeaderParser.new(header_folder)
19
22
  board_maps[board] = parser.map
20
23
  end
21
24
  end
22
25
 
26
+ # Manually set DAC pins for Arduino branded RA4M1 boards.
27
+ # Should handle with different matchers for each core, but this works for now.
28
+ board_maps["ARDUINO_MINIMA"][:DAC] = 14
29
+ board_maps["ARDUINO_UNOWIFIR4"][:DAC] = 14
30
+ board_maps["ARDUINO_PORTENTA_C33"][:DAC] = 21
31
+ board_maps["ARDUINO_PORTENTA_C33"][:DAC1] = 20
32
+
23
33
  # Remove chars from board identifier that won't work in a filename.
24
34
  def board_to_filename(board_identifier)
25
35
  board_identifier.gsub(":", "_").gsub(",", "_").gsub(/\AARDUINO_/, "")
@@ -7,7 +7,7 @@
7
7
  :SCK: 36
8
8
  :MISO: 37
9
9
  :A0: 18
10
- :A1: 4
10
+ :A1: 17
11
11
  :A2: 16
12
12
  :A3: 15
13
13
  :A4: 14
@@ -16,6 +16,11 @@
16
16
  :A7: 4
17
17
  :A8: 5
18
18
  :A9: 6
19
+ :A10: 9
20
+ :A11: 10
21
+ :A12: 11
22
+ :A13: 12
23
+ :A14: 13
19
24
  :T3: 3
20
25
  :T4: 4
21
26
  :T5: 5
@@ -7,7 +7,7 @@
7
7
  :SCK: 36
8
8
  :MISO: 37
9
9
  :A0: 18
10
- :A1: 4
10
+ :A1: 17
11
11
  :A2: 16
12
12
  :A3: 15
13
13
  :A4: 14
@@ -16,6 +16,11 @@
16
16
  :A7: 4
17
17
  :A8: 5
18
18
  :A9: 6
19
+ :A10: 9
20
+ :A11: 10
21
+ :A12: 11
22
+ :A13: 12
23
+ :A14: 13
19
24
  :T3: 3
20
25
  :T4: 4
21
26
  :T5: 5
@@ -7,7 +7,7 @@
7
7
  :MISO: 21
8
8
  :SCK: 5
9
9
  :A0: 26
10
- :A1: 3
10
+ :A1: 25
11
11
  :A2: 34
12
12
  :A3: 39
13
13
  :A4: 36
@@ -16,6 +16,10 @@
16
16
  :A7: 32
17
17
  :A8: 15
18
18
  :A9: 33
19
+ :A10: 27
20
+ :A11: 12
21
+ :A12: 13
22
+ :A13: 35
19
23
  :T0: 4
20
24
  :T1: 0
21
25
  :T2: 2
@@ -0,0 +1,20 @@
1
+ ---
2
+ :SDA: 7
3
+ :SCL: 6
4
+ :A1: 17
5
+ :SS: 42
6
+ :MOSI: 35
7
+ :SCK: 36
8
+ :MISO: 37
9
+ :A0: 18
10
+ :A2: 9
11
+ :A3: 8
12
+ :A4: 7
13
+ :A5: 6
14
+ :A6: 5
15
+ :A7: 16
16
+ :T5: 5
17
+ :T6: 6
18
+ :T7: 7
19
+ :T8: 8
20
+ :T9: 9
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :SDA: 4
3
3
  :SCL: 33
4
- :A1: 0
4
+ :A1: 25
5
5
  :SS: 27
6
6
  :MOSI: 13
7
7
  :MISO: 12
@@ -15,6 +15,7 @@
15
15
  :A7: 7
16
16
  :A8: 14
17
17
  :A9: 12
18
+ :A10: 13
18
19
  :T0: 4
19
20
  :T3: 15
20
21
  :T4: 13
@@ -0,0 +1,32 @@
1
+ ---
2
+ :LED_BUILTIN: 13
3
+ :D0: 0
4
+ :D1: 1
5
+ :D2: 2
6
+ :D3: 3
7
+ :D4: 4
8
+ :D5: 5
9
+ :D6: 6
10
+ :D7: 7
11
+ :D8: 8
12
+ :D9: 9
13
+ :D10: 10
14
+ :D11: 11
15
+ :D12: 12
16
+ :D13: 13
17
+ :A0: 26
18
+ :A1: 27
19
+ :A2: 28
20
+ :A3: 29
21
+ :MISO0: 4
22
+ :MOSI0: 3
23
+ :SCK0: 2
24
+ :SS0: 5
25
+ :MISO1: 12
26
+ :MOSI1: 11
27
+ :SCK1: 10
28
+ :SS1: 13
29
+ :SDA0: 16
30
+ :SCL0: 17
31
+ :SDA1: 18
32
+ :SCL1: 19
@@ -7,7 +7,7 @@
7
7
  :MISO: 14
8
8
  :SCK: 15
9
9
  :A0: 18
10
- :A1: 1
10
+ :A1: 19
11
11
  :A2: 20
12
12
  :A3: 21
13
13
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  :A0: 18
3
- :A1: 1
3
+ :A1: 19
4
4
  :A2: 20
5
5
  :A3: 21
6
6
  :A4: 22
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  :A0: 18
3
- :A1: 1
3
+ :A1: 19
4
4
  :A2: 20
5
5
  :A3: 21
6
6
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  :LED_BUILTIN: 13
3
3
  :A0: 18
4
- :A1: 1
4
+ :A1: 19
5
5
  :A2: 20
6
6
  :A3: 21
7
7
  :A4: 22