/* LED MODULE Copyright (C) 2020 by Maxim Prokhorov */ #pragma once #include "led.h" #include // Scans input string with format // ',, ,, ...' // Directly changing `led.pattern.delays` contents void _ledLoadPattern(led_t& led, const char* input) { char buffer[16]; const char* d1; const char* d2; const char* d3; const char* p = input; const char* marker; auto& pattern = led.pattern; pattern.delays.clear(); loop: /*!stags:re2c format = 'const char *@@;'; */ /*!re2c re2c:define:YYCTYPE = char; re2c:define:YYCURSOR = p; re2c:define:YYMARKER = marker; re2c:yyfill:enable = 0; re2c:yych:conversion = 1; re2c:indent:top = 1; end = "\x00"; wsp = [ \t]+; num = [0-9]+; * { return; } wsp { goto loop; } @d1 num [,] @d2 num [,] @d3 num { unsigned long on; unsigned long off; unsigned char repeats; memcpy(buffer, d1, int(d2 - d1)); buffer[int(d2 - d1 - 1)] = '\0'; on = strtoul(buffer, nullptr, 10); memcpy(buffer, d2, int(d3 - d2)); buffer[int(d3 - d2 - 1)] = '\0'; off = strtoul(buffer, nullptr, 10); memcpy(buffer, d3, int(p - d3)); buffer[int(p - d3)] = '\0'; repeats = strtoul(buffer, nullptr, 10); pattern.delays.emplace_back(on, off, repeats); goto loop; } */ }