From 8f08459a5a71efd1b5cf1c03caf7c773eabf950c Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 16 Dec 2020 19:28:44 +0100 Subject: [PATCH] 1mb --- data/items/analog-adc.txt | 1 - data/items/bme280-hum.txt | 1 - data/items/bme280-press.txt | 1 - data/items/bme280-temp.txt | 1 - data/items/bmp280-press.txt | 1 - data/items/bmp280-temp.txt | 1 - data/items/button-in.txt | 1 - data/items/button-out.inv.txt | 1 - data/items/button-out.npin.txt | 1 - data/items/button-out.pin.txt | 1 - data/items/count-down.txt | 1 - data/items/dallas-temp.txt | 1 - data/items/dht11-hum.txt | 1 - data/items/dht11-temp.txt | 1 - data/items/dht22-hum.txt | 1 - data/items/dht22-temp.txt | 1 - data/items/impuls-out.txt | 1 - data/items/input-digit.txt | 1 - data/items/input-time.txt | 1 - data/items/logging.txt | 1 - data/items/modbus.txt | 1 - data/items/output-text.txt | 1 - data/items/pwm-out.txt | 1 - data/items/uart-button.txt | 1 - data/items/uart-widget.txt | 1 - data/items/ultrasonic-cm.txt | 1 - data/items/uptime.txt | 1 - data/presets/1.c.txt | 5 - data/presets/1.s.txt | 8 - data/presets/2.c.txt | 12 - data/presets/2.s.txt | 18 - data/presets/3.c.txt | 5 - data/presets/3.s.txt | 8 - data/presets/4.c.txt | 4 - data/presets/4.s.txt | 8 - data/presets/5.c.txt | 7 - data/presets/5.s.txt | 16 - data/presets/6.c.txt | 3 - data/presets/6.s.txt | 6 - data/presets/7.c.txt | 4 - data/presets/7.s.txt | 10 - data/presets/8.c.txt | 4 - data/presets/8.s.txt | 7 - data/presets/9.c.txt | 2 - data/presets/9.s.txt | 3 - include/Consts.h | 15 +- include/Global.h | 4 +- include/SoftUART.h | 1 + include/Telegram.h | 3 +- include/items/SensorModbusClass.h | 89 -- lib/ModbusMaster/.github/ISSUE_TEMPLATE.md | 66 -- .../.github/PULL_REQUEST_TEMPLATE.md | 37 - lib/ModbusMaster/.github_changelog_generator | 8 - lib/ModbusMaster/.gitignore | 56 -- lib/ModbusMaster/.ruby-gemset | 1 - lib/ModbusMaster/.ruby-version | 1 - lib/ModbusMaster/.travis.yml | 30 - lib/ModbusMaster/CHANGELOG.md | 141 --- lib/ModbusMaster/CODE_OF_CONDUCT.md | 78 -- lib/ModbusMaster/CONTRIBUTING.md | 58 -- lib/ModbusMaster/Gemfile | 30 - lib/ModbusMaster/Gemfile.lock | 47 - lib/ModbusMaster/LICENSE | 201 ---- lib/ModbusMaster/Makefile | 19 - lib/ModbusMaster/README.md | 167 ---- lib/ModbusMaster/Rakefile | 218 ----- lib/ModbusMaster/STYLE.md | 372 -------- lib/ModbusMaster/VERSION | 1 - lib/ModbusMaster/examples/Basic/Basic.pde | 69 -- .../PhoenixContact_nanoLC.pde | 143 --- .../RS485_HalfDuplex/RS485_HalfDuplex.ino | 98 -- .../extras/ModbusMaster reference-2.0.1.pdf | Bin 206477 -> 0 bytes lib/ModbusMaster/extras/README.txt | 6 - lib/ModbusMaster/keywords.txt | 50 - lib/ModbusMaster/library.properties | 10 - lib/ModbusMaster/src/ModbusMaster.cpp | 876 ------------------ lib/ModbusMaster/src/ModbusMaster.h | 270 ------ lib/ModbusMaster/src/util/crc16.h | 88 -- lib/ModbusMaster/src/util/word.h | 64 -- platformio.ini | 3 +- src/BufferExecute.cpp | 6 - src/SoftUART.cpp | 1 + src/Telegram.cpp | 5 +- src/Utils/TimeUtils.cpp | 3 +- src/items/SensorModbusClass.cpp | 23 - src/main.cpp | 4 +- 86 files changed, 17 insertions(+), 3502 deletions(-) delete mode 100644 data/items/analog-adc.txt delete mode 100644 data/items/bme280-hum.txt delete mode 100644 data/items/bme280-press.txt delete mode 100644 data/items/bme280-temp.txt delete mode 100644 data/items/bmp280-press.txt delete mode 100644 data/items/bmp280-temp.txt delete mode 100644 data/items/button-in.txt delete mode 100644 data/items/button-out.inv.txt delete mode 100644 data/items/button-out.npin.txt delete mode 100644 data/items/button-out.pin.txt delete mode 100644 data/items/count-down.txt delete mode 100644 data/items/dallas-temp.txt delete mode 100644 data/items/dht11-hum.txt delete mode 100644 data/items/dht11-temp.txt delete mode 100644 data/items/dht22-hum.txt delete mode 100644 data/items/dht22-temp.txt delete mode 100644 data/items/impuls-out.txt delete mode 100644 data/items/input-digit.txt delete mode 100644 data/items/input-time.txt delete mode 100644 data/items/logging.txt delete mode 100644 data/items/modbus.txt delete mode 100644 data/items/output-text.txt delete mode 100644 data/items/pwm-out.txt delete mode 100644 data/items/uart-button.txt delete mode 100644 data/items/uart-widget.txt delete mode 100644 data/items/ultrasonic-cm.txt delete mode 100644 data/items/uptime.txt delete mode 100644 data/presets/1.c.txt delete mode 100644 data/presets/1.s.txt delete mode 100644 data/presets/2.c.txt delete mode 100644 data/presets/2.s.txt delete mode 100644 data/presets/3.c.txt delete mode 100644 data/presets/3.s.txt delete mode 100644 data/presets/4.c.txt delete mode 100644 data/presets/4.s.txt delete mode 100644 data/presets/5.c.txt delete mode 100644 data/presets/5.s.txt delete mode 100644 data/presets/6.c.txt delete mode 100644 data/presets/6.s.txt delete mode 100644 data/presets/7.c.txt delete mode 100644 data/presets/7.s.txt delete mode 100644 data/presets/8.c.txt delete mode 100644 data/presets/8.s.txt delete mode 100644 data/presets/9.c.txt delete mode 100644 data/presets/9.s.txt delete mode 100644 include/items/SensorModbusClass.h delete mode 100644 lib/ModbusMaster/.github/ISSUE_TEMPLATE.md delete mode 100644 lib/ModbusMaster/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 lib/ModbusMaster/.github_changelog_generator delete mode 100644 lib/ModbusMaster/.gitignore delete mode 100644 lib/ModbusMaster/.ruby-gemset delete mode 100644 lib/ModbusMaster/.ruby-version delete mode 100644 lib/ModbusMaster/.travis.yml delete mode 100644 lib/ModbusMaster/CHANGELOG.md delete mode 100644 lib/ModbusMaster/CODE_OF_CONDUCT.md delete mode 100644 lib/ModbusMaster/CONTRIBUTING.md delete mode 100644 lib/ModbusMaster/Gemfile delete mode 100644 lib/ModbusMaster/Gemfile.lock delete mode 100644 lib/ModbusMaster/LICENSE delete mode 100644 lib/ModbusMaster/Makefile delete mode 100644 lib/ModbusMaster/README.md delete mode 100644 lib/ModbusMaster/Rakefile delete mode 100644 lib/ModbusMaster/STYLE.md delete mode 100644 lib/ModbusMaster/VERSION delete mode 100644 lib/ModbusMaster/examples/Basic/Basic.pde delete mode 100644 lib/ModbusMaster/examples/PhoenixContact_nanoLC/PhoenixContact_nanoLC.pde delete mode 100644 lib/ModbusMaster/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino delete mode 100644 lib/ModbusMaster/extras/ModbusMaster reference-2.0.1.pdf delete mode 100644 lib/ModbusMaster/extras/README.txt delete mode 100644 lib/ModbusMaster/keywords.txt delete mode 100644 lib/ModbusMaster/library.properties delete mode 100644 lib/ModbusMaster/src/ModbusMaster.cpp delete mode 100644 lib/ModbusMaster/src/ModbusMaster.h delete mode 100644 lib/ModbusMaster/src/util/crc16.h delete mode 100644 lib/ModbusMaster/src/util/word.h delete mode 100644 src/items/SensorModbusClass.cpp diff --git a/data/items/analog-adc.txt b/data/items/analog-adc.txt deleted file mode 100644 index 8bc0e914..00000000 --- a/data/items/analog-adc.txt +++ /dev/null @@ -1 +0,0 @@ -0;analog-adc;id;fillgauge;Сенсоры;Аналоговый;order;gol;map[0,1024,0,100];c[1] \ No newline at end of file diff --git a/data/items/bme280-hum.txt b/data/items/bme280-hum.txt deleted file mode 100644 index c8afd255..00000000 --- a/data/items/bme280-hum.txt +++ /dev/null @@ -1 +0,0 @@ -0;bme280-hum;id;anydataHum;Сенсоры;Влажность;order;addr[0x76];c[1] \ No newline at end of file diff --git a/data/items/bme280-press.txt b/data/items/bme280-press.txt deleted file mode 100644 index f79973e2..00000000 --- a/data/items/bme280-press.txt +++ /dev/null @@ -1 +0,0 @@ -0;bme280-press;id;anydataPress;Сенсоры;Давление;order;addr[0x76];c[1] \ No newline at end of file diff --git a/data/items/bme280-temp.txt b/data/items/bme280-temp.txt deleted file mode 100644 index 6e5e9003..00000000 --- a/data/items/bme280-temp.txt +++ /dev/null @@ -1 +0,0 @@ -0;bme280-temp;id;anydataTemp;Сенсоры;Температура;order;addr[0x76];c[1] \ No newline at end of file diff --git a/data/items/bmp280-press.txt b/data/items/bmp280-press.txt deleted file mode 100644 index 44b9e8c9..00000000 --- a/data/items/bmp280-press.txt +++ /dev/null @@ -1 +0,0 @@ -0;bmp280-press;id;anydataPress;Сенсоры;Давление;order;addr[0x76];c[1] \ No newline at end of file diff --git a/data/items/bmp280-temp.txt b/data/items/bmp280-temp.txt deleted file mode 100644 index c3cb42eb..00000000 --- a/data/items/bmp280-temp.txt +++ /dev/null @@ -1 +0,0 @@ -0;bmp280-temp;id;anydataTemp;Сенсоры;Температура;order;addr[0x76];c[1] \ No newline at end of file diff --git a/data/items/button-in.txt b/data/items/button-in.txt deleted file mode 100644 index 79d79ec9..00000000 --- a/data/items/button-in.txt +++ /dev/null @@ -1 +0,0 @@ -0;button-in;id;toggle;Кнопки;Освещение;order;pin;db[20] \ No newline at end of file diff --git a/data/items/button-out.inv.txt b/data/items/button-out.inv.txt deleted file mode 100644 index 5499a108..00000000 --- a/data/items/button-out.inv.txt +++ /dev/null @@ -1 +0,0 @@ -0;button-out;id;toggle;Кнопки;Освещение;order;pin;inv[1] \ No newline at end of file diff --git a/data/items/button-out.npin.txt b/data/items/button-out.npin.txt deleted file mode 100644 index ecffd881..00000000 --- a/data/items/button-out.npin.txt +++ /dev/null @@ -1 +0,0 @@ -0;button-out;id;toggle;Кнопки;Освещение;order \ No newline at end of file diff --git a/data/items/button-out.pin.txt b/data/items/button-out.pin.txt deleted file mode 100644 index b0645025..00000000 --- a/data/items/button-out.pin.txt +++ /dev/null @@ -1 +0,0 @@ -0;button-out;id;toggle;Кнопки;Освещение;order;pin \ No newline at end of file diff --git a/data/items/count-down.txt b/data/items/count-down.txt deleted file mode 100644 index 3300573c..00000000 --- a/data/items/count-down.txt +++ /dev/null @@ -1 +0,0 @@ -0;count-down;id;anydata;Таймер;Обратный#отчет;order \ No newline at end of file diff --git a/data/items/dallas-temp.txt b/data/items/dallas-temp.txt deleted file mode 100644 index 0da8bdca..00000000 --- a/data/items/dallas-temp.txt +++ /dev/null @@ -1 +0,0 @@ -0;dallas-temp;id;anydataTemp;Сенсоры;Температура;order;sal;index[0];int[10] \ No newline at end of file diff --git a/data/items/dht11-hum.txt b/data/items/dht11-hum.txt deleted file mode 100644 index b7d9a820..00000000 --- a/data/items/dht11-hum.txt +++ /dev/null @@ -1 +0,0 @@ -0;dht-hum;id;anydataHum;Сенсоры;Влажность;order;thd;type[dht11];c[1] \ No newline at end of file diff --git a/data/items/dht11-temp.txt b/data/items/dht11-temp.txt deleted file mode 100644 index 39c5e949..00000000 --- a/data/items/dht11-temp.txt +++ /dev/null @@ -1 +0,0 @@ -0;dht-temp;id;anydataTemp;Сенсоры;Температура;order;thd;type[dht11];c[1] \ No newline at end of file diff --git a/data/items/dht22-hum.txt b/data/items/dht22-hum.txt deleted file mode 100644 index ab69cf97..00000000 --- a/data/items/dht22-hum.txt +++ /dev/null @@ -1 +0,0 @@ -0;dht-hum;id;anydataHum;Сенсоры;Влажность;order;thd;type[dht22];c[1] \ No newline at end of file diff --git a/data/items/dht22-temp.txt b/data/items/dht22-temp.txt deleted file mode 100644 index d14a434d..00000000 --- a/data/items/dht22-temp.txt +++ /dev/null @@ -1 +0,0 @@ -0;dht-temp;id;anydataTemp;Сенсоры;Температура;order;thd;type[dht22];c[1] \ No newline at end of file diff --git a/data/items/impuls-out.txt b/data/items/impuls-out.txt deleted file mode 100644 index 99994ae5..00000000 --- a/data/items/impuls-out.txt +++ /dev/null @@ -1 +0,0 @@ -0;impuls-out;id;na;na;na;order;pin \ No newline at end of file diff --git a/data/items/input-digit.txt b/data/items/input-digit.txt deleted file mode 100644 index 7df7260e..00000000 --- a/data/items/input-digit.txt +++ /dev/null @@ -1 +0,0 @@ -0;inoutput;id;inputDigit;Ввод;Введите#цифру;order \ No newline at end of file diff --git a/data/items/input-time.txt b/data/items/input-time.txt deleted file mode 100644 index 3fc078b0..00000000 --- a/data/items/input-time.txt +++ /dev/null @@ -1 +0,0 @@ -0;inoutput;id;inputTime;Ввод;Введите#время;order \ No newline at end of file diff --git a/data/items/logging.txt b/data/items/logging.txt deleted file mode 100644 index 8253774f..00000000 --- a/data/items/logging.txt +++ /dev/null @@ -1 +0,0 @@ -0;logging;id;chart;Графики;История;order;val[any];int[60];cnt[100] \ No newline at end of file diff --git a/data/items/modbus.txt b/data/items/modbus.txt deleted file mode 100644 index a782395a..00000000 --- a/data/items/modbus.txt +++ /dev/null @@ -1 +0,0 @@ -0;modbus;id;anydata;Modbus;Регистр;order;addr[1];reg[0];c[1] \ No newline at end of file diff --git a/data/items/output-text.txt b/data/items/output-text.txt deleted file mode 100644 index 65d45284..00000000 --- a/data/items/output-text.txt +++ /dev/null @@ -1 +0,0 @@ -0;inoutput;id;anydata;Вывод;Сигнализация;order \ No newline at end of file diff --git a/data/items/pwm-out.txt b/data/items/pwm-out.txt deleted file mode 100644 index 2acbb459..00000000 --- a/data/items/pwm-out.txt +++ /dev/null @@ -1 +0,0 @@ -0;pwm-out;id;range;Ползунки;Яркость;order;pin \ No newline at end of file diff --git a/data/items/uart-button.txt b/data/items/uart-button.txt deleted file mode 100644 index ee2a6b22..00000000 --- a/data/items/uart-button.txt +++ /dev/null @@ -1 +0,0 @@ -0;button-out;id;toggle;Кнопки;Освещение;order;type[UART] \ No newline at end of file diff --git a/data/items/uart-widget.txt b/data/items/uart-widget.txt deleted file mode 100644 index 469ab016..00000000 --- a/data/items/uart-widget.txt +++ /dev/null @@ -1 +0,0 @@ -0;inoutput;id;anydata;Вывод;Вывод#uart;order \ No newline at end of file diff --git a/data/items/ultrasonic-cm.txt b/data/items/ultrasonic-cm.txt deleted file mode 100644 index c5d518c3..00000000 --- a/data/items/ultrasonic-cm.txt +++ /dev/null @@ -1 +0,0 @@ -0;ultrasonic-cm;id;anydata;Сенсоры;Расстояние;order;cin;map[0,500,0,100];c[1];int[10] \ No newline at end of file diff --git a/data/items/uptime.txt b/data/items/uptime.txt deleted file mode 100644 index 972241b4..00000000 --- a/data/items/uptime.txt +++ /dev/null @@ -1 +0,0 @@ -0;uptime;id;anydataTime;Системные;%name%#uptime;order \ No newline at end of file diff --git a/data/presets/1.c.txt b/data/presets/1.c.txt deleted file mode 100644 index abcd06dc..00000000 --- a/data/presets/1.c.txt +++ /dev/null @@ -1,5 +0,0 @@ -0;dallas-temp;temp;anydataTemp;Термостат;Температура;1;pin[2];index[0];int[10] -0;logging;log;chart;Термостат;История;2;val[temp];int[60];cnt[100] -0;inoutput;inputU;inputDigit;Термостат;Верхний#порог;3 -0;inoutput;inputL;inputDigit;Термостат;Нижний#порог;4 -0;button-out;button;toggle;Термостат;Нагрев;5;pin[12] \ No newline at end of file diff --git a/data/presets/1.s.txt b/data/presets/1.s.txt deleted file mode 100644 index dc4c8c07..00000000 --- a/data/presets/1.s.txt +++ /dev/null @@ -1,8 +0,0 @@ -temp > inputU -button 0 -telegram нагрев#выключен 1 -end -temp < inputL -button 1 -telegram нагрев#включен 1 -end \ No newline at end of file diff --git a/data/presets/2.c.txt b/data/presets/2.c.txt deleted file mode 100644 index d91fa5c7..00000000 --- a/data/presets/2.c.txt +++ /dev/null @@ -1,12 +0,0 @@ -0;dallas-temp;temp;anydataTemp;Термостат;Температура;1;pin[2];index[0];int[60] -0;logging;log;chart;Термостат;История;2;val[temp];int[10];cnt[100] -0;inoutput;threshold;inputDigitTemp;Термостат;Заданная#температура;3 -0;button-out;heater;toggle;Термостат;Нагреватель;7;pin[12] -0;inoutput;time1;inputTimeClock;Расписание;Утренний#период;8 -0;inoutput;threshold1;inputDigitTemp;Расписание;Температура;9 -0;inoutput;time2;inputTimeClock;Расписание;Дневной#период;10 -0;inoutput;threshold2;inputDigitTemp;Расписание;Температура;11 -0;inoutput;time3;inputTimeClock;Расписание;Вечерний#период;12 -0;inoutput;threshold3;inputDigitTemp;Расписание;Температура;13 -0;inoutput;time4;inputTimeClock;Расписание;Ночной#период;14 -0;inoutput;threshold4;inputDigitTemp;Расписание;Температура;15 \ No newline at end of file diff --git a/data/presets/2.s.txt b/data/presets/2.s.txt deleted file mode 100644 index 5a6f36f1..00000000 --- a/data/presets/2.s.txt +++ /dev/null @@ -1,18 +0,0 @@ -temp > threshold+-2 -heater 0 -end -temp < threshold+-2 -heater 1 -end -timenow = time1 -threshold threshold1 -end -timenow = time2 -threshold threshold2 -end -timenow = time3 -threshold threshold3 -end -timenow = time4 -threshold threshold4 -end \ No newline at end of file diff --git a/data/presets/3.c.txt b/data/presets/3.c.txt deleted file mode 100644 index fb2c602b..00000000 --- a/data/presets/3.c.txt +++ /dev/null @@ -1,5 +0,0 @@ -0;dht-hum;hum;anydataHum;Теплица;Влажность;1;pin[2];type[dht11];c[1] -0;logging;log;chart;Теплица;История;2;val[hum];int[60];cnt[100] -0;inoutput;inputU;inputDigit;Теплица;Верхний#порог;3 -0;inoutput;inputL;inputDigit;Теплица;Нижний#порог;4 -0;button-out;button;toggle;Теплица;Полив;5;pin[12] \ No newline at end of file diff --git a/data/presets/3.s.txt b/data/presets/3.s.txt deleted file mode 100644 index f69cdc54..00000000 --- a/data/presets/3.s.txt +++ /dev/null @@ -1,8 +0,0 @@ -hum > inputU -button 0 -telegram полив#выключен 1 -end -hum < inputL -button 1 -telegram полив#включен 1 -end \ No newline at end of file diff --git a/data/presets/4.c.txt b/data/presets/4.c.txt deleted file mode 100644 index 3f1ccaa1..00000000 --- a/data/presets/4.c.txt +++ /dev/null @@ -1,4 +0,0 @@ -0;button-out;button1;toggle;Реле;Освещение;1;pin[12] -0;button-out;button2;toggle;Реле;Освещение;2;pin[13] -0;inoutput;T1;inputTime;Реле;Введите#время#включения;3 -0;inoutput;T2;inputTime;Реле;Введите#время#выключения;4 \ No newline at end of file diff --git a/data/presets/4.s.txt b/data/presets/4.s.txt deleted file mode 100644 index 844d1c5b..00000000 --- a/data/presets/4.s.txt +++ /dev/null @@ -1,8 +0,0 @@ -timenow = T1 -button1 1 -button2 0 -end -timenow = T2 -button1 0 -button2 1 -end \ No newline at end of file diff --git a/data/presets/5.c.txt b/data/presets/5.c.txt deleted file mode 100644 index 359a7a52..00000000 --- a/data/presets/5.c.txt +++ /dev/null @@ -1,7 +0,0 @@ -0;button-out;button-out-1;toggle;Кнопки;Выключить#все;1 -0;button-out;button-out-2;toggle;Кнопки;Гостинная;2;pin[12] -0;button-out;button-out-3;toggle;Кнопки;Спальня;3;pin[13] -0;button-out;button-out-4;toggle;Кнопки;Прихожая;4;pin[14] -0;pwm-out;pwm-out-5;range;Кнопки;Яркость;5;pin[15] -0;pwm-out;pwm-out-6;range;Кнопки;Яркость;6;pin[16] -0;inoutput;output-text-7;anydata;Кнопки;Статус;7 \ No newline at end of file diff --git a/data/presets/5.s.txt b/data/presets/5.s.txt deleted file mode 100644 index 0424728a..00000000 --- a/data/presets/5.s.txt +++ /dev/null @@ -1,16 +0,0 @@ -button-out-1 = 1 -button-out-2 1 -button-out-3 1 -button-out-4 1 -pwm-out-5 200 -pwm-out-6 800 -output-text-7 включено -end -button-out-1 = 0 -button-out-2 0 -button-out-3 0 -button-out-4 0 -pwm-out-5 800 -pwm-out-6 200 -output-text-7 выключено -end \ No newline at end of file diff --git a/data/presets/6.c.txt b/data/presets/6.c.txt deleted file mode 100644 index c7fd096a..00000000 --- a/data/presets/6.c.txt +++ /dev/null @@ -1,3 +0,0 @@ -0;button-out;button;toggle;Таймер;Освещение;1;pin[12] -0;count-down;count;anydata;Таймер;Обратный#отчет;2 -0;inoutput;input;inputDigit;Таймер;Введите#цифру;3 \ No newline at end of file diff --git a/data/presets/6.s.txt b/data/presets/6.s.txt deleted file mode 100644 index 06b70a4a..00000000 --- a/data/presets/6.s.txt +++ /dev/null @@ -1,6 +0,0 @@ -button = 1 -count input -end -count = 0 -button 0 -end \ No newline at end of file diff --git a/data/presets/7.c.txt b/data/presets/7.c.txt deleted file mode 100644 index 984c6b8d..00000000 --- a/data/presets/7.c.txt +++ /dev/null @@ -1,4 +0,0 @@ -0;inoutput;text;anydataAlarm;Сигнализация;Движение:;1 -0;inoutput;time;anydataTime;Сигнализация;Время:;2 -0;button-in;sensor;na;na;na;3;pin[0];db[20] -0;button-out;reset;toggle;Сигнализация;Сбросить;4 \ No newline at end of file diff --git a/data/presets/7.s.txt b/data/presets/7.s.txt deleted file mode 100644 index 32d28e78..00000000 --- a/data/presets/7.s.txt +++ /dev/null @@ -1,10 +0,0 @@ -sensor = 1 -text обнаружено -time %date% -telegram text обнаружено#движение 1 -end -reset = 1 -text не#обнаружено -time %date% -reset 0 -end \ No newline at end of file diff --git a/data/presets/8.c.txt b/data/presets/8.c.txt deleted file mode 100644 index d18bdd0b..00000000 --- a/data/presets/8.c.txt +++ /dev/null @@ -1,4 +0,0 @@ -0;button-in;sensor;na;na;na;1;pin[0];db[20] -0;button-out;light;toggle;Освещение;Освещение;2;pin[13] -0;count-down;count;anydata;Освещение;Обратный#отчет;3 -0;inoutput;period;inputDigit;Освещение;Период#включения;4 \ No newline at end of file diff --git a/data/presets/8.s.txt b/data/presets/8.s.txt deleted file mode 100644 index 10d55654..00000000 --- a/data/presets/8.s.txt +++ /dev/null @@ -1,7 +0,0 @@ -sensor = 1 -light 1 -count period -end -count = 0 -light 0 -end \ No newline at end of file diff --git a/data/presets/9.c.txt b/data/presets/9.c.txt deleted file mode 100644 index 502f3ae4..00000000 --- a/data/presets/9.c.txt +++ /dev/null @@ -1,2 +0,0 @@ -0;button-out;light;toggle;Кнопки;Освещение;1;pin[13] -0;button-in;switch;na;na;na;2;pin[0];db[20] \ No newline at end of file diff --git a/data/presets/9.s.txt b/data/presets/9.s.txt deleted file mode 100644 index 6f6d7dcc..00000000 --- a/data/presets/9.s.txt +++ /dev/null @@ -1,3 +0,0 @@ -switch = 1 -light change -end \ No newline at end of file diff --git a/include/Consts.h b/include/Consts.h index d8a40cfb..0bce4c82 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -17,22 +17,16 @@ //===========FileSystem============================================================================================================================================== #define littlefs_on - //================================================================================================================================================================== #define NUM_BUTTONS 6 #define LED_PIN 2 - //===========MQTT================================================================================================================================================= #define MQTT_RECONNECT_INTERVAL 20000 - //==========Telemetry============================================================================================================================================= #define TELEMETRY_UPDATE_INTERVAL_MIN 60 - //=========Configuration========================================================================================================================================== #define DEVICE_CONFIG_FILE "s.conf.csv" #define DEVICE_SCENARIO_FILE "s.scen.txt" - - //=========System parts=========================================================================================================================================== //#define OTA_UPDATES_ENABLED //#define MDNS_ENABLED @@ -40,17 +34,14 @@ //#define LAYOUT_IN_RAM //#define UDP_ENABLED //#define SSDP_ENABLED - //=========Sensors enable/disable================================================================================================================================= #define SensorBme280Enabled #define SensorBmp280Enabled #define SensorDhtEnabled #define PwmOutEnable -//#define SensorModbusEnabled - -//=========others================================================================================================================================= -//#define telegram -//#define uartEnable +//=========Features================================================================================================================================= +//#define telegramEnable +#define uartEnable diff --git a/include/Global.h b/include/Global.h index 4be48511..b4ca622a 100644 --- a/include/Global.h +++ b/include/Global.h @@ -1,5 +1,6 @@ #pragma once //===================Libraries=================================================================================================================================================== +#include "Consts.h" #include #include #include @@ -15,14 +16,13 @@ #include #include #include - #include "Clock.h" -#include "Consts.h" #include "ESP32.h" #include "ESP8266.h" #include "GyverFilters.h" #include "MqttClient.h" #include "Upgrade.h" + #include "Utils/FileUtils.h" #include "Utils/JsonUtils.h" #include "Utils/SerialPrint.h" diff --git a/include/SoftUART.h b/include/SoftUART.h index a566e06a..8b928a36 100644 --- a/include/SoftUART.h +++ b/include/SoftUART.h @@ -1,4 +1,5 @@ #pragma once +#include "Consts.h" #ifdef uartEnable #include "SoftwareSerial.h" diff --git a/include/Telegram.h b/include/Telegram.h index 6b04b878..7b3c656d 100644 --- a/include/Telegram.h +++ b/include/Telegram.h @@ -1,5 +1,6 @@ #pragma once -#ifdef telegram +#include "Consts.h" +#ifdef telegramEnable #include "Global.h" extern void sendTelegramMsg(); diff --git a/include/items/SensorModbusClass.h b/include/items/SensorModbusClass.h deleted file mode 100644 index 9f13e166..00000000 --- a/include/items/SensorModbusClass.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -#include "Consts.h" -#ifdef SensorModbusEnabled -#include -#include -#include -#include "Class/LineParsing.h" -#include "Global.h" -#include "items/SensorConvertingClass.h" - -ModbusMaster modbus1; -SoftwareSerial uart(13, 12); // RX, TX - -class SensorModbusClass : public SensorConvertingClass { - public: - SensorModbusClass() : SensorConvertingClass(){}; - - void SensorModbusInit() { - uart.begin(9600); - jsonWriteStr(configOptionJson, _key + "_map", _map); - jsonWriteStr(configOptionJson, _key + "_с", _c); - sensorReadingMap10sec += _key + " " + _addr + " " + _reg + ","; - Serial.println(sensorReadingMap10sec); - } - - void SensorModbusRead(String key, uint8_t slaveAddress, uint16_t regAddress) { - int value; - - modbus1.begin(slaveAddress, uart); - uint16_t reqisterValue = modbus1.readHoldingRegisters(regAddress, 1); - if (getResultMsg(&modbus1, reqisterValue)) { - reqisterValue = modbus1.getResponseBuffer(0); - value = reqisterValue; - } else { - value = NULL; - } - - int valueFl = this->correction(key, value); - eventGen2(key, String(valueFl)); - jsonWriteStr(configLiveJson, key, String(valueFl)); - publishStatus(key, String(valueFl)); - SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl) + ", Slave dev addr: " + String(slaveAddress) + ", Register: " + String(regAddress)); - } - - bool getResultMsg(ModbusMaster* modbus1, uint16_t result) { - String tmpstr; - switch (result) { - case modbus1->ku8MBSuccess: - return true; - tmpstr += "Ok"; - break; - case modbus1->ku8MBIllegalFunction: - tmpstr += "Illegal Function"; - break; - case modbus1->ku8MBIllegalDataAddress: - tmpstr += "Illegal Data Address"; - break; - case modbus1->ku8MBIllegalDataValue: - tmpstr += "Illegal Data Value"; - break; - case modbus1->ku8MBSlaveDeviceFailure: - tmpstr += "Slave Device Failure"; - break; - case modbus1->ku8MBInvalidSlaveID: - tmpstr += "Invalid Slave ID"; - break; - case modbus1->ku8MBInvalidFunction: - tmpstr += "Invalid Function"; - break; - case modbus1->ku8MBResponseTimedOut: - tmpstr += "Response Timed Out"; - break; - case modbus1->ku8MBInvalidCRC: - tmpstr += "Invalid CRC"; - break; - default: - tmpstr += "Unknown error: " + String(result); - break; - } - SerialPrint("I", "Modbus", tmpstr); - return false; - } -}; -extern SensorModbusClass mySensorModbus; - -extern void modbus(); -extern void modbusReading(); - -#endif \ No newline at end of file diff --git a/lib/ModbusMaster/.github/ISSUE_TEMPLATE.md b/lib/ModbusMaster/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 7ae83e53..00000000 --- a/lib/ModbusMaster/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,66 +0,0 @@ - - - -### ModbusMaster version -[Version of the project where you are encountering the issue] - -### Arduino IDE version -[Version of Arduino IDE in your environment] - -### Arduino Hardware -[Hardware information, including board and processor] - -### Platform Details -[Operating system distribution and release version] - ---- - -### Scenario: -[What you are trying to achieve and you can't?] - -### Steps to Reproduce: -[If you are filing an issue what are the things we need to do in order to repro your problem? How are you using this project or any resources it includes?] - -### Expected Result: -[What are you expecting to happen as the consequence of above reproduction steps?] - -### Actual Result: -[What actually happens after the reproduction steps? Include the error output or a link to a gist if possible.] - ---- - -### Feature Request - -#### Narrative: - -```` text -As a [role] -I want [feature] -So that [benefit] -```` - -#### Acceptance Criteria: - -```` text -Scenario 1: Title -Given [context] - And [some more context]... -When [event] -Then [outcome] - And [another outcome]... -```` diff --git a/lib/ModbusMaster/.github/PULL_REQUEST_TEMPLATE.md b/lib/ModbusMaster/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 1039f974..00000000 --- a/lib/ModbusMaster/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,37 +0,0 @@ - -### Description -[Describe what this change achieves] - -### Issues Resolved -[List any existing issues this PR resolves; include Fixes #xxx or Closes #xxx (where xxx is issue number)] - -### Check List - -General - -- [ ] Code follows coding style defined in STYLE.md -- [ ] Doxygen comments are included inline with code -- [ ] No unnecessary whitespace; check with `git diff --check` before committing. - -The following have been modified to reflect new features, if warranted - -- [ ] README.md -- [ ] keywords.txt (use tabs as whitespace separators) -- [ ] library.properties -- [ ] examples/ - update or create new ones, as warranted - -The following have **NOT** been modified - -- [ ] doc/ - will be updated upon versioned release -- [ ] .ruby-gemset -- [ ] .ruby-version -- [ ] CHANGELOG.md - will be updated upon versioned release (HISTORY.md is deprecated) -- [ ] Gemfile -- [ ] LICENSE -- [ ] VERSION - will be updated upon versioned release diff --git a/lib/ModbusMaster/.github_changelog_generator b/lib/ModbusMaster/.github_changelog_generator deleted file mode 100644 index 1a846259..00000000 --- a/lib/ModbusMaster/.github_changelog_generator +++ /dev/null @@ -1,8 +0,0 @@ -add_issues_wo_labels=false -add_pr_wo_labels=false -enhancement-labels=Type: Enhancement -bug-labels=Type: Bug -exclude-labels=Type: Question -header=# ModbusMaster CHANGELOG -include-labels=Type: Bug,Type: Enhancement,Type: Feature Request,Type: Maintenance -future-release=Unreleased diff --git a/lib/ModbusMaster/.gitignore b/lib/ModbusMaster/.gitignore deleted file mode 100644 index d52f89eb..00000000 --- a/lib/ModbusMaster/.gitignore +++ /dev/null @@ -1,56 +0,0 @@ -#---------------------------------------------------------------- ModbusMaster -doc/html/ -doc/latex/ - - -#-------------- https://github.com/github/gitignore/blob/master/Ruby.gitignore -*.gem -*.rbc -/.config -/coverage/ -/InstalledFiles -/pkg/ -/spec/reports/ -/spec/examples.txt -/test/tmp/ -/test/version_tmp/ -/tmp/ - -# Used by dotenv library to load environment variables. -# .env - -## Specific to RubyMotion: -.dat* -.repl_history -build/ -*.bridgesupport -build-iPhoneOS/ -build-iPhoneSimulator/ - -## Specific to RubyMotion (use of CocoaPods): -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# vendor/Pods/ - -## Documentation cache and generated files: -/.yardoc/ -/_yardoc/ -/doc/ -/rdoc/ - -## Environment normalization: -/.bundle/ -/vendor/bundle -/lib/bundler/man/ - -# for a library or gem, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# Gemfile.lock -# .ruby-version -# .ruby-gemset - -# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: -.rvmrc diff --git a/lib/ModbusMaster/.ruby-gemset b/lib/ModbusMaster/.ruby-gemset deleted file mode 100644 index b47d0eb8..00000000 --- a/lib/ModbusMaster/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -global diff --git a/lib/ModbusMaster/.ruby-version b/lib/ModbusMaster/.ruby-version deleted file mode 100644 index 2bf1c1cc..00000000 --- a/lib/ModbusMaster/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.3.1 diff --git a/lib/ModbusMaster/.travis.yml b/lib/ModbusMaster/.travis.yml deleted file mode 100644 index a9cbf868..00000000 --- a/lib/ModbusMaster/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: python - -python: - - 2.7 - -sudo: false - -cache: - directories: - - ~/.platformio - -# update Makefile if target boards added -env: - - PLATFORMIO_BOARD=uno - - PLATFORMIO_BOARD=due - - PLATFORMIO_BOARD=huzzah - - PLATFORMIO_BOARD=genuino101 - - PLATFORMIO_BOARD=teensy31 - -install: - - pip install -U platformio - -before_script: - - env - - echo $HOME - - echo $TRAVIS_BUILD_DIR - - ls -al $PWD - -script: - - make build diff --git a/lib/ModbusMaster/CHANGELOG.md b/lib/ModbusMaster/CHANGELOG.md deleted file mode 100644 index c5d1fe02..00000000 --- a/lib/ModbusMaster/CHANGELOG.md +++ /dev/null @@ -1,141 +0,0 @@ -# ModbusMaster CHANGELOG - -## [v2.0.0](https://github.com/4-20ma/ModbusMaster/tree/v2.0.0) (2016-09-24) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v1.0.0...v2.0.0) - -**Implemented enhancements:** - -- BREAK: Update library to match IDE 1.5 spec v2.1 [\#81](https://github.com/4-20ma/ModbusMaster/pull/81) ([4-20ma](https://github.com/4-20ma)) -- Use platformio to build multiple boards [\#79](https://github.com/4-20ma/ModbusMaster/pull/79) ([4-20ma](https://github.com/4-20ma)) - -**Closed issues:** - -- Use platformio to build against multiple boards [\#78](https://github.com/4-20ma/ModbusMaster/issues/78) -- Add ruby files to .gitignore [\#75](https://github.com/4-20ma/ModbusMaster/issues/75) -- Reorder Installation section of README [\#73](https://github.com/4-20ma/ModbusMaster/issues/73) -- Update README [\#71](https://github.com/4-20ma/ModbusMaster/issues/71) -- Rename HISTORY to CHANGELOG [\#47](https://github.com/4-20ma/ModbusMaster/issues/47) -- Update library to match 1.5 specification [\#14](https://github.com/4-20ma/ModbusMaster/issues/14) - -**Merged pull requests:** - -- Use relative path to examples [\#80](https://github.com/4-20ma/ModbusMaster/pull/80) ([4-20ma](https://github.com/4-20ma)) -- Add files to .gitignore [\#76](https://github.com/4-20ma/ModbusMaster/pull/76) ([4-20ma](https://github.com/4-20ma)) -- Reorder installation section of README [\#74](https://github.com/4-20ma/ModbusMaster/pull/74) ([4-20ma](https://github.com/4-20ma)) -- Update README [\#72](https://github.com/4-20ma/ModbusMaster/pull/72) ([4-20ma](https://github.com/4-20ma)) -- Automate CHANGELOG generation [\#68](https://github.com/4-20ma/ModbusMaster/pull/68) ([4-20ma](https://github.com/4-20ma)) - -## [v1.0.0](https://github.com/4-20ma/ModbusMaster/tree/v1.0.0) (2016-09-12) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.11.0...v1.0.0) - -**Implemented enhancements:** - -- Add LICENSE, convert project to Apache 2.0 [\#67](https://github.com/4-20ma/ModbusMaster/pull/67) ([4-20ma](https://github.com/4-20ma)) -- Add example sketch for half-duplex RS485 [\#66](https://github.com/4-20ma/ModbusMaster/pull/66) ([kintel](https://github.com/kintel)) -- Add continuous integration testing with Travis CI [\#63](https://github.com/4-20ma/ModbusMaster/pull/63) ([4-20ma](https://github.com/4-20ma)) -- Disable \_\_MODBUSMASTER\_DEBUG\_\_ mode by default [\#43](https://github.com/4-20ma/ModbusMaster/pull/43) ([kintel](https://github.com/kintel)) - -**Closed issues:** - -- Fix documentation references in ModbusMaster.h, .cpp [\#69](https://github.com/4-20ma/ModbusMaster/issues/69) -- Clean up template wording [\#64](https://github.com/4-20ma/ModbusMaster/issues/64) -- Add Label section to CONTRIBUTING [\#60](https://github.com/4-20ma/ModbusMaster/issues/60) -- Update README contact information [\#58](https://github.com/4-20ma/ModbusMaster/issues/58) -- Add continuous integration testing with travis [\#55](https://github.com/4-20ma/ModbusMaster/issues/55) -- Add Code of Conduct [\#54](https://github.com/4-20ma/ModbusMaster/issues/54) -- Create PULL\_REQUEST\_TEMPLATE [\#49](https://github.com/4-20ma/ModbusMaster/issues/49) -- Create ISSUE\_TEMPLATE [\#48](https://github.com/4-20ma/ModbusMaster/issues/48) -- Change license to Apache 2.0 [\#45](https://github.com/4-20ma/ModbusMaster/issues/45) -- Set \_\_MODBUSMASTER\_DEBUG\_\_ to 0 by default [\#35](https://github.com/4-20ma/ModbusMaster/issues/35) -- Pass Stream object instead of integer reference [\#17](https://github.com/4-20ma/ModbusMaster/issues/17) - -**Merged pull requests:** - -- Add documentation cross-references [\#70](https://github.com/4-20ma/ModbusMaster/pull/70) ([4-20ma](https://github.com/4-20ma)) -- Clean up ISSUE/PULL\_REQUEST templates [\#65](https://github.com/4-20ma/ModbusMaster/pull/65) ([4-20ma](https://github.com/4-20ma)) -- Add initial .travis.yml configuration [\#62](https://github.com/4-20ma/ModbusMaster/pull/62) ([4-20ma](https://github.com/4-20ma)) -- Add label guidance to CONTRIBUTING [\#61](https://github.com/4-20ma/ModbusMaster/pull/61) ([4-20ma](https://github.com/4-20ma)) -- Update README contact information [\#59](https://github.com/4-20ma/ModbusMaster/pull/59) ([4-20ma](https://github.com/4-20ma)) -- Add email address to CODE\_OF\_CONDUCT [\#57](https://github.com/4-20ma/ModbusMaster/pull/57) ([4-20ma](https://github.com/4-20ma)) -- Add CODE\_OF\_CONDUCT [\#56](https://github.com/4-20ma/ModbusMaster/pull/56) ([4-20ma](https://github.com/4-20ma)) -- Add initial PULL\_REQUEST\_TEMPLATE [\#53](https://github.com/4-20ma/ModbusMaster/pull/53) ([4-20ma](https://github.com/4-20ma)) -- Clarify instructions in ISSUE\_TEMPLATE [\#52](https://github.com/4-20ma/ModbusMaster/pull/52) ([4-20ma](https://github.com/4-20ma)) -- Add ISSUE\_TEMPLATE title reqs, separator lines [\#51](https://github.com/4-20ma/ModbusMaster/pull/51) ([4-20ma](https://github.com/4-20ma)) -- Add initial ISSUE\_TEMPLATE [\#50](https://github.com/4-20ma/ModbusMaster/pull/50) ([4-20ma](https://github.com/4-20ma)) -- Add preTransmission\(\), postTransmission\(\) for half-duplex [\#44](https://github.com/4-20ma/ModbusMaster/pull/44) ([kintel](https://github.com/kintel)) -- Add STYLE coding style guide [\#29](https://github.com/4-20ma/ModbusMaster/pull/29) ([4-20ma](https://github.com/4-20ma)) - -## [v0.11.0](https://github.com/4-20ma/ModbusMaster/tree/v0.11.0) (2015-05-22) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.10.3...v0.11.0) - -**Implemented enhancements:** - -- Update architecture switch [\#28](https://github.com/4-20ma/ModbusMaster/pull/28) ([4-20ma](https://github.com/4-20ma)) - -**Closed issues:** - -- Update architecture switch to match Arduino convention [\#27](https://github.com/4-20ma/ModbusMaster/issues/27) -- Request timeout is impatient [\#3](https://github.com/4-20ma/ModbusMaster/issues/3) - -## [v0.10.3](https://github.com/4-20ma/ModbusMaster/tree/v0.10.3) (2015-05-22) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.10.2...v0.10.3) - -**Closed issues:** - -- Inconsistent Doxygen comments [\#25](https://github.com/4-20ma/ModbusMaster/issues/25) -- Replace C macros with inline functions [\#18](https://github.com/4-20ma/ModbusMaster/issues/18) - -**Merged pull requests:** - -- Adjust doxygen comments to be consistent [\#26](https://github.com/4-20ma/ModbusMaster/pull/26) ([4-20ma](https://github.com/4-20ma)) -- Replace C macros w/inline functions [\#24](https://github.com/4-20ma/ModbusMaster/pull/24) ([4-20ma](https://github.com/4-20ma)) - -## [v0.10.2](https://github.com/4-20ma/ModbusMaster/tree/v0.10.2) (2015-05-22) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.9.1...v0.10.2) - -**Implemented enhancements:** - -- Implement CRC16 for SAM3X8E microprocessor [\#11](https://github.com/4-20ma/ModbusMaster/pull/11) ([4-20ma](https://github.com/4-20ma)) -- Add rx flush, change response timeout to 2000 ms [\#10](https://github.com/4-20ma/ModbusMaster/pull/10) ([agprimatic](https://github.com/agprimatic)) - -**Fixed bugs:** - -- Fix documentation build error [\#23](https://github.com/4-20ma/ModbusMaster/pull/23) ([4-20ma](https://github.com/4-20ma)) -- Work around HardwareSerial for SAM3 micro [\#12](https://github.com/4-20ma/ModbusMaster/pull/12) ([4-20ma](https://github.com/4-20ma)) - -**Merged pull requests:** - -- Update pointers to match C++ convention [\#22](https://github.com/4-20ma/ModbusMaster/pull/22) ([4-20ma](https://github.com/4-20ma)) -- Rename markdown file extensions [\#21](https://github.com/4-20ma/ModbusMaster/pull/21) ([4-20ma](https://github.com/4-20ma)) - -## [v0.9.1](https://github.com/4-20ma/ModbusMaster/tree/v0.9.1) (2013-01-02) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.9...v0.9.1) - -## [v0.9](https://github.com/4-20ma/ModbusMaster/tree/v0.9) (2011-12-27) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.8...v0.9) - -## [v0.8](https://github.com/4-20ma/ModbusMaster/tree/v0.8) (2011-11-09) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.7...v0.8) - -## [v0.7](https://github.com/4-20ma/ModbusMaster/tree/v0.7) (2010-02-10) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.6...v0.7) - -## [v0.6](https://github.com/4-20ma/ModbusMaster/tree/v0.6) (2010-02-05) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.5...v0.6) - -## [v0.5](https://github.com/4-20ma/ModbusMaster/tree/v0.5) (2010-01-30) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.4...v0.5) - -## [v0.4](https://github.com/4-20ma/ModbusMaster/tree/v0.4) (2010-01-30) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.3...v0.4) - -## [v0.3](https://github.com/4-20ma/ModbusMaster/tree/v0.3) (2010-01-29) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.2...v0.3) - -## [v0.2](https://github.com/4-20ma/ModbusMaster/tree/v0.2) (2010-01-26) -[Full Changelog](https://github.com/4-20ma/ModbusMaster/compare/v0.1...v0.2) - -## [v0.1](https://github.com/4-20ma/ModbusMaster/tree/v0.1) (2010-01-25) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/lib/ModbusMaster/CODE_OF_CONDUCT.md b/lib/ModbusMaster/CODE_OF_CONDUCT.md deleted file mode 100644 index eca5ac5b..00000000 --- a/lib/ModbusMaster/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,78 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project owner at 4-20ma@wvfans.net. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Project Maintainers - -- Doc Walker <<4-20ma@wvfans.net>> - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/lib/ModbusMaster/CONTRIBUTING.md b/lib/ModbusMaster/CONTRIBUTING.md deleted file mode 100644 index 0bcf721a..00000000 --- a/lib/ModbusMaster/CONTRIBUTING.md +++ /dev/null @@ -1,58 +0,0 @@ -Contributing -============ - -- Fork, then clone the repo: - ```` - git clone git@github.com:your_username/ModbusMaster.git - ```` - -- Create a topic branch from where you want to base your work - - This is usually the master branch - - Only target release branches if you are certain your fix must be on that branch - - To quickly create a topic branch based on master; `git checkout -b fix/master/my_contribution master`. Please avoid working directly on the `master` branch. - -- Follow the [style guide](https://github.com/4-20ma/ModbusMaster/blob/master/STYLE.md) - -- Test your change - - ```` bash - $ make - ```` - - Project must build successfully using `make` in order for contribution to be considered. - -- Make commits of logical units - - Check for unnecessary whitespace with `git diff --check` before committing - - Each commit should represent one atomic change and should stand on its own - - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) - -- Push to your fork and [submit a pull request](https://github.com/4-20ma/ModbusMaster/compare/) -- [Code of conduct](https://github.com/4-20ma/ModbusMaster/blob/master/CODE_OF_CONDUCT.md) - -### Labels - -Project maintainers assign labels to Issues and Pull Requests (PRs) to categorize, prioritize, and provide status. The following guidelines and conventions are used in this project: - -#### Type - -- `Bug` - existing code does not behave as described in the project documentation; _requires_ clear test case and be _reproducible_ by project maintainer -- `Enhancement` - improvement to an existing feature (Issue or Pull Request) -- `Feature Requst` - new functionality; _requires_ a well-written, clear user story (Issue) -- `Maintenance` - minor administrative change that does not provide enhancement or introduce new feature -- `Question` - self-explanatory - -#### Priority - -- `Low` - default priority; new issues generally start here -- `Medium` - issues are escalated, depending on severity of the issue -- `High` - issues are escalated, depending on severity of the issue -- `Critical` - these issues are to be resolved ahead of any other - -#### Status - -- `Abandoned` - issue/PR closed due to inactivity -- `Blocked` - issue/PR will not be resolved/merged (some projects label these items as `wontfix`; include explanation in issue/PR) -- `In Progress` - issue has been assigned and is actively being addressed; re-label issue `On Hold` with explanation if there will be a significant delay -- `Maintainer Review Needed` - last step prior to merge; PR passes continuous integration tests and is able to be cleanly merged - awaiting review for style, code cleanliness, etc. -- `On Hold` - implementation delayed; provide explanation in issue/PR -- `Pending Contributor Response` - issue/PR closed after 14 days of inactivity (re-label `Abandoned` at closure) diff --git a/lib/ModbusMaster/Gemfile b/lib/ModbusMaster/Gemfile deleted file mode 100644 index 9ed64664..00000000 --- a/lib/ModbusMaster/Gemfile +++ /dev/null @@ -1,30 +0,0 @@ -# encoding: utf-8 -# Gemfile style guide derived from: -# http://mcdowall.info/posts/gemfile-best-practices-and-discourse/ - -# Use `bundle install` after changing this file -# `bundle update [gemname]` to force update of gem -# `bundle show [gemname]` to see where a bundled gem is installed -# `bundle open [gemname]` to edit a bundled gem -# `bundle package` to add gem to vendor/cache - -source 'https://rubygems.org' - - -# place gems sourced from github.com in this section _________________________ - - -# place gems sourced from a project path in this section _____________________ - - -# place general project gems in this section (alphabetical order) ____________ -gem 'git', '~> 1.3.0' # git management -gem 'github_changelog_generator', '~> 1.13.1' -gem 'rake', '~> 11.2.2' -gem 'version', '~> 1.0.0' # version management gem - - -# place gems related to test/specs in this section (alphabetical order) ______ - - -# place gems related to development in this section (alphabetical order) _____ diff --git a/lib/ModbusMaster/Gemfile.lock b/lib/ModbusMaster/Gemfile.lock deleted file mode 100644 index cdec1471..00000000 --- a/lib/ModbusMaster/Gemfile.lock +++ /dev/null @@ -1,47 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.4.0) - colorize (0.8.1) - descendants_tracker (0.0.4) - thread_safe (~> 0.3, >= 0.3.1) - faraday (0.9.2) - multipart-post (>= 1.2, < 3) - git (1.3.0) - github_api (0.14.5) - addressable (~> 2.4.0) - descendants_tracker (~> 0.0.4) - faraday (~> 0.8, < 0.10) - hashie (>= 3.4) - oauth2 (~> 1.0) - github_changelog_generator (1.13.1) - colorize (~> 0.7) - github_api (~> 0.12) - rake (>= 10.0) - hashie (3.4.4) - jwt (1.5.4) - multi_json (1.12.1) - multi_xml (0.5.5) - multipart-post (2.0.0) - oauth2 (1.2.0) - faraday (>= 0.8, < 0.10) - jwt (~> 1.0) - multi_json (~> 1.3) - multi_xml (~> 0.5) - rack (>= 1.2, < 3) - rack (2.0.1) - rake (11.2.2) - thread_safe (0.3.5) - version (1.0.0) - -PLATFORMS - ruby - -DEPENDENCIES - git (~> 1.3.0) - github_changelog_generator (~> 1.13.1) - rake (~> 11.2.2) - version (~> 1.0.0) - -BUNDLED WITH - 1.12.1 diff --git a/lib/ModbusMaster/LICENSE b/lib/ModbusMaster/LICENSE deleted file mode 100644 index 261eeb9e..00000000 --- a/lib/ModbusMaster/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/lib/ModbusMaster/Makefile b/lib/ModbusMaster/Makefile deleted file mode 100644 index fba3392d..00000000 --- a/lib/ModbusMaster/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -#-------------------------------------------------------------------- settings -FIND := find -DIR := examples -CRITERIA := \( -name "*.ino" -o -name "*.pde" \) -EACH_EXAMPLE := $(FIND) $(DIR) $(CRITERIA) -exec -BUILD := platformio ci -LIB := src - -#--------------------------------------------------------------------- targets -# update .travis.yml if target boards added -all: uno due huzzah genuino101 teensy31 - -uno due huzzah genuino101 teensy31: - PLATFORMIO_BOARD=$@ $(MAKE) build - -build: - $(EACH_EXAMPLE) $(BUILD) --board=$(PLATFORMIO_BOARD) --lib=$(LIB) {} \; - -.PHONY: all uno due huzzah genuino101 teensy31 build diff --git a/lib/ModbusMaster/README.md b/lib/ModbusMaster/README.md deleted file mode 100644 index 5c5719e4..00000000 --- a/lib/ModbusMaster/README.md +++ /dev/null @@ -1,167 +0,0 @@ -# ModbusMaster -[![GitHub release](https://img.shields.io/github/release/4-20ma/ModbusMaster.svg?maxAge=3600)][GitHub release] -[![Travis](https://img.shields.io/travis/4-20ma/ModbusMaster.svg?maxAge=3600)][Travis] -[![license](https://img.shields.io/github/license/4-20ma/ModbusMaster.svg?maxAge=3600)][license] -[![code of conduct](https://img.shields.io/badge/%E2%9D%A4-code%20of%20conduct-blue.svg?maxAge=3600)][code of conduct] - -[GitHub release]: https://github.com/4-20ma/ModbusMaster -[Travis]: https://travis-ci.org/4-20ma/ModbusMaster -[license]: LICENSE -[code of conduct]: CODE_OF_CONDUCT.md - - -## Overview -This is an Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol). - - -## Features -The following Modbus functions are available: - -Discrete Coils/Flags - - - 0x01 - Read Coils - - 0x02 - Read Discrete Inputs - - 0x05 - Write Single Coil - - 0x0F - Write Multiple Coils - -Registers - - - 0x03 - Read Holding Registers - - 0x04 - Read Input Registers - - 0x06 - Write Single Register - - 0x10 - Write Multiple Registers - - 0x16 - Mask Write Register - - 0x17 - Read Write Multiple Registers - -Both full-duplex and half-duplex RS232/485 transceivers are supported. Callback functions are provided to toggle Data Enable (DE) and Receiver Enable (/RE) pins. - - -## Installation - -#### Library Manager -Install the library into your Arduino IDE using the Library Manager (available from IDE version 1.6.2). Open the IDE and click Sketch > Include Library > Manage Libraries… - -Scroll or search for `ModbusMaster`, then select the version of the library you want to install. Quit/re-launch the IDE to refresh the list; new versions are automatically added to the list, once released on GitHub. - -Refer to Arduino Tutorials > Libraries [Using the Library Manager](https://www.arduino.cc/en/Guide/Libraries#toc3). - -#### Zip Library -Refer to Arduino Tutorials > Libraries [Importing a .zip Library](https://www.arduino.cc/en/Guide/Libraries#toc4). - -#### Manual -Refer to Arduino Tutorials > Libraries [Manual Installation](https://www.arduino.cc/en/Guide/Libraries#toc5). - - -## Hardware -This library has been tested with an Arduino [Duemilanove](http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove), PHOENIX CONTACT [nanoLine](https://www.phoenixcontact.com/online/portal/us?1dmy&urile=wcm%3apath%3a/usen/web/main/products/subcategory_pages/standard_logic_modules_p-21-03-03/3329dd38-7c6a-46e1-8260-b9208235d6fe/3329dd38-7c6a-46e1-8260-b9208235d6fe) controller, connected via RS485 using a Maxim [MAX488EPA](http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1111) transceiver. - - -## Caveats -Conforms to Arduino IDE 1.5 Library Specification v2.1 which requires Arduino IDE >= 1.5. - -Arduinos prior to the Mega have one serial port which must be connected to USB (FTDI) for uploading sketches and to the RS232/485 device/network for running sketches. You will need to disconnect pin 0 (RX) while uploading sketches. After a successful upload, you can reconnect pin 0. - - -## Support -Please [submit an issue](https://github.com/4-20ma/ModbusMaster/issues) for all questions, bug reports, and feature requests. Email requests will be politely redirected to the issue tracker so others may contribute to the discussion and requestors get a more timely response. - - -## Example -The library contains a few sketches that demonstrate use of the `ModbusMaster` library. You can find these in the [examples](https://github.com/4-20ma/ModbusMaster/tree/master/examples) folder. - -``` cpp -/* - - Basic.pde - example using ModbusMaster library - - Library:: ModbusMaster - Author:: Doc Walker <4-20ma@wvfans.net> - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -#include - - -// instantiate ModbusMaster object -ModbusMaster node; - - -void setup() -{ - // use Serial (port 0); initialize Modbus communication baud rate - Serial.begin(19200); - - // communicate with Modbus slave ID 2 over Serial (port 0) - node.begin(2, Serial); -} - - -void loop() -{ - static uint32_t i; - uint8_t j, result; - uint16_t data[6]; - - i++; - - // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(0, lowWord(i)); - - // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(1, highWord(i)); - - // slave: write TX buffer to (2) 16-bit registers starting at register 0 - result = node.writeMultipleRegisters(0, 2); - - // slave: read (6) 16-bit registers starting at register 2 to RX buffer - result = node.readHoldingRegisters(2, 6); - - // do something with data if read is successful - if (result == node.ku8MBSuccess) - { - for (j = 0; j < 6; j++) - { - data[j] = node.getResponseBuffer(j); - } - } -} -``` - -_Project inspired by [Arduino Modbus Master](http://sites.google.com/site/jpmzometa/arduino-mbrt/arduino-modbus-master)._ - - -## License & Authors - -- Author:: Doc Walker ([4-20ma@wvfans.net](mailto:4-20ma@wvfans.net)) -- Author:: Ag Primatic ([agprimatic@gmail.com](mailto:agprimatic@gmail.com)) -- Author:: Marius Kintel ([marius@kintel.net](mailto:marius@kintel.net)) - -``` -Copyright:: 2009-2016 Doc Walker - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -``` diff --git a/lib/ModbusMaster/Rakefile b/lib/ModbusMaster/Rakefile deleted file mode 100644 index b0619918..00000000 --- a/lib/ModbusMaster/Rakefile +++ /dev/null @@ -1,218 +0,0 @@ -# encoding: utf-8 -# -# Copyright:: 2009-2016 Doc Walker -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require 'git' -require 'github_changelog_generator/task' -require 'rake' -require 'rubygems' -require 'rake/version_task' # gem install version -require 'version' - -# requires additional packages on MacOS (including Homebrew): -# $ /usr/bin/ruby -e "$(curl -fsSL \ -# https://raw.githubusercontent.com/Homebrew/install/master/install)" -# $ brew install doxygen # generates documentation from source code -# $ brew cask install mactex # MacTeX - -Rake::VersionTask.new do |task| - # prevent auto-commit on version bump - task.with_git = false -end - -# adjust as appropriate -CWD = File.expand_path(File.dirname(__FILE__)) -DOXYFILE = 'Doxyfile' -GITHUB_USERNAME = '4-20ma' -GITHUB_REPO = 'ModbusMaster' -HEADER_FILE = "#{GITHUB_REPO}.h" -CHANGELOG_FILE = 'CHANGELOG.md' -PROPERTIES_FILE = 'library.properties' -VERSION_FILE = Version.version_file('').basename.to_s - - -task :default => :info - -desc 'Display instructions for public release' -task :info do - puts <<-EOF.gsub(/^\s{2}/, '') - - Instructions for public release - - - Update version, as appropriate: - - $ rake version:bump # or - $ rake version:bump:minor # or - $ rake version:bump:major # or - edit 'VERSION' file directly - - - Prepare release date, 'CHANGELOG.md' file, documentation: - - $ rake prepare - - - Review changes to 'CHANGELOG.md' file - This file is assembled using git commit messages; review for completeness. - - - Review html documentation files - These files are assembled using source code Doxygen tags; review for - for completeness. - - - Add & commit source files, tag, push to origin/master; - add & commit documentation files, push to origin/gh-pages: - - $ rake release - - EOF -end # task :info - - -desc "Prepare #{CHANGELOG_FILE} for release" -task :prepare => 'prepare:default' - -namespace :prepare do - task :default => [ - :release_date, - :library_properties, - :changelog, - :documentation - ] - - desc 'Prepare documentation' - task :documentation do - version = Version.current.to_s - - # update parameters in Doxyfile - file = File.join(CWD, 'doc', DOXYFILE) - - contents = IO.read(file) - contents.sub!(/(^PROJECT_NUMBER\s*=)(.*)$/) do |match| - "#{$1} v#{version}" - end # contents.sub!(...) - IO.write(file, contents) - - # chdir to doc/ and call doxygen to update documentation - Dir.chdir(to = File.join(CWD, 'doc')) - system('doxygen', DOXYFILE) - - # chdir to doc/latex and call doxygen to update documentation - Dir.chdir(from = File.join(CWD, 'doc', 'latex')) - system('make') - - # move/rename file to 'extras/GITHUB_REPO reference-x.y.pdf' - to = File.join(CWD, 'extras') - FileUtils.mv(File.join(from, 'refman.pdf'), - File.join(to, "#{GITHUB_REPO} reference-#{version}.pdf")) - end # task :documentation - - desc 'Prepare release history' - GitHubChangelogGenerator::RakeTask.new(:changelog) do |config| - config.add_issues_wo_labels = false - config.add_pr_wo_labels = false - config.enhancement_labels = [ - 'Type: Enhancement' - ] - config.bug_labels = ['Type: Bug'] - config.exclude_labels = ['Type: Question'] - config.header = '# ModbusMaster CHANGELOG' - config.include_labels = [ - 'Type: Bug', - 'Type: Enhancement', - 'Type: Feature Request', - 'Type: Maintenance' - ] - # config.since_tag = '0.1.0' - config.future_release = "v#{Version.current.to_s}" - config.user = GITHUB_USERNAME - config.project = GITHUB_REPO - end # GitHubChangelogGenerator::RakeTask.new - - desc 'Update version in library properties file' - task :library_properties do - version = Version.current.to_s - - file = File.join(CWD, PROPERTIES_FILE) - - contents = IO.read(file) - contents.sub!(/(version=\s*)(.*)$/) do |match| - "#{$1}#{version}" - end # contents.sub!(...) - IO.write(file, contents) - end # task :library_properties - - desc 'Update release date in header file' - task :release_date do - file = File.join(CWD, 'src', HEADER_FILE) - - contents = IO.read(file) - contents.sub!(/(\\date\s*)(.*)$/) do |match| - "#{$1}#{Time.now.strftime('%-d %b %Y')}" - end # contents.sub!(...) - IO.write(file, contents) - end # task :release_date - -end # namespace :prepare - - -desc 'Release source & documentation' -task :release => 'release:default' - -namespace :release do - task :default => [:source, :documentation] - - desc 'Commit documentation changes related to version bump' - task :documentation do - version = Version.current.to_s - cwd = File.expand_path(File.join(File.dirname(__FILE__), 'doc', 'html')) - g = Git.open(cwd) - - # `git add .` - g.add - - # remove each deleted item - g.status.deleted.each do |item| - g.remove(item[0]) - end # g.status.deleted.each - - # commit changes if items added, changed, or deleted - if g.status.added.size > 0 || g.status.changed.size > 0 || - g.status.deleted.size > 0 then - message = "Update documentation for v#{version}" - puts g.commit(message) - else - puts "No changes to commit v#{version}" - end # if g.status.added.size > 0 || g.status.changed.size > 0... - - g.push('origin', 'gh-pages') - end # task :documentation - - desc 'Commit source changes related to version bump' - task :source do - version = Version.current.to_s - `git add \ - doc/#{DOXYFILE} \ - "extras/#{GITHUB_REPO} reference-#{version}.pdf" \ - src/#{HEADER_FILE} \ - #{CHANGELOG_FILE} \ - #{PROPERTIES_FILE} \ - #{VERSION_FILE} \ - ` - `git commit -m 'Version bump to v#{version}'` - `git tag -a -f -m 'Version v#{version}' v#{version}` - `git push origin master` - `git push --tags` - end # task :source - -end # namespace :release diff --git a/lib/ModbusMaster/STYLE.md b/lib/ModbusMaster/STYLE.md deleted file mode 100644 index 00516e0f..00000000 --- a/lib/ModbusMaster/STYLE.md +++ /dev/null @@ -1,372 +0,0 @@ -ModbusMaster Style Guide -======================== - -The following references provide sound guidance for writing C/C++ code for the Arduino platform. - -- [Arduino API Style Guide (AASG)](http://www.arduino.cc/en/Reference/APIStyleGuide) -- [Bjarne Stroustrup's C++ Style Guide](http://www.stroustrup.com/bs_faq2.html) -- [JSF Air Vehicle C++ Coding Standards (JSFAV)](http://www.stroustrup.com/JSF-AV-rules.pdf) - -Opinions about style and generally accepted usage patterns may vary widely. I've carefully chosen a few key items to emphasize and enforce for this library in order to promote readability, usability, and safe coding practices. **Pull requests will follow these guidelines in order to be considered**. - - -General \[AASG\] -------- - -Use the established Arduino core libraries and styles. - -- Use `read()` to read inputs, and `write()` to write to outputs, e.g. `digitalRead()`, `analogWrite()`, etc. -- Use the `Stream.h` and `Print.h` libraries when dealing with byte streams. If it’s not appropriate, at least try to use its API as a model. For more on this, see below. -- For network applications, use the Client and Server libraries as the basis. -- Use `begin()` to initialize a library instance, usually with some settings. Use `end()` to stop it. -- Use camelCase function names, not underscore. For example, `analogRead`, not `analog_read`. Or `myNewFunction`, not `my_new_function`. We've adopted this from Processing.org for readability's sake. Refer to AV Rule 45 and AV Rule 51. -- When using serial communication, allow the user to specify any `Stream` object, rather than hard-coding `Serial`. This will make the library compatible with all serial ports on Mega and the Due, and can also use alternate interfaces like `SoftwareSerial`. The `Stream` object can be passed to the library's constructor or to a `begin()` function (as a reference, not a pointer). See Firmata 2.3 or XBee 0.4 for examples of each approach. - - -Rules \[JSFAV 4.2\] ------ - -#### Should, Will, and Shall Rules - -There are three types of rules: **should**, **will**, and **shall** rules. Each rule contains either a **"should"**, **"will"** or a **"shall"** in bold letters indicating its type. - -- **Should** rules are advisory rules. They strongly suggest the recommended way of doing things. -- **Will** rules are intended to be mandatory requirements. It is expected that they will be followed, but they do not require verification. They are limited to non-safety-critical requirements that cannot be easily verified (e.g., naming conventions). -- **Shall** rules are mandatory requirements. They must be followed and they require verification (either automatic or manual). - - -Pre-Processing Directives \[JSFAV 4.6\] -------------------------- -Since the pre-processor knows nothing about C++, it should not be used to do what can otherwise be done in C++. - -- AV Rule 26 - - Only the following pre-processor directives shall be used: - - 1. `#ifndef` - 1. `#define` - 1. `#endif` - 1. `#include` - - **Rationale**: Limit the use of the pre-processor to those cases where it is necessary. - -#### \#ifndef and \#endif Pre-Processing Directives - -- AV Rule 27 - - `#ifndef`, `#define` and `#endif` **will** be used to prevent multiple inclusions of the same header file. Other techniques to prevent the multiple inclusions of header files **will not** be used. - - **Rationale**: Eliminate multiple inclusions of the same header file in a standard way. - -- AV Rule 28 - - The `#ifndef` and `#endif` pre-processor directives **will** only be used as defined in AV Rule 27 to prevent multiple inclusions of the same header file. - - **Rationale**: Conditional code compilation should be kept to a minimum as it can significantly obscure testing and maintenance efforts. - -#### \#define Pre-Processing Directive - -- AV Rule 29 - - The `#define` pre-processor directive **shall not** be used to create inline macros. Inline functions **shall** be used instead. - - **Rationale**: Inline functions do not require text substitutions and behave well when called with arguments (e.g. type checking is performed). - -- AV Rule 30 - - The `#define` pre-processor directive **shall not** be used to define constant values. Instead, the `const` qualifier shall be applied to variable declarations to specify constant values. - - **Rationale**: `const` variables follow scope rules, are subject to type checking and do not require text substitutions (which can be confusing or misleading). - -- AV Rule 31 - - The `#define` pre-processor directive **will** only be used as part of the technique to prevent multiple inclusions of the same header file. - - **Rationale**: `#define` can be used to specify conditional compilation (AV Rule 27 and AV Rule 28), inline macros (AV Rule 29) and constants (AV Rule 30). This rule specifies that the only allowable use of `#define` is to prevent multiple includes of the same header file (AV Rule 27). - -#### \#include Pre-Processing Directive - -- AV Rule 32 - - The `#include` pre-processor directive **will** only be used to include header (\*.h) files. - - **Rationale**: Clarity. The only files included in a .cpp file should be the relevant header (\*.h) files. - - -Header Files \[JSFAV 4.7\] ------------- - -- AV Rule 33 - - The `#include` directive **shall** use the `` notation to include header files. - - **Rationale**: The include form `"filename.h"` is typically used to include local header files. However, due to the unfortunate divergence in vendor implementations, only the `` form will be used. - -- AV Rule 35 - - A header file **will** contain a mechanism that prevents multiple inclusions of itself. - - **Rationale**: Avoid accidental header file recursion. Note AV Rule 27 specifies the mechanism by which multiple inclusions are to be eliminated whereas this rule (AV Rule 35) specifies that each header file must use that mechanism. - -- AV Rule 37 - - Header (include) files **should** include only those header files that are required for them to successfully compile. Files that are only used by the associated .cpp file should be placed in the .cpp file—not the .h file. - - **Rationale**: The `#include` statements in a header file define the dependencies of the file. Fewer dependencies imply looser couplings and hence a smaller ripple-effect when the header file is required to change. - - -Style \[JSFAV 4.9\] ------ -Imposing constraints on the format of syntactic elements makes source code easier to read due to consistency in form and appearance. - -- AV Rule 41 (modified) - - Source lines **will** be kept to a length of 78 characters or less. - - **Rationale**: Readability and style. Very long source lines can be difficult to read and understand. - -- AV Rule 42 - - Each expression-statement **will** be on a separate line. - - **Rationale**: Simplicity, readability, and style. - -- AV Rule 43 (modified) - - Tabs **will** be avoided. - - **Rationale**: Tabs are interpreted differently across various editors and printers. - -- AV Rule 44 - - All indentations **will** be at least two spaces and be consistent within the same source file. - - **Rationale**: Readability and style. - -#### Naming Identifiers - -The choice of identifier names should: - -- Suggest the usage of the identifier. -- Consist of a descriptive name that is short yet meaningful. -- Be long enough to avoid name conflicts, but not excessive in length. -- Include abbreviations that are generally accepted. - -Note: In general, the above guidelines should be followed. However, conventional usage of simple identifiers (i, x, y, p, etc.) in small scopes can lead to cleaner code and will therefore be permitted. - -Additionally, the term ‘word’ in the following naming convention rules may be used to refer to a word, an acronym, an abbreviation, or a number. - -- AV Rule 45 - - All words in an identifier **will** be separated by the '\_' character. - - **Exception**: Function names follow the camelCase convention according to the Arduino API Style Guide. Refer to AV Rule 51. - - **Rationale**: Readability and Style. - -- AV Rule 47 (modified) - - Identifiers **should not** begin with the underscore character '\_'. - - **Exception**: Currently, private members of the `ModbusMaster` class begin with '\_'. - - **Rationale**: '\_' is often used as the first character in the name of library functions (e.g. `_main`, `_exit`, etc.) In order to avoid name collisions, identifiers should not begin with '\_'. - -- AV Rule 49 - - All acronyms in an identifier **will** be composed of uppercase letters. - - Note: An acronym will always be in uppercase, even if the acronym is located in a portion of an identifier that is specified to be lowercase by other rules. - - **Rationale**: Readability. - -- AV Rule 50 - - The first word of the name of a class, structure, namespace, enumeration, or type created with typedef **will** begin with an uppercase letter. All others letters will be lowercase. - - **Rationale**: Style. - - **Exception**: The first letter of a typedef name may be in lowercase in order to conform to a standard library interface or when used as a replacement for fundamental types. - -- AV Rule 51 (modified) - - All letters contained in *function* names **will** be composed of a mix of lowercase and uppercase letters in camelCase format (e.g. first letter of first word is lowercase and first letter of each subsequent word is uppercase). This is to maintain consistency with the Arduion API Style Guide. Refer to AV Rule 45. - - All letters contained in *variable* names **will** be composed entirely of lowercase letters. - - **Rationale**: Style. - -- AV Rule 52 - - Identifiers for constant and enumerator values **shall** be lowercase. - - **Rationale**: Although it is an accepted convention to use uppercase letters for constants and enumerators, it is possible for third party libraries to replace constant/enumerator names as part of the macro substitution process (macros are also typically represented with uppercase letters). - -#### Classes - -- AV Rule 57 - - The public, protected, and private sections of a class **will** be declared in that order (the public section is declared before the protected section which is declared before the private section). - - **Rationale**: By placing the public section first, everything that is of interest to a user is gathered in the beginning of the class definition. The protected section may be of interest to designers when considering inheriting from the class. The private section contains details that should be of the least general interest. - -#### Functions - -- AV Rule 58 - - When declaring and defining functions with more than two parameters, the leading parenthesis and the first argument **will** be written on the same line as the function name. Each additional argument will be written on a separate line (with the closing parenthesis directly after the last argument). - - **Rationale**: Readability and style. - -#### Blocks - -- AV Rule 59 - - The statements forming the body of an `if`, `else if`, `else`, `while`, `do...while` or `for` statement **shall** always be enclosed in braces, even if the braces form an empty block. - - **Rationale**: Readability. It can be difficult to see ';' when it appears by itself. - -- AV Rule 60 - - Braces ('{}') which enclose a block will be placed in the same column, on separate lines directly before and after the block. - - **Example**: - ``` - if (var_name == true) - { - } - else - { - } - ``` - -- AV Rule 61 - - Braces ('{}') which enclose a block **will** have nothing else on the line except comments (if necessary). - -#### Pointers and References - -- AV Rule 62 - - The dereference operator '\*' and the address-of operator '&' **will** be directly connected with the type-specifier. - - **Rationale**: The `int32* p;` form emphasizes type over syntax while the `int32 *p;` form emphasizes syntax over type. Although both forms are equally valid C++, the heavy emphasis on types in C++ suggests that `int32* p;` is the preferable form. - - **Examples**: - ``` - int32* p; // correct - int32 *p; // incorrect - int32* p, q; // probable error - ``` - -#### Miscellaneous - -- AV Rule 63 - - Spaces **will not** be used around '.' or '->', nor between unary operators and operands. - - **Rationale**: Readability and style. - - -Classes \[JSFAV 4.10\] -------- - -#### const Member Functions - -- AV Rule 69 - - A member function that does not affect the state of an object (its instance variables) **will** be declared `const`. - - Member functions should be `const` by default. Only when there is a clear, explicit reason should the `const` modifier on member functions be omitted. - - **Rationale**: Declaring a member function `const` is a means of ensuring that objects will not be modified when they should not. Furthermore, C++ allows member functions to be overloaded on their `const`-ness. - - -Initialization \[JSFAV 4.16\] --------------- - -- AV Rule 142 - - All variables **shall** be initialized before use. - - **Rationale**: Prevent the use of variables before they have been properly initialized. - -- AV Rule 143 - - Variables **will not** be introduced until they can be initialized with meaningful values. - - **Rationale**: Prevent clients from accessing variables without meaningful values. - - -Constants \[JSFAV 4.18\] ---------- - -- AV Rule 149 - - Octal constants (other than zero) **shall not** be used. - - **Rationale**: Any integer constant beginning with a zero ('0') is defined by the C++ standard to be an octal constant. Due to the confusion this causes, octal constants should be avoided. - - Note: Hexadecimal numbers and zero (which is also an octal constant) are allowed. - -- AV Rule 150 - - Hexadecimal constants **will** be represented using all uppercase letters. - - -Variables \[JSFAV 4.19\] ---------- - -- AV Rule 152 - - Multiple variable declarations **shall not** be allowed on the same line. - - **Rationale**: Increases readability and prevents confusion (see also AV Rule 62). - - **Examples**: - ``` - int32 p; // correct - int32 q; // correct - int32 p, q; // probable error - int32 first_button_on_the_left_box, i; // incorrect; easy to overlook i - ``` - - -Flow Control Structures \[JSFAV 4.24\] ------------------------ - -- AV Rule 188 - - Labels **will** not be used, except in switch statements. - - **Rationale**: Labels are typically either used in switch statements or are as the targets for goto statements. See exception given in AV Rule 189. - -- AV Rule 189 - - The `goto` statement **shall not** be used. - - **Rationale**: Frequent use of the `goto` statement tends to lead to code that is both difficult to read and maintain. - -- AV Rule 190 - - The `continue` statement **shall not** be used. - -- AV Rule 191 - - The `break` statement **shall not** be used (except to terminate the cases of a switch statement). - - **Exception**: The `break` statement may be used to "break" out of a single loop provided the alternative would obscure or otherwise significantly complicate the control logic. - -- AV Rule 192 - - All `if`, `else if` constructs **will** contain either a final `else` clause or a comment indicating why a final `else` clause is not necessary. - - **Rationale**: Provide a defensive strategy to ensure that all cases are handled by an `else if` series. - - Note: This rule only applies when an `if` statement is followed by one or more `else if`’s. - -- AV Rule 193 - - Every non-empty `case` clause in a `switch` statement **shall** be terminated with a `break` statement. - - **Rationale**: Eliminates potentially confusing behavior since execution will fall through to the code of the next `case` clause if a `break` statement does not terminate the previous `case` clause. diff --git a/lib/ModbusMaster/VERSION b/lib/ModbusMaster/VERSION deleted file mode 100644 index 38f77a65..00000000 --- a/lib/ModbusMaster/VERSION +++ /dev/null @@ -1 +0,0 @@ -2.0.1 diff --git a/lib/ModbusMaster/examples/Basic/Basic.pde b/lib/ModbusMaster/examples/Basic/Basic.pde deleted file mode 100644 index 74c199b1..00000000 --- a/lib/ModbusMaster/examples/Basic/Basic.pde +++ /dev/null @@ -1,69 +0,0 @@ -/* - - Basic.pde - example using ModbusMaster library - - Library:: ModbusMaster - Author:: Doc Walker <4-20ma@wvfans.net> - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -#include - - -// instantiate ModbusMaster object -ModbusMaster node; - - -void setup() -{ - // use Serial (port 0); initialize Modbus communication baud rate - Serial.begin(19200); - - // communicate with Modbus slave ID 2 over Serial (port 0) - node.begin(2, Serial); -} - - -void loop() -{ - static uint32_t i; - uint8_t j, result; - uint16_t data[6]; - - i++; - - // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(0, lowWord(i)); - - // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(1, highWord(i)); - - // slave: write TX buffer to (2) 16-bit registers starting at register 0 - result = node.writeMultipleRegisters(0, 2); - - // slave: read (6) 16-bit registers starting at register 2 to RX buffer - result = node.readHoldingRegisters(2, 6); - - // do something with data if read is successful - if (result == node.ku8MBSuccess) - { - for (j = 0; j < 6; j++) - { - data[j] = node.getResponseBuffer(j); - } - } -} diff --git a/lib/ModbusMaster/examples/PhoenixContact_nanoLC/PhoenixContact_nanoLC.pde b/lib/ModbusMaster/examples/PhoenixContact_nanoLC/PhoenixContact_nanoLC.pde deleted file mode 100644 index e91fb338..00000000 --- a/lib/ModbusMaster/examples/PhoenixContact_nanoLC/PhoenixContact_nanoLC.pde +++ /dev/null @@ -1,143 +0,0 @@ -/* - - PhoenixContact_nanoLC.pde - example using ModbusMaster library - to communicate with PHOENIX CONTACT nanoLine controller. - - Library:: ModbusMaster - Author:: Doc Walker <4-20ma@wvfans.net> - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -#include - -// discrete coils -#define NANO_DO(n) (0x0000 + n) ///< returns nanoLC discrete output address -#define NANO_FLAG(n) (0x1000 + n) ///< returns nanoLC flag address - -// discrete inputs -#define NANO_DI(n) (0x0000 + n) ///< returns nanoLC discrete input address - -// analog holding registers -#define NANO_REG(n) (0x0000 + 2 * n) ///< returns nanoLC holding register address -#define NANO_AO(n) (0x1000 + 2 * n) ///< returns nanoLC analog output address -#define NANO_TCP(n) (0x2000 + 2 * n) ///< returns nanoLC timer/counter preset address -#define NANO_OTP(n) (0x3000 + 2 * n) ///< returns nanoLC discrete output preset address -#define NANO_HSP(n) (0x4000 + 2 * n) ///< returns nanoLC high-speed counter preset address -#define NANO_TCA(n) (0x5000 + 2 * n) ///< returns nanoLC timer/counter accumulator address -#define NANO_OTA(n) (0x6000 + 2 * n) ///< returns nanoLC discrete output accumulator address -#define NANO_HSA(n) (0x7000 + 2 * n) ///< returns nanoLC high-speed counter accumulator address - -// analog input registers -#define NANO_AI(n) (0x0000 + 2 * n) ///< returns nanoLC analog input address - - -// instantiate ModbusMaster object -ModbusMaster nanoLC; - - -void setup() -{ - // use Serial (port 0); initialize Modbus communication baud rate - Serial.begin(19200); - - // communicate with Modbus slave ID 1 over Serial (port 0) - nanoLC.begin(1, Serial); -} - - -void loop() -{ - static uint32_t u32ShiftRegister; - static uint32_t i; - uint8_t u8Status; - - u32ShiftRegister = ((u32ShiftRegister < 0x01000000) ? (u32ShiftRegister << 4) : 1); - if (u32ShiftRegister == 0) u32ShiftRegister = 1; - i++; - - // set word 0 of TX buffer to least-significant word of u32ShiftRegister (bits 15..0) - nanoLC.setTransmitBuffer(0, lowWord(u32ShiftRegister)); - - // set word 1 of TX buffer to most-significant word of u32ShiftRegister (bits 31..16) - nanoLC.setTransmitBuffer(1, highWord(u32ShiftRegister)); - - // set word 2 of TX buffer to least-significant word of i (bits 15..0) - nanoLC.setTransmitBuffer(2, lowWord(i)); - - // set word 3 of TX buffer to most-significant word of i (bits 31..16) - nanoLC.setTransmitBuffer(3, highWord(i)); - - // write TX buffer to (4) 16-bit registers starting at NANO_REG(1) - // read (4) 16-bit registers starting at NANO_REG(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..3) - nanoLC.readWriteMultipleRegisters(NANO_REG(0), 4, NANO_REG(1), 4); - - // write lowWord(u32ShiftRegister) to single 16-bit register starting at NANO_REG(3) - nanoLC.writeSingleRegister(NANO_REG(3), lowWord(u32ShiftRegister)); - - // write highWord(u32ShiftRegister) to single 16-bit register starting at NANO_REG(3) + 1 - nanoLC.writeSingleRegister(NANO_REG(3) + 1, highWord(u32ShiftRegister)); - - // set word 0 of TX buffer to nanoLC.getResponseBuffer(0) (bits 15..0) - nanoLC.setTransmitBuffer(0, nanoLC.getResponseBuffer(0)); - - // set word 1 of TX buffer to nanoLC.getResponseBuffer(1) (bits 31..16) - nanoLC.setTransmitBuffer(1, nanoLC.getResponseBuffer(1)); - - // write TX buffer to (2) 16-bit registers starting at NANO_REG(4) - nanoLC.writeMultipleRegisters(NANO_REG(4), 2); - - // read 17 coils starting at NANO_FLAG(0) to RX buffer - // bits 15..0 are available via nanoLC.getResponseBuffer(0) - // bit 16 is available via zero-padded nanoLC.getResponseBuffer(1) - nanoLC.readCoils(NANO_FLAG(0), 17); - - // read (66) 16-bit registers starting at NANO_REG(0) to RX buffer - // generates Modbus exception ku8MBIllegalDataAddress (0x02) - u8Status = nanoLC.readHoldingRegisters(NANO_REG(0), 66); - if (u8Status == nanoLC.ku8MBIllegalDataAddress) - { - // read (64) 16-bit registers starting at NANO_REG(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..63) - u8Status = nanoLC.readHoldingRegisters(NANO_REG(0), 64); - } - - // read (8) 16-bit registers starting at NANO_AO(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..7) - nanoLC.readHoldingRegisters(NANO_AO(0), 8); - - // read (64) 16-bit registers starting at NANO_TCP(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..63) - nanoLC.readHoldingRegisters(NANO_TCP(0), 64); - - // read (64) 16-bit registers starting at NANO_OTP(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..63) - nanoLC.readHoldingRegisters(NANO_OTP(0), 64); - - // read (64) 16-bit registers starting at NANO_TCA(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..63) - nanoLC.readHoldingRegisters(NANO_TCA(0), 64); - - // read (64) 16-bit registers starting at NANO_OTA(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..63) - nanoLC.readHoldingRegisters(NANO_OTA(0), 64); - - // read (8) 16-bit registers starting at NANO_AI(0) to RX buffer - // data is available via nanoLC.getResponseBuffer(0..7) - nanoLC.readInputRegisters(NANO_AI(0), 8); -} - diff --git a/lib/ModbusMaster/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino b/lib/ModbusMaster/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino deleted file mode 100644 index c19607f0..00000000 --- a/lib/ModbusMaster/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino +++ /dev/null @@ -1,98 +0,0 @@ -/* - - RS485_HalfDuplex.pde - example using ModbusMaster library to communicate - with EPSolar LS2024B controller using a half-duplex RS485 transceiver. - - This example is tested against an EPSolar LS2024B solar charge controller. - See here for protocol specs: - http://www.solar-elektro.cz/data/dokumenty/1733_modbus_protocol.pdf - - Library:: ModbusMaster - Author:: Marius Kintel - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -#include - -/*! - We're using a MAX485-compatible RS485 Transceiver. - Rx/Tx is hooked up to the hardware serial port at 'Serial'. - The Data Enable and Receiver Enable pins are hooked up as follows: -*/ -#define MAX485_DE 3 -#define MAX485_RE_NEG 2 - -// instantiate ModbusMaster object -ModbusMaster node; - -void preTransmission() -{ - digitalWrite(MAX485_RE_NEG, 1); - digitalWrite(MAX485_DE, 1); -} - -void postTransmission() -{ - digitalWrite(MAX485_RE_NEG, 0); - digitalWrite(MAX485_DE, 0); -} - -void setup() -{ - pinMode(MAX485_RE_NEG, OUTPUT); - pinMode(MAX485_DE, OUTPUT); - // Init in receive mode - digitalWrite(MAX485_RE_NEG, 0); - digitalWrite(MAX485_DE, 0); - - // Modbus communication runs at 115200 baud - Serial.begin(115200); - - // Modbus slave ID 1 - node.begin(1, Serial); - // Callbacks allow us to configure the RS485 transceiver correctly - node.preTransmission(preTransmission); - node.postTransmission(postTransmission); -} - -bool state = true; - -void loop() -{ - uint8_t result; - uint16_t data[6]; - - // Toggle the coil at address 0x0002 (Manual Load Control) - result = node.writeSingleCoil(0x0002, state); - state = !state; - - // Read 16 registers starting at 0x3100) - result = node.readInputRegisters(0x3100, 16); - if (result == node.ku8MBSuccess) - { - Serial.print("Vbatt: "); - Serial.println(node.getResponseBuffer(0x04)/100.0f); - Serial.print("Vload: "); - Serial.println(node.getResponseBuffer(0xC0)/100.0f); - Serial.print("Pload: "); - Serial.println((node.getResponseBuffer(0x0D) + - node.getResponseBuffer(0x0E) << 16)/100.0f); - } - - delay(1000); -} - diff --git a/lib/ModbusMaster/extras/ModbusMaster reference-2.0.1.pdf b/lib/ModbusMaster/extras/ModbusMaster reference-2.0.1.pdf deleted file mode 100644 index cce1e04ec2da2f55d720c2d2d55a38e576b14122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206477 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 diff --git a/lib/ModbusMaster/extras/README.txt b/lib/ModbusMaster/extras/README.txt deleted file mode 100644 index a5720f68..00000000 --- a/lib/ModbusMaster/extras/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -Documentation is available at: - http://4-20ma.github.com/ModbusMaster - -Alternatively, you can download the HTML files at: - [tarball] https://github.com/4-20ma/ModbusMaster/tarball/gh-pages - [zipball] https://github.com/4-20ma/ModbusMaster/zipball/gh-pages diff --git a/lib/ModbusMaster/keywords.txt b/lib/ModbusMaster/keywords.txt deleted file mode 100644 index fd92fdb4..00000000 --- a/lib/ModbusMaster/keywords.txt +++ /dev/null @@ -1,50 +0,0 @@ -####################################### -# Syntax Coloring Map For ModbusMaster -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -ModbusMaster KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -lowWord KEYWORD2 -highWord KEYWORD2 -LONG KEYWORD2 - -begin KEYWORD2 - -getResponseBuffer KEYWORD2 -clearResponseBuffer KEYWORD2 -setTransmitBuffer KEYWORD2 -clearTransmitBuffer KEYWORD2 - -readCoils KEYWORD2 -readDiscreteInputs KEYWORD2 -readHoldingRegisters KEYWORD2 -readInputRegisters KEYWORD2 -writeSingleCoil KEYWORD2 -writeSingleRegister KEYWORD2 -writeMultipleCoils KEYWORD2 -writeMultipleRegisters KEYWORD2 -maskWriteRegister KEYWORD2 -readWriteMultipleRegisters KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### - -ku8MBIllegalFunction LITERAL1 -ku8MBIllegalDataAddress LITERAL1 -ku8MBIllegalDataValue LITERAL1 -ku8MBSlaveDeviceFailure LITERAL1 - -ku8MBSuccess LITERAL1 -ku8MBInvalidSlaveID LITERAL1 -ku8MBInvalidFunction LITERAL1 -ku8MBResponseTimedOut LITERAL1 -ku8MBInvalidCRC LITERAL1 diff --git a/lib/ModbusMaster/library.properties b/lib/ModbusMaster/library.properties deleted file mode 100644 index a2be2fa7..00000000 --- a/lib/ModbusMaster/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=ModbusMaster -version=2.0.1 -author=Doc Walker -maintainer=Doc Walker <4-20ma@wvfans.net> -sentence=Enlighten your Arduino to be a Modbus master. -paragraph=Enables communication with Modbus slaves over RS232/485 (via RTU protocol). Requires an RS232/485 transceiver. -category=Communication -url=https://github.com/4-20ma/ModbusMaster -architectures=* -includes=ModbusMaster.h diff --git a/lib/ModbusMaster/src/ModbusMaster.cpp b/lib/ModbusMaster/src/ModbusMaster.cpp deleted file mode 100644 index 4169e585..00000000 --- a/lib/ModbusMaster/src/ModbusMaster.cpp +++ /dev/null @@ -1,876 +0,0 @@ -/** -@file -Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol). -*/ -/* - - ModbusMaster.cpp - Arduino library for communicating with Modbus slaves - over RS232/485 (via RTU protocol). - - Library:: ModbusMaster - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - - -/* _____PROJECT INCLUDES_____________________________________________________ */ -#include "ModbusMaster.h" - - -/* _____GLOBAL VARIABLES_____________________________________________________ */ - - -/* _____PUBLIC FUNCTIONS_____________________________________________________ */ -/** -Constructor. - -Creates class object; initialize it using ModbusMaster::begin(). - -@ingroup setup -*/ -ModbusMaster::ModbusMaster(void) -{ - _idle = 0; - _preTransmission = 0; - _postTransmission = 0; -} - -/** -Initialize class object. - -Assigns the Modbus slave ID and serial port. -Call once class has been instantiated, typically within setup(). - -@param slave Modbus slave ID (1..255) -@param &serial reference to serial port object (Serial, Serial1, ... Serial3) -@ingroup setup -*/ -void ModbusMaster::begin(uint8_t slave, Stream &serial) -{ -// txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t)); - _u8MBSlave = slave; - _serial = &serial; - _u8TransmitBufferIndex = 0; - u16TransmitBufferLength = 0; - -#if __MODBUSMASTER_DEBUG__ - pinMode(__MODBUSMASTER_DEBUG_PIN_A__, OUTPUT); - pinMode(__MODBUSMASTER_DEBUG_PIN_B__, OUTPUT); -#endif -} - - -void ModbusMaster::beginTransmission(uint16_t u16Address) -{ - _u16WriteAddress = u16Address; - _u8TransmitBufferIndex = 0; - u16TransmitBufferLength = 0; -} - -// eliminate this function in favor of using existing MB request functions -uint8_t ModbusMaster::requestFrom(uint16_t address, uint16_t quantity) -{ - uint8_t read; - // clamp to buffer length - if (quantity > ku8MaxBufferSize) - { - quantity = ku8MaxBufferSize; - } - // set rx buffer iterator vars - _u8ResponseBufferIndex = 0; - _u8ResponseBufferLength = read; - - return read; -} - - -void ModbusMaster::sendBit(bool data) -{ - uint8_t txBitIndex = u16TransmitBufferLength % 16; - if ((u16TransmitBufferLength >> 4) < ku8MaxBufferSize) - { - if (0 == txBitIndex) - { - _u16TransmitBuffer[_u8TransmitBufferIndex] = 0; - } - bitWrite(_u16TransmitBuffer[_u8TransmitBufferIndex], txBitIndex, data); - u16TransmitBufferLength++; - _u8TransmitBufferIndex = u16TransmitBufferLength >> 4; - } -} - - -void ModbusMaster::send(uint16_t data) -{ - if (_u8TransmitBufferIndex < ku8MaxBufferSize) - { - _u16TransmitBuffer[_u8TransmitBufferIndex++] = data; - u16TransmitBufferLength = _u8TransmitBufferIndex << 4; - } -} - - -void ModbusMaster::send(uint32_t data) -{ - send(lowWord(data)); - send(highWord(data)); -} - - -void ModbusMaster::send(uint8_t data) -{ - send(word(data)); -} - - - - - - - - - -uint8_t ModbusMaster::available(void) -{ - return _u8ResponseBufferLength - _u8ResponseBufferIndex; -} - - -uint16_t ModbusMaster::receive(void) -{ - if (_u8ResponseBufferIndex < _u8ResponseBufferLength) - { - return _u16ResponseBuffer[_u8ResponseBufferIndex++]; - } - else - { - return 0xFFFF; - } -} - - - - - - - - -/** -Set idle time callback function (cooperative multitasking). - -This function gets called in the idle time between transmission of data -and response from slave. Do not call functions that read from the serial -buffer that is used by ModbusMaster. Use of i2c/TWI, 1-Wire, other -serial ports, etc. is permitted within callback function. - -@see ModbusMaster::ModbusMasterTransaction() -*/ -void ModbusMaster::idle(void (*idle)()) -{ - _idle = idle; -} - -/** -Set pre-transmission callback function. - -This function gets called just before a Modbus message is sent over serial. -Typical usage of this callback is to enable an RS485 transceiver's -Driver Enable pin, and optionally disable its Receiver Enable pin. - -@see ModbusMaster::ModbusMasterTransaction() -@see ModbusMaster::postTransmission() -*/ -void ModbusMaster::preTransmission(void (*preTransmission)()) -{ - _preTransmission = preTransmission; -} - -/** -Set post-transmission callback function. - -This function gets called after a Modbus message has finished sending -(i.e. after all data has been physically transmitted onto the serial -bus). - -Typical usage of this callback is to enable an RS485 transceiver's -Receiver Enable pin, and disable its Driver Enable pin. - -@see ModbusMaster::ModbusMasterTransaction() -@see ModbusMaster::preTransmission() -*/ -void ModbusMaster::postTransmission(void (*postTransmission)()) -{ - _postTransmission = postTransmission; -} - - -/** -Retrieve data from response buffer. - -@see ModbusMaster::clearResponseBuffer() -@param u8Index index of response buffer array (0x00..0x3F) -@return value in position u8Index of response buffer (0x0000..0xFFFF) -@ingroup buffer -*/ -uint16_t ModbusMaster::getResponseBuffer(uint8_t u8Index) -{ - if (u8Index < ku8MaxBufferSize) - { - return _u16ResponseBuffer[u8Index]; - } - else - { - return 0xFFFF; - } -} - - -/** -Clear Modbus response buffer. - -@see ModbusMaster::getResponseBuffer(uint8_t u8Index) -@ingroup buffer -*/ -void ModbusMaster::clearResponseBuffer() -{ - uint8_t i; - - for (i = 0; i < ku8MaxBufferSize; i++) - { - _u16ResponseBuffer[i] = 0; - } -} - - -/** -Place data in transmit buffer. - -@see ModbusMaster::clearTransmitBuffer() -@param u8Index index of transmit buffer array (0x00..0x3F) -@param u16Value value to place in position u8Index of transmit buffer (0x0000..0xFFFF) -@return 0 on success; exception number on failure -@ingroup buffer -*/ -uint8_t ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) -{ - if (u8Index < ku8MaxBufferSize) - { - _u16TransmitBuffer[u8Index] = u16Value; - return ku8MBSuccess; - } - else - { - return ku8MBIllegalDataAddress; - } -} - - -/** -Clear Modbus transmit buffer. - -@see ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) -@ingroup buffer -*/ -void ModbusMaster::clearTransmitBuffer() -{ - uint8_t i; - - for (i = 0; i < ku8MaxBufferSize; i++) - { - _u16TransmitBuffer[i] = 0; - } -} - - -/** -Modbus function 0x01 Read Coils. - -This function code is used to read from 1 to 2000 contiguous status of -coils in a remote device. The request specifies the starting address, -i.e. the address of the first coil specified, and the number of coils. -Coils are addressed starting at zero. - -The coils in the response buffer are packed as one coil per bit of the -data field. Status is indicated as 1=ON and 0=OFF. The LSB of the first -data word contains the output addressed in the query. The other coils -follow toward the high order end of this word and from low order to high -order in subsequent words. - -If the returned quantity is not a multiple of sixteen, the remaining -bits in the final data word will be padded with zeros (toward the high -order end of the word). - -@param u16ReadAddress address of first coil (0x0000..0xFFFF) -@param u16BitQty quantity of coils to read (1..2000, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup discrete -*/ -uint8_t ModbusMaster::readCoils(uint16_t u16ReadAddress, uint16_t u16BitQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16BitQty; - return ModbusMasterTransaction(ku8MBReadCoils); -} - - -/** -Modbus function 0x02 Read Discrete Inputs. - -This function code is used to read from 1 to 2000 contiguous status of -discrete inputs in a remote device. The request specifies the starting -address, i.e. the address of the first input specified, and the number -of inputs. Discrete inputs are addressed starting at zero. - -The discrete inputs in the response buffer are packed as one input per -bit of the data field. Status is indicated as 1=ON; 0=OFF. The LSB of -the first data word contains the input addressed in the query. The other -inputs follow toward the high order end of this word, and from low order -to high order in subsequent words. - -If the returned quantity is not a multiple of sixteen, the remaining -bits in the final data word will be padded with zeros (toward the high -order end of the word). - -@param u16ReadAddress address of first discrete input (0x0000..0xFFFF) -@param u16BitQty quantity of discrete inputs to read (1..2000, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup discrete -*/ -uint8_t ModbusMaster::readDiscreteInputs(uint16_t u16ReadAddress, - uint16_t u16BitQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16BitQty; - return ModbusMasterTransaction(ku8MBReadDiscreteInputs); -} - - -/** -Modbus function 0x03 Read Holding Registers. - -This function code is used to read the contents of a contiguous block of -holding registers in a remote device. The request specifies the starting -register address and the number of registers. Registers are addressed -starting at zero. - -The register data in the response buffer is packed as one word per -register. - -@param u16ReadAddress address of the first holding register (0x0000..0xFFFF) -@param u16ReadQty quantity of holding registers to read (1..125, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, - uint16_t u16ReadQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16ReadQty; - return ModbusMasterTransaction(ku8MBReadHoldingRegisters); -} - - -/** -Modbus function 0x04 Read Input Registers. - -This function code is used to read from 1 to 125 contiguous input -registers in a remote device. The request specifies the starting -register address and the number of registers. Registers are addressed -starting at zero. - -The register data in the response buffer is packed as one word per -register. - -@param u16ReadAddress address of the first input register (0x0000..0xFFFF) -@param u16ReadQty quantity of input registers to read (1..125, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::readInputRegisters(uint16_t u16ReadAddress, - uint8_t u16ReadQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16ReadQty; - return ModbusMasterTransaction(ku8MBReadInputRegisters); -} - - -/** -Modbus function 0x05 Write Single Coil. - -This function code is used to write a single output to either ON or OFF -in a remote device. The requested ON/OFF state is specified by a -constant in the state field. A non-zero value requests the output to be -ON and a value of 0 requests it to be OFF. The request specifies the -address of the coil to be forced. Coils are addressed starting at zero. - -@param u16WriteAddress address of the coil (0x0000..0xFFFF) -@param u8State 0=OFF, non-zero=ON (0x00..0xFF) -@return 0 on success; exception number on failure -@ingroup discrete -*/ -uint8_t ModbusMaster::writeSingleCoil(uint16_t u16WriteAddress, uint8_t u8State) -{ - _u16WriteAddress = u16WriteAddress; - _u16WriteQty = (u8State ? 0xFF00 : 0x0000); - return ModbusMasterTransaction(ku8MBWriteSingleCoil); -} - - -/** -Modbus function 0x06 Write Single Register. - -This function code is used to write a single holding register in a -remote device. The request specifies the address of the register to be -written. Registers are addressed starting at zero. - -@param u16WriteAddress address of the holding register (0x0000..0xFFFF) -@param u16WriteValue value to be written to holding register (0x0000..0xFFFF) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, - uint16_t u16WriteValue) -{ - _u16WriteAddress = u16WriteAddress; - _u16WriteQty = 0; - _u16TransmitBuffer[0] = u16WriteValue; - return ModbusMasterTransaction(ku8MBWriteSingleRegister); -} - - -/** -Modbus function 0x0F Write Multiple Coils. - -This function code is used to force each coil in a sequence of coils to -either ON or OFF in a remote device. The request specifies the coil -references to be forced. Coils are addressed starting at zero. - -The requested ON/OFF states are specified by contents of the transmit -buffer. A logical '1' in a bit position of the buffer requests the -corresponding output to be ON. A logical '0' requests it to be OFF. - -@param u16WriteAddress address of the first coil (0x0000..0xFFFF) -@param u16BitQty quantity of coils to write (1..2000, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup discrete -*/ -uint8_t ModbusMaster::writeMultipleCoils(uint16_t u16WriteAddress, - uint16_t u16BitQty) -{ - _u16WriteAddress = u16WriteAddress; - _u16WriteQty = u16BitQty; - return ModbusMasterTransaction(ku8MBWriteMultipleCoils); -} -uint8_t ModbusMaster::writeMultipleCoils() -{ - _u16WriteQty = u16TransmitBufferLength; - return ModbusMasterTransaction(ku8MBWriteMultipleCoils); -} - - -/** -Modbus function 0x10 Write Multiple Registers. - -This function code is used to write a block of contiguous registers (1 -to 123 registers) in a remote device. - -The requested written values are specified in the transmit buffer. Data -is packed as one word per register. - -@param u16WriteAddress address of the holding register (0x0000..0xFFFF) -@param u16WriteQty quantity of holding registers to write (1..123, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::writeMultipleRegisters(uint16_t u16WriteAddress, - uint16_t u16WriteQty) -{ - _u16WriteAddress = u16WriteAddress; - _u16WriteQty = u16WriteQty; - return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); -} - -// new version based on Wire.h -uint8_t ModbusMaster::writeMultipleRegisters() -{ - _u16WriteQty = _u8TransmitBufferIndex; - return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); -} - - -/** -Modbus function 0x16 Mask Write Register. - -This function code is used to modify the contents of a specified holding -register using a combination of an AND mask, an OR mask, and the -register's current contents. The function can be used to set or clear -individual bits in the register. - -The request specifies the holding register to be written, the data to be -used as the AND mask, and the data to be used as the OR mask. Registers -are addressed starting at zero. - -The function's algorithm is: - -Result = (Current Contents && And_Mask) || (Or_Mask && (~And_Mask)) - -@param u16WriteAddress address of the holding register (0x0000..0xFFFF) -@param u16AndMask AND mask (0x0000..0xFFFF) -@param u16OrMask OR mask (0x0000..0xFFFF) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::maskWriteRegister(uint16_t u16WriteAddress, - uint16_t u16AndMask, uint16_t u16OrMask) -{ - _u16WriteAddress = u16WriteAddress; - _u16TransmitBuffer[0] = u16AndMask; - _u16TransmitBuffer[1] = u16OrMask; - return ModbusMasterTransaction(ku8MBMaskWriteRegister); -} - - -/** -Modbus function 0x17 Read Write Multiple Registers. - -This function code performs a combination of one read operation and one -write operation in a single MODBUS transaction. The write operation is -performed before the read. Holding registers are addressed starting at -zero. - -The request specifies the starting address and number of holding -registers to be read as well as the starting address, and the number of -holding registers. The data to be written is specified in the transmit -buffer. - -@param u16ReadAddress address of the first holding register (0x0000..0xFFFF) -@param u16ReadQty quantity of holding registers to read (1..125, enforced by remote device) -@param u16WriteAddress address of the first holding register (0x0000..0xFFFF) -@param u16WriteQty quantity of holding registers to write (1..121, enforced by remote device) -@return 0 on success; exception number on failure -@ingroup register -*/ -uint8_t ModbusMaster::readWriteMultipleRegisters(uint16_t u16ReadAddress, - uint16_t u16ReadQty, uint16_t u16WriteAddress, uint16_t u16WriteQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16ReadQty; - _u16WriteAddress = u16WriteAddress; - _u16WriteQty = u16WriteQty; - return ModbusMasterTransaction(ku8MBReadWriteMultipleRegisters); -} -uint8_t ModbusMaster::readWriteMultipleRegisters(uint16_t u16ReadAddress, - uint16_t u16ReadQty) -{ - _u16ReadAddress = u16ReadAddress; - _u16ReadQty = u16ReadQty; - _u16WriteQty = _u8TransmitBufferIndex; - return ModbusMasterTransaction(ku8MBReadWriteMultipleRegisters); -} - - -/* _____PRIVATE FUNCTIONS____________________________________________________ */ -/** -Modbus transaction engine. -Sequence: - - assemble Modbus Request Application Data Unit (ADU), - based on particular function called - - transmit request over selected serial port - - wait for/retrieve response - - evaluate/disassemble response - - return status (success/exception) - -@param u8MBFunction Modbus function (0x01..0xFF) -@return 0 on success; exception number on failure -*/ -uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) -{ - uint8_t u8ModbusADU[256]; - uint8_t u8ModbusADUSize = 0; - uint8_t i, u8Qty; - uint16_t u16CRC; - uint32_t u32StartTime; - uint8_t u8BytesLeft = 8; - uint8_t u8MBStatus = ku8MBSuccess; - - // assemble Modbus Request Application Data Unit - u8ModbusADU[u8ModbusADUSize++] = _u8MBSlave; - u8ModbusADU[u8ModbusADUSize++] = u8MBFunction; - - switch(u8MBFunction) - { - case ku8MBReadCoils: - case ku8MBReadDiscreteInputs: - case ku8MBReadInputRegisters: - case ku8MBReadHoldingRegisters: - case ku8MBReadWriteMultipleRegisters: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadAddress); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadAddress); - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadQty); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadQty); - break; - } - - switch(u8MBFunction) - { - case ku8MBWriteSingleCoil: - case ku8MBMaskWriteRegister: - case ku8MBWriteMultipleCoils: - case ku8MBWriteSingleRegister: - case ku8MBWriteMultipleRegisters: - case ku8MBReadWriteMultipleRegisters: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteAddress); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteAddress); - break; - } - - switch(u8MBFunction) - { - case ku8MBWriteSingleCoil: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); - break; - - case ku8MBWriteSingleRegister: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[0]); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[0]); - break; - - case ku8MBWriteMultipleCoils: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); - u8Qty = (_u16WriteQty % 8) ? ((_u16WriteQty >> 3) + 1) : (_u16WriteQty >> 3); - u8ModbusADU[u8ModbusADUSize++] = u8Qty; - for (i = 0; i < u8Qty; i++) - { - switch(i % 2) - { - case 0: // i is even - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[i >> 1]); - break; - - case 1: // i is odd - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[i >> 1]); - break; - } - } - break; - - case ku8MBWriteMultipleRegisters: - case ku8MBReadWriteMultipleRegisters: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty << 1); - - for (i = 0; i < lowByte(_u16WriteQty); i++) - { - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[i]); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[i]); - } - break; - - case ku8MBMaskWriteRegister: - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[0]); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[0]); - u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[1]); - u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[1]); - break; - } - - // append CRC - u16CRC = 0xFFFF; - for (i = 0; i < u8ModbusADUSize; i++) - { - u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); - } - u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); - u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); - u8ModbusADU[u8ModbusADUSize] = 0; - - // flush receive buffer before transmitting request - while (_serial->read() != -1); - - // transmit request - if (_preTransmission) - { - _preTransmission(); - } - for (i = 0; i < u8ModbusADUSize; i++) - { - _serial->write(u8ModbusADU[i]); - } - - u8ModbusADUSize = 0; - _serial->flush(); // flush transmit buffer - if (_postTransmission) - { - _postTransmission(); - } - - // loop until we run out of time or bytes, or an error occurs - u32StartTime = millis(); - while (u8BytesLeft && !u8MBStatus) - { - if (_serial->available()) - { -#if __MODBUSMASTER_DEBUG__ - digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true); -#endif - u8ModbusADU[u8ModbusADUSize++] = _serial->read(); - u8BytesLeft--; -#if __MODBUSMASTER_DEBUG__ - digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, false); -#endif - } - else - { -#if __MODBUSMASTER_DEBUG__ - digitalWrite(__MODBUSMASTER_DEBUG_PIN_B__, true); -#endif - if (_idle) - { - _idle(); - } -#if __MODBUSMASTER_DEBUG__ - digitalWrite(__MODBUSMASTER_DEBUG_PIN_B__, false); -#endif - } - - // evaluate slave ID, function code once enough bytes have been read - if (u8ModbusADUSize == 5) - { - // verify response is for correct Modbus slave - if (u8ModbusADU[0] != _u8MBSlave) - { - u8MBStatus = ku8MBInvalidSlaveID; - break; - } - - // verify response is for correct Modbus function code (mask exception bit 7) - if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) - { - u8MBStatus = ku8MBInvalidFunction; - break; - } - - // check whether Modbus exception occurred; return Modbus Exception Code - if (bitRead(u8ModbusADU[1], 7)) - { - u8MBStatus = u8ModbusADU[2]; - break; - } - - // evaluate returned Modbus function code - switch(u8ModbusADU[1]) - { - case ku8MBReadCoils: - case ku8MBReadDiscreteInputs: - case ku8MBReadInputRegisters: - case ku8MBReadHoldingRegisters: - case ku8MBReadWriteMultipleRegisters: - u8BytesLeft = u8ModbusADU[2]; - break; - - case ku8MBWriteSingleCoil: - case ku8MBWriteMultipleCoils: - case ku8MBWriteSingleRegister: - case ku8MBWriteMultipleRegisters: - u8BytesLeft = 3; - break; - - case ku8MBMaskWriteRegister: - u8BytesLeft = 5; - break; - } - } - if ((millis() - u32StartTime) > ku16MBResponseTimeout) - { - u8MBStatus = ku8MBResponseTimedOut; - } - } - - // verify response is large enough to inspect further - if (!u8MBStatus && u8ModbusADUSize >= 5) - { - // calculate CRC - u16CRC = 0xFFFF; - for (i = 0; i < (u8ModbusADUSize - 2); i++) - { - u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); - } - - // verify CRC - if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || - highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) - { - u8MBStatus = ku8MBInvalidCRC; - } - } - - // disassemble ADU into words - if (!u8MBStatus) - { - // evaluate returned Modbus function code - switch(u8ModbusADU[1]) - { - case ku8MBReadCoils: - case ku8MBReadDiscreteInputs: - // load bytes into word; response bytes are ordered L, H, L, H, ... - for (i = 0; i < (u8ModbusADU[2] >> 1); i++) - { - if (i < ku8MaxBufferSize) - { - _u16ResponseBuffer[i] = word(u8ModbusADU[2 * i + 4], u8ModbusADU[2 * i + 3]); - } - - _u8ResponseBufferLength = i; - } - - // in the event of an odd number of bytes, load last byte into zero-padded word - if (u8ModbusADU[2] % 2) - { - if (i < ku8MaxBufferSize) - { - _u16ResponseBuffer[i] = word(0, u8ModbusADU[2 * i + 3]); - } - - _u8ResponseBufferLength = i + 1; - } - break; - - case ku8MBReadInputRegisters: - case ku8MBReadHoldingRegisters: - case ku8MBReadWriteMultipleRegisters: - // load bytes into word; response bytes are ordered H, L, H, L, ... - for (i = 0; i < (u8ModbusADU[2] >> 1); i++) - { - if (i < ku8MaxBufferSize) - { - _u16ResponseBuffer[i] = word(u8ModbusADU[2 * i + 3], u8ModbusADU[2 * i + 4]); - } - - _u8ResponseBufferLength = i; - } - break; - } - } - - _u8TransmitBufferIndex = 0; - u16TransmitBufferLength = 0; - _u8ResponseBufferIndex = 0; - return u8MBStatus; -} diff --git a/lib/ModbusMaster/src/ModbusMaster.h b/lib/ModbusMaster/src/ModbusMaster.h deleted file mode 100644 index b8c566a4..00000000 --- a/lib/ModbusMaster/src/ModbusMaster.h +++ /dev/null @@ -1,270 +0,0 @@ -/** -@file -Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol). - -@defgroup setup ModbusMaster Object Instantiation/Initialization -@defgroup buffer ModbusMaster Buffer Management -@defgroup discrete Modbus Function Codes for Discrete Coils/Inputs -@defgroup register Modbus Function Codes for Holding/Input Registers -@defgroup constant Modbus Function Codes, Exception Codes -*/ -/* - - ModbusMaster.h - Arduino library for communicating with Modbus slaves - over RS232/485 (via RTU protocol). - - Library:: ModbusMaster - - Copyright:: 2009-2016 Doc Walker - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - - -#ifndef ModbusMaster_h -#define ModbusMaster_h - - -/** -@def __MODBUSMASTER_DEBUG__ (0) -Set to 1 to enable debugging features within class: - - PIN A cycles for each byte read in the Modbus response - - PIN B cycles for each millisecond timeout during the Modbus response -*/ -#define __MODBUSMASTER_DEBUG__ (0) -#define __MODBUSMASTER_DEBUG_PIN_A__ 4 -#define __MODBUSMASTER_DEBUG_PIN_B__ 5 - -/* _____STANDARD INCLUDES____________________________________________________ */ -// include types & constants of Wiring core API -#include "Arduino.h" - -/* _____UTILITY MACROS_______________________________________________________ */ - - -/* _____PROJECT INCLUDES_____________________________________________________ */ -// functions to calculate Modbus Application Data Unit CRC -#include "util/crc16.h" - -// functions to manipulate words -#include "util/word.h" - - -/* _____CLASS DEFINITIONS____________________________________________________ */ -/** -Arduino class library for communicating with Modbus slaves over -RS232/485 (via RTU protocol). -*/ -class ModbusMaster -{ - public: - ModbusMaster(); - - void begin(uint8_t, Stream &serial); - void idle(void (*)()); - void preTransmission(void (*)()); - void postTransmission(void (*)()); - - // Modbus exception codes - /** - Modbus protocol illegal function exception. - - The function code received in the query is not an allowable action for - the server (or slave). This may be because the function code is only - applicable to newer devices, and was not implemented in the unit - selected. It could also indicate that the server (or slave) is in the - wrong state to process a request of this type, for example because it is - unconfigured and is being asked to return register values. - - @ingroup constant - */ - static const uint8_t ku8MBIllegalFunction = 0x01; - - /** - Modbus protocol illegal data address exception. - - The data address received in the query is not an allowable address for - the server (or slave). More specifically, the combination of reference - number and transfer length is invalid. For a controller with 100 - registers, the ADU addresses the first register as 0, and the last one - as 99. If a request is submitted with a starting register address of 96 - and a quantity of registers of 4, then this request will successfully - operate (address-wise at least) on registers 96, 97, 98, 99. If a - request is submitted with a starting register address of 96 and a - quantity of registers of 5, then this request will fail with Exception - Code 0x02 "Illegal Data Address" since it attempts to operate on - registers 96, 97, 98, 99 and 100, and there is no register with address - 100. - - @ingroup constant - */ - static const uint8_t ku8MBIllegalDataAddress = 0x02; - - /** - Modbus protocol illegal data value exception. - - A value contained in the query data field is not an allowable value for - server (or slave). This indicates a fault in the structure of the - remainder of a complex request, such as that the implied length is - incorrect. It specifically does NOT mean that a data item submitted for - storage in a register has a value outside the expectation of the - application program, since the MODBUS protocol is unaware of the - significance of any particular value of any particular register. - - @ingroup constant - */ - static const uint8_t ku8MBIllegalDataValue = 0x03; - - /** - Modbus protocol slave device failure exception. - - An unrecoverable error occurred while the server (or slave) was - attempting to perform the requested action. - - @ingroup constant - */ - static const uint8_t ku8MBSlaveDeviceFailure = 0x04; - - // Class-defined success/exception codes - /** - ModbusMaster success. - - Modbus transaction was successful; the following checks were valid: - - slave ID - - function code - - response code - - data - - CRC - - @ingroup constant - */ - static const uint8_t ku8MBSuccess = 0x00; - - /** - ModbusMaster invalid response slave ID exception. - - The slave ID in the response does not match that of the request. - - @ingroup constant - */ - static const uint8_t ku8MBInvalidSlaveID = 0xE0; - - /** - ModbusMaster invalid response function exception. - - The function code in the response does not match that of the request. - - @ingroup constant - */ - static const uint8_t ku8MBInvalidFunction = 0xE1; - - /** - ModbusMaster response timed out exception. - - The entire response was not received within the timeout period, - ModbusMaster::ku8MBResponseTimeout. - - @ingroup constant - */ - static const uint8_t ku8MBResponseTimedOut = 0xE2; - - /** - ModbusMaster invalid response CRC exception. - - The CRC in the response does not match the one calculated. - - @ingroup constant - */ - static const uint8_t ku8MBInvalidCRC = 0xE3; - - uint16_t getResponseBuffer(uint8_t); - void clearResponseBuffer(); - uint8_t setTransmitBuffer(uint8_t, uint16_t); - void clearTransmitBuffer(); - - void beginTransmission(uint16_t); - uint8_t requestFrom(uint16_t, uint16_t); - void sendBit(bool); - void send(uint8_t); - void send(uint16_t); - void send(uint32_t); - uint8_t available(void); - uint16_t receive(void); - - - uint8_t readCoils(uint16_t, uint16_t); - uint8_t readDiscreteInputs(uint16_t, uint16_t); - uint8_t readHoldingRegisters(uint16_t, uint16_t); - uint8_t readInputRegisters(uint16_t, uint8_t); - uint8_t writeSingleCoil(uint16_t, uint8_t); - uint8_t writeSingleRegister(uint16_t, uint16_t); - uint8_t writeMultipleCoils(uint16_t, uint16_t); - uint8_t writeMultipleCoils(); - uint8_t writeMultipleRegisters(uint16_t, uint16_t); - uint8_t writeMultipleRegisters(); - uint8_t maskWriteRegister(uint16_t, uint16_t, uint16_t); - uint8_t readWriteMultipleRegisters(uint16_t, uint16_t, uint16_t, uint16_t); - uint8_t readWriteMultipleRegisters(uint16_t, uint16_t); - - private: - Stream* _serial; ///< reference to serial port object - uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in begin() - static const uint8_t ku8MaxBufferSize = 64; ///< size of response/transmit buffers - uint16_t _u16ReadAddress; ///< slave register from which to read - uint16_t _u16ReadQty; ///< quantity of words to read - uint16_t _u16ResponseBuffer[ku8MaxBufferSize]; ///< buffer to store Modbus slave response; read via GetResponseBuffer() - uint16_t _u16WriteAddress; ///< slave register to which to write - uint16_t _u16WriteQty; ///< quantity of words to write - uint16_t _u16TransmitBuffer[ku8MaxBufferSize]; ///< buffer containing data to transmit to Modbus slave; set via SetTransmitBuffer() - uint16_t* txBuffer; // from Wire.h -- need to clean this up Rx - uint8_t _u8TransmitBufferIndex; - uint16_t u16TransmitBufferLength; - uint16_t* rxBuffer; // from Wire.h -- need to clean this up Rx - uint8_t _u8ResponseBufferIndex; - uint8_t _u8ResponseBufferLength; - - // Modbus function codes for bit access - static const uint8_t ku8MBReadCoils = 0x01; ///< Modbus function 0x01 Read Coils - static const uint8_t ku8MBReadDiscreteInputs = 0x02; ///< Modbus function 0x02 Read Discrete Inputs - static const uint8_t ku8MBWriteSingleCoil = 0x05; ///< Modbus function 0x05 Write Single Coil - static const uint8_t ku8MBWriteMultipleCoils = 0x0F; ///< Modbus function 0x0F Write Multiple Coils - - // Modbus function codes for 16 bit access - static const uint8_t ku8MBReadHoldingRegisters = 0x03; ///< Modbus function 0x03 Read Holding Registers - static const uint8_t ku8MBReadInputRegisters = 0x04; ///< Modbus function 0x04 Read Input Registers - static const uint8_t ku8MBWriteSingleRegister = 0x06; ///< Modbus function 0x06 Write Single Register - static const uint8_t ku8MBWriteMultipleRegisters = 0x10; ///< Modbus function 0x10 Write Multiple Registers - static const uint8_t ku8MBMaskWriteRegister = 0x16; ///< Modbus function 0x16 Mask Write Register - static const uint8_t ku8MBReadWriteMultipleRegisters = 0x17; ///< Modbus function 0x17 Read Write Multiple Registers - - // Modbus timeout [milliseconds] - static const uint16_t ku16MBResponseTimeout = 150; ///< Modbus timeout [milliseconds] - - // master function that conducts Modbus transactions - uint8_t ModbusMasterTransaction(uint8_t u8MBFunction); - - // idle callback function; gets called during idle time between TX and RX - void (*_idle)(); - // preTransmission callback function; gets called before writing a Modbus message - void (*_preTransmission)(); - // postTransmission callback function; gets called after a Modbus message has been sent - void (*_postTransmission)(); -}; -#endif - -/** -@example examples/Basic/Basic.pde -@example examples/PhoenixContact_nanoLC/PhoenixContact_nanoLC.pde -@example examples/RS485_HalfDuplex/RS485_HalfDuplex.ino -*/ diff --git a/lib/ModbusMaster/src/util/crc16.h b/lib/ModbusMaster/src/util/crc16.h deleted file mode 100644 index 27ea89ec..00000000 --- a/lib/ModbusMaster/src/util/crc16.h +++ /dev/null @@ -1,88 +0,0 @@ -/** -@file -CRC Computations - -@defgroup util_crc16 "util/crc16.h": CRC Computations -@code#include "util/crc16.h"@endcode - -This header file provides functions for calculating -cyclic redundancy checks (CRC) using common polynomials. -Modified by Doc Walker to be processor-independent (removed inline -assembler to allow it to compile on SAM3X8E processors). - -@par References: -Jack Crenshaw's "Implementing CRCs" article in the January 1992 issue of @e -Embedded @e Systems @e Programming. This may be difficult to find, but it -explains CRC's in very clear and concise terms. Well worth the effort to -obtain a copy. - -*/ -/* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz - Copyright (c) 2005, 2007 Joerg Wunsch - Copyright (c) 2013 Dave Hylands - Copyright (c) 2013 Frederic Nadeau - Copyright (c) 2015 Doc Walker - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of the copyright holders nor the names of - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. */ - - -#ifndef _UTIL_CRC16_H_ -#define _UTIL_CRC16_H_ - - -/** @ingroup util_crc16 - Processor-independent CRC-16 calculation. - - Polynomial: x^16 + x^15 + x^2 + 1 (0xA001)
- Initial value: 0xFFFF - - This CRC is normally used in disk-drive controllers. - - @param uint16_t crc (0x0000..0xFFFF) - @param uint8_t a (0x00..0xFF) - @return calculated CRC (0x0000..0xFFFF) -*/ -static uint16_t crc16_update(uint16_t crc, uint8_t a) -{ - int i; - - crc ^= a; - for (i = 0; i < 8; ++i) - { - if (crc & 1) - crc = (crc >> 1) ^ 0xA001; - else - crc = (crc >> 1); - } - - return crc; -} - - -#endif /* _UTIL_CRC16_H_ */ diff --git a/lib/ModbusMaster/src/util/word.h b/lib/ModbusMaster/src/util/word.h deleted file mode 100644 index c72ad944..00000000 --- a/lib/ModbusMaster/src/util/word.h +++ /dev/null @@ -1,64 +0,0 @@ -/** -@file -Utility Functions for Manipulating Words - -@defgroup util_word "util/word.h": Utility Functions for Manipulating Words -@code#include "util/word.h"@endcode - -This header file provides utility functions for manipulating words. - -*/ -/* - - word.h - Utility Functions for Manipulating Words - - This file is part of ModbusMaster. - - ModbusMaster is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - ModbusMaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with ModbusMaster. If not, see . - - Written by Doc Walker (Rx) - Copyright © 2009-2015 Doc Walker <4-20ma at wvfans dot net> - -*/ - - -#ifndef _UTIL_WORD_H_ -#define _UTIL_WORD_H_ - - -/** @ingroup util_word - Return low word of a 32-bit integer. - - @param uint32_t ww (0x00000000..0xFFFFFFFF) - @return low word of input (0x0000..0xFFFF) -*/ -static inline uint16_t lowWord(uint32_t ww) -{ - return (uint16_t) ((ww) & 0xFFFF); -} - - -/** @ingroup util_word - Return high word of a 32-bit integer. - - @param uint32_t ww (0x00000000..0xFFFFFFFF) - @return high word of input (0x0000..0xFFFF) -*/ -static inline uint16_t highWord(uint32_t ww) -{ - return (uint16_t) ((ww) >> 16); -} - - -#endif /* _UTIL_WORD_H_ */ diff --git a/platformio.ini b/platformio.ini index 98ed5b66..bd0eef56 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,10 +35,9 @@ extra_scripts = ./tools/littlefsbuilder.py ;============================================================================================================================================= [env:esp8266_01_1m] framework = arduino +board = nodemcuv2 ;board = esp01_1m ;board = esp12e -board = nodemcuv2 -;board_build.ldscript = eagle.flash.1m256.ld board_build.ldscript = eagle.flash.1m512.ld platform = https://github.com/platformio/platform-espressif8266.git lib_deps = diff --git a/src/BufferExecute.cpp b/src/BufferExecute.cpp index 1bff0d34..b28778bb 100644 --- a/src/BufferExecute.cpp +++ b/src/BufferExecute.cpp @@ -9,7 +9,6 @@ #include "items/vLogging.h" #include "items/vImpulsOut.h" #include "items/vCountDown.h" -#include "items/SensorModbusClass.h" void loopCmdAdd(const String& cmdStr) { orderBuf += cmdStr; @@ -88,11 +87,6 @@ void csvCmdExecute(String& cmdStr) { else if (order == F("bmp280-press")) { sCmd.addCommand(order.c_str(), bmp280Press); } -#endif -#ifdef SensorModbusEnabled - else if (order == F("modbus")) { - sCmd.addCommand(order.c_str(), modbus); - } #endif else if (order == F("uptime")) { sCmd.addCommand(order.c_str(), sysUptime); diff --git a/src/SoftUART.cpp b/src/SoftUART.cpp index 8a7dc57e..00673fce 100644 --- a/src/SoftUART.cpp +++ b/src/SoftUART.cpp @@ -1,3 +1,4 @@ +#include "Consts.h" #ifdef uartEnable #include "SoftUART.h" #include "Global.h" diff --git a/src/Telegram.cpp b/src/Telegram.cpp index 2ab73d32..ee8fabb9 100644 --- a/src/Telegram.cpp +++ b/src/Telegram.cpp @@ -1,11 +1,12 @@ -#ifdef telegram +#include "Consts.h" +#ifdef telegramEnable #include "Telegram.h" CTBot* myBot{ nullptr }; void telegramInit() { if (isTelegramEnabled()) { telegramInitBeen = true; - sCmd.addCommand("telegram", sendTelegramMsg); + sCmd.addCommand("telegramEnable", sendTelegramMsg); String token = jsonReadStr(configSetupJson, "telegramApi"); if (!myBot) { myBot = new CTBot(); diff --git a/src/Utils/TimeUtils.cpp b/src/Utils/TimeUtils.cpp index 6d2dcdee..47786861 100644 --- a/src/Utils/TimeUtils.cpp +++ b/src/Utils/TimeUtils.cpp @@ -3,7 +3,8 @@ #include "Utils/StringUtils.h" static const uint8_t days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; -static const char* week_days[7] = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; + +//static const char* week_days[7] = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; // String getTimeUnix() { // time_t t; diff --git a/src/items/SensorModbusClass.cpp b/src/items/SensorModbusClass.cpp deleted file mode 100644 index a4e84157..00000000 --- a/src/items/SensorModbusClass.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Consts.h" -#ifdef SensorModbusEnabled -#include "items/SensorModbusClass.h" -#include "BufferExecute.h" -//=========================================Модуль modbus=================================================================================== -//modbus;id;anydata;Сенсоры;Температура;order;addr[1];regaddr[0];c[1] -//========================================================================================================================================= -SensorModbusClass mySensorModbus; - -void modbus() { - mySensorModbus.update(); - String key = mySensorModbus.gkey(); - sCmd.addCommand(key.c_str(), modbusReading); - mySensorModbus.SensorModbusInit(); - mySensorModbus.clear(); -} -void modbusReading() { - String key = sCmd.order(); - String addr = sCmd.next(); - String regaddr = sCmd.next(); - mySensorModbus.SensorModbusRead(key, addr.toInt(), regaddr.toInt()); -} -#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 60edbce8..78e16b92 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,7 +50,7 @@ void setup() { itemsListInit(); espInit(); routerConnect(); -#ifdef telegram +#ifdef telegramEnable telegramInit(); #endif uptime_init(); @@ -95,7 +95,7 @@ void loop() { myNotAsyncActions->loop(); ts.update(); -#ifdef telegram +#ifdef telegramEnable handleTelegram(); #endif