Skip to content

Commit 748970e

Browse files
author
Loco Team
committed
Improve DCC messages handling
1 parent f4b9700 commit 748970e

File tree

7 files changed

+93
-30
lines changed

7 files changed

+93
-30
lines changed

config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#define MAX_CACHED_DCC_PACKETS 10
55

66
//LEDs
7-
#define MAX_LED_CONNECTIONS 20
7+
#define MAX_LED_CONNECTIONS 30
88

99
//GPIO
1010
#define MAX_GPIO_CONNECTIONS 30

data/preferences.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
serial=tr_11111;
2-
wifi_ssid=loco-tr_11111;
1+
serial=ac_ukj1zc;
2+
wifi_ssid=loco-ac_ukj1zc;
33
wifi_passwd=loco.eng;
44
hw=1.0;
55
board_type=accessory;

simpledcc-arduino.ino

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,19 @@ void setup()
7070
on_status_led(0x00ff00);
7171

7272
// LED connection examples for a level crossing with 2 LEDs blinking alternately
73-
//add_led_connection(0, 1, 0.5, 1000, 1000, 0);
74-
//add_led_connection(1,7, 0.5, 1000, 1000, 1000);
73+
74+
//LED tests, LED driver
75+
/*
76+
add_led_connection(0, 0, 0.06, 2000, 9000, 0); //white
77+
add_led_connection(0, 11, 0.09, 2000, 9000, 2000); //green
78+
add_led_connection(0, 10, 0.5, 2000, 9000, 4000); //yellow bottom
79+
add_led_connection(0, 8, 0.7, 2000, 9000, 4000); //yellow top
80+
add_led_connection(0, 9, 0.08, 2000, 9000, 6000); //red
81+
*/
82+
//LED tests, GPIO outputs
83+
//add_led_connection(1,33, 0.5, 1000, 1000, 1000);
84+
//add_led_connection(1,34, 0.5, 1000, 1000, 1000);
85+
7586

7687
// Test LittleFS
7788
//deleteFile(LittleFS, "/level_crossing_1.wav");
@@ -88,7 +99,6 @@ void setup()
8899

89100
//Pullup on GPIO 00 is required for Loco.Engineering flashing tools
90101
pinMode(0, INPUT_PULLUP);
91-
// analogWrite(GPIO_NUM, pwm);
92102

93103
//Uncomment and change WiFI Tx Power if you want to increase the range or reduce the board heating
94104
//Possible values can be found at https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.h, struct wifi_power_t
@@ -99,6 +109,7 @@ void setup()
99109
void loop()
100110
{
101111

112+
102113
loop_dcc_module();
103114
loop_webserver();
104115
loop_led();

src/config/board_config.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ typedef enum
1616
DIGITAL,
1717
PWM,
1818
ANGLE,
19+
STEPPER,
1920
AUDIO
2021
} SIGNAL_TYPES;
2122

@@ -179,71 +180,83 @@ void fill_board_connections()
179180
board_connections[LED_outputs_amount].owner_id = ESP32Sx;
180181
board_connections[LED_outputs_amount].signal_types[0] = DIGITAL;
181182
board_connections[LED_outputs_amount].signal_types[1] = PWM;
183+
board_connections[LED_outputs_amount].signal_types[2] = STEPPER;
182184

183185
sprintf(board_connections[LED_outputs_amount + 1].name, "IO05");
184186
board_connections[LED_outputs_amount + 1].output_num = 5;
185187
board_connections[LED_outputs_amount + 1].owner_id = ESP32Sx;
186188
board_connections[LED_outputs_amount + 1].signal_types[0] = DIGITAL;
187189
board_connections[LED_outputs_amount + 1].signal_types[1] = PWM;
190+
board_connections[LED_outputs_amount + 1].signal_types[2] = STEPPER;
188191

189192
sprintf(board_connections[LED_outputs_amount + 2].name, "IO06");
190193
board_connections[LED_outputs_amount + 2].output_num = 6;
191194
board_connections[LED_outputs_amount + 2].owner_id = ESP32Sx;
192195
board_connections[LED_outputs_amount + 2].signal_types[0] = DIGITAL;
193196
board_connections[LED_outputs_amount + 2].signal_types[1] = PWM;
197+
board_connections[LED_outputs_amount + 2].signal_types[2] = STEPPER;
194198

195199
sprintf(board_connections[LED_outputs_amount + 3].name, "IO07");
196200
board_connections[LED_outputs_amount + 3].output_num = 7;
197201
board_connections[LED_outputs_amount + 3].owner_id = ESP32Sx;
198202
board_connections[LED_outputs_amount + 3].signal_types[0] = DIGITAL;
199203
board_connections[LED_outputs_amount + 3].signal_types[1] = PWM;
204+
board_connections[LED_outputs_amount + 3].signal_types[2] = STEPPER;
200205

201206
sprintf(board_connections[LED_outputs_amount + 4].name, "IO08");
202207
board_connections[LED_outputs_amount + 4].output_num = 8;
203208
board_connections[LED_outputs_amount + 4].owner_id = ESP32Sx;
204209
board_connections[LED_outputs_amount + 4].signal_types[0] = DIGITAL;
205210
board_connections[LED_outputs_amount + 4].signal_types[1] = PWM;
211+
board_connections[LED_outputs_amount + 4].signal_types[2] = STEPPER;
206212

207213
sprintf(board_connections[LED_outputs_amount + 5].name, "IO09");
208214
board_connections[LED_outputs_amount + 5].output_num = 9;
209215
board_connections[LED_outputs_amount + 5].owner_id = ESP32Sx;
210216
board_connections[LED_outputs_amount + 5].signal_types[0] = DIGITAL;
211217
board_connections[LED_outputs_amount + 5].signal_types[1] = PWM;
218+
board_connections[LED_outputs_amount + 5].signal_types[2] = STEPPER;
212219

213220
sprintf(board_connections[LED_outputs_amount + 6].name, "IO10");
214221
board_connections[LED_outputs_amount + 6].output_num = 10;
215222
board_connections[LED_outputs_amount + 6].owner_id = ESP32Sx;
216223
board_connections[LED_outputs_amount + 6].signal_types[0] = DIGITAL;
217224
board_connections[LED_outputs_amount + 6].signal_types[1] = PWM;
225+
board_connections[LED_outputs_amount + 6].signal_types[2] = STEPPER;
218226

219227
sprintf(board_connections[LED_outputs_amount + 7].name, "IO11");
220228
board_connections[LED_outputs_amount + 7].output_num = 11;
221229
board_connections[LED_outputs_amount + 7].owner_id = ESP32Sx;
222230
board_connections[LED_outputs_amount + 7].signal_types[0] = DIGITAL;
223231
board_connections[LED_outputs_amount + 7].signal_types[1] = PWM;
232+
board_connections[LED_outputs_amount + 7].signal_types[2] = STEPPER;
224233

225234
sprintf(board_connections[LED_outputs_amount + 8].name, "IO18");
226235
board_connections[LED_outputs_amount + 8].output_num = 18;
227236
board_connections[LED_outputs_amount + 8].owner_id = ESP32Sx;
228237
board_connections[LED_outputs_amount + 8].signal_types[0] = DIGITAL;
229238
board_connections[LED_outputs_amount + 8].signal_types[1] = PWM;
239+
board_connections[LED_outputs_amount + 8].signal_types[2] = STEPPER;
230240

231241
sprintf(board_connections[LED_outputs_amount + 9].name, "IO21");
232242
board_connections[LED_outputs_amount + 9].output_num = 21;
233243
board_connections[LED_outputs_amount + 9].owner_id = ESP32Sx;
234244
board_connections[LED_outputs_amount + 9].signal_types[0] = DIGITAL;
235245
board_connections[LED_outputs_amount + 9].signal_types[1] = PWM;
246+
board_connections[LED_outputs_amount + 9].signal_types[2] = STEPPER;
236247

237248
sprintf(board_connections[LED_outputs_amount + 10].name, "IO47");
238249
board_connections[LED_outputs_amount + 10].output_num = 47;
239250
board_connections[LED_outputs_amount + 10].owner_id = ESP32Sx;
240251
board_connections[LED_outputs_amount + 10].signal_types[0] = DIGITAL;
241252
board_connections[LED_outputs_amount + 10].signal_types[1] = PWM;
253+
board_connections[LED_outputs_amount + 10].signal_types[2] = STEPPER;
242254

243255
sprintf(board_connections[LED_outputs_amount + 11].name, "SOUND");
244256
board_connections[LED_outputs_amount + 11].output_num = 0;
245257
board_connections[LED_outputs_amount + 11].owner_id = MAX98357;
246258
board_connections[LED_outputs_amount + 11].signal_types[0] = AUDIO;
259+
247260
}
248261
}
249262

src/features/led_module.h

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,86 +11,119 @@ const int resolution = 8;
1111
gpio_connection led_connections[MAX_LED_CONNECTIONS];
1212
uint8_t led_connections_count = 0;
1313

14+
int compareArrays(uint8_t a[], uint8_t b[], int n)
15+
{
16+
for (uint8_t ii = 0; ii < n; ii++)
17+
{
18+
if (a[ii] != b[ii])
19+
return 0;
20+
}
21+
return 1;
22+
}
23+
1424
void setup_led()
1525
{
1626
Wire.begin(11, 10);
1727
ledd.begin(0.1);
1828
}
1929

2030
// on_duration, off_duration, start_delay - values in milliseconds
21-
void add_led_connection(uint8_t type, uint8_t led_pin, float pwm, unsigned long on_duration = 0, unsigned long off_duration = 0, unsigned long start_delay = 0)
31+
void add_led_connection(uint8_t type, uint8_t led_pin, float pwm, unsigned long on_duration = 0, unsigned long off_duration = 0, unsigned long start_delay = 0, uint8_t *id = 0)
2232
{
33+
if (id == 0)
34+
{
35+
Serial.print("Id of LED connection cannot be 0\n");
36+
return;
37+
}
38+
2339
// Check if we already added this connection
2440
bool is_LED_added_already = false;
41+
uint8_t connection_index = led_connections_count;
2542
for (int i = 0; i < led_connections_count; ++i)
2643
{
2744
gpio_connection cur_led_connection = led_connections[i];
2845

29-
if (cur_led_connection.io_pin == led_pin && cur_led_connection.type == type)
46+
if (compareArrays(cur_led_connection.id, id, 10) == true)
3047
{
3148
is_LED_added_already = true;
49+
connection_index = i;
3250
}
3351
}
3452

3553
if (is_LED_added_already == false)
3654
{
37-
led_connections[led_connections_count].type = type;
55+
led_connections[connection_index].type = type;
3856
if (type == 1)
3957
{
4058
// configure LED PWM functionalitites
41-
ledcSetup(led_connections_count, freq, resolution);
42-
ledcAttachPin(led_pin, led_connections_count);
59+
ledcSetup(connection_index, freq, resolution);
60+
ledcAttachPin(led_pin, connection_index);
4361
}
4462

45-
led_connections[led_connections_count].io_pin = led_pin;
46-
led_connections[led_connections_count].connection_index = led_connections_count;
63+
led_connections[connection_index].io_pin = led_pin;
64+
led_connections[connection_index].connection_index = connection_index;
65+
66+
for (uint8_t id_ind = 0; id_ind < 10; ++id_ind)
67+
{
68+
led_connections[connection_index].id[id_ind] = id[id_ind];
69+
}
4770
}
4871

49-
led_connections[led_connections_count].output_value = pwm;
72+
led_connections[connection_index].output_value = pwm;
5073

51-
led_connections[led_connections_count].on_duration = on_duration;
52-
led_connections[led_connections_count].off_duration = off_duration;
53-
led_connections[led_connections_count].is_enabled = true;
74+
led_connections[connection_index].on_duration = on_duration;
75+
led_connections[connection_index].off_duration = off_duration;
76+
led_connections[connection_index].is_enabled = true;
5477
if (start_delay == 0)
5578
{
56-
led_connections[led_connections_count].is_on = true;
79+
led_connections[connection_index].is_on = true;
5780
}
5881
else
5982
{
60-
led_connections[led_connections_count].is_on = false;
83+
led_connections[connection_index].is_on = false;
6184
}
6285

63-
led_connections[led_connections_count].next_on = millis() + start_delay;
64-
led_connections[led_connections_count].next_off = millis() + on_duration;
86+
led_connections[connection_index].next_on = millis() + start_delay;
87+
led_connections[connection_index].next_off = millis() + on_duration;
6588

6689
if (is_LED_added_already == false)
6790
{
6891
++led_connections_count;
6992
}
7093
}
7194

72-
void remove_led_connection(uint8_t type, uint8_t led_pin)
95+
void remove_led_connection(uint8_t type, uint8_t *id = 0)
7396
{
97+
if (id == 0)
98+
{
99+
Serial.print("remove_led_connection: Id of LED connection cannot be 0\n");
100+
return;
101+
}
102+
74103
for (int i = 0; i < led_connections_count; ++i)
75104
{
76105
gpio_connection cur_led_connection = led_connections[i];
77106

78-
if (cur_led_connection.io_pin == led_pin && cur_led_connection.type == type)
107+
if (compareArrays(cur_led_connection.id, id, 10) == true)
79108
{
80109
// Turn off this connection
81-
if (cur_led_connection.type == 0)
110+
if (led_connections[i].type == 0)
82111
{
83112
ledd.pwm(led_connections[i].io_pin, 0);
84113
}
85-
else if (cur_led_connection.type == 1)
114+
else if (led_connections[i].type == 1)
86115
{
87116
ledcWrite(led_connections[i].connection_index, 0);
88117
}
89118

90119
// Reset LED
91-
cur_led_connection.io_pin = 0;
92-
cur_led_connection.output_value = 0;
93-
cur_led_connection.connection_index = 0;
120+
led_connections[i].io_pin = 0;
121+
led_connections[i].output_value = 0;
122+
led_connections[i].connection_index = 0;
123+
for (uint8_t id_ind = 0; id_ind < 10; ++id_ind)
124+
{
125+
led_connections[i].id[id_ind] = 0;
126+
}
94127

95128
// Remove connection and
96129
for (uint8_t rem_ind = i; rem_ind < led_connections_count - 1; rem_ind++)

src/handlers/event_handler.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,18 @@ void handle_aspect_packet(DCCPacket *received_packet, DCCPacket *dcc_packet, Sta
7272

7373
Connection connection = board_connections[connection_id];
7474

75+
uint8_t id[10] = {0};
76+
id[0] = dcc_packet->address[0];
77+
id[1] = dcc_packet->address[1];
78+
id[2] = dcc_packet->user_data[0];
79+
7580
if (is_on == true)
7681
{
77-
add_led_connection(0, connection.output_num, (float)connection_value / 255.0, 0, 0, 0);
82+
add_led_connection(0, connection.output_num, (float)connection_value / 255.0, value.on_duration, value.off_duration, 0, id);
7883
}
7984
else
8085
{
81-
remove_led_connection(0, connection.output_num);
86+
remove_led_connection(0, id);
8287
}
8388
}
8489
}

structures.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct gpio_connection{
2727
unsigned long off_duration;
2828
double next_on;
2929
double next_off;
30+
uint8_t id[10];
3031
};
3132

3233
#endif

0 commit comments

Comments
 (0)