Skip to content

Commit

Permalink
Added IonoModbusRtuSlave.subscribeDigital()
Browse files Browse the repository at this point in the history
Added IonoModbusRtuSlave.subscribeDigital() to let user attach custom callbacks to digital inputs variations
  • Loading branch information
giampiero7 committed Apr 14, 2020
1 parent 83baf65 commit 0f1f6a5
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 5 deletions.
58 changes: 55 additions & 3 deletions IonoModbusRtu/IonoModbusRtuSlave.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
*/

#include "IonoModbusRtuSlave.h"
#include <Iono.h>

#ifdef IONO_MKR
#define DO_MAX_INDEX 4
Expand All @@ -38,9 +37,16 @@ word IonoModbusRtuSlaveClass::_di4count = 0;
word IonoModbusRtuSlaveClass::_di5count = 0;
word IonoModbusRtuSlaveClass::_di6count = 0;

IonoClass::Callback *IonoModbusRtuSlaveClass::_di1Callback = NULL;
IonoClass::Callback *IonoModbusRtuSlaveClass::_di2Callback = NULL;
IonoClass::Callback *IonoModbusRtuSlaveClass::_di3Callback = NULL;
IonoClass::Callback *IonoModbusRtuSlaveClass::_di4Callback = NULL;
IonoClass::Callback *IonoModbusRtuSlaveClass::_di5Callback = NULL;
IonoClass::Callback *IonoModbusRtuSlaveClass::_di6Callback = NULL;

char IonoModbusRtuSlaveClass::_inMode[4] = {0, 0, 0, 0};

Callback *IonoModbusRtuSlaveClass::_customCallback = NULL;
ModbusRtuSlaveClass::Callback *IonoModbusRtuSlaveClass::_customCallback = NULL;

void IonoModbusRtuSlaveClass::begin(byte unitAddr, unsigned long baud, unsigned long config, unsigned long diDebounceTime) {
SERIAL_PORT_HARDWARE.begin(baud, config);
Expand Down Expand Up @@ -82,52 +88,98 @@ void IonoModbusRtuSlaveClass::process() {
Iono.process();
}

void IonoModbusRtuSlaveClass::setCustomHandler(Callback *callback) {
void IonoModbusRtuSlaveClass::setCustomHandler(ModbusRtuSlaveClass::Callback *callback) {
_customCallback = callback;
}

void IonoModbusRtuSlaveClass::subscribeDigital(uint8_t pin, IonoClass::Callback *callback) {
switch (pin) {
case DI1:
_di1Callback = callback;
break;

case DI2:
_di2Callback = callback;
break;

case DI3:
_di3Callback = callback;
break;

case DI4:
_di4Callback = callback;
break;

case DI5:
_di5Callback = callback;
break;

case DI6:
_di6Callback = callback;
break;
}
}

void IonoModbusRtuSlaveClass::onDIChange(uint8_t pin, float value) {
switch (pin) {
case DI1:
_di1deb = value == HIGH;
if (_di1deb) {
_di1count++;
}
if (_di1Callback != NULL) {
_di1Callback(pin, value);
}
break;

case DI2:
_di2deb = value == HIGH;
if (_di2deb) {
_di2count++;
}
if (_di2Callback != NULL) {
_di2Callback(pin, value);
}
break;

case DI3:
_di3deb = value == HIGH;
if (_di3deb) {
_di3count++;
}
if (_di3Callback != NULL) {
_di3Callback(pin, value);
}
break;

case DI4:
_di4deb = value == HIGH;
if (_di4deb) {
_di4count++;
}
if (_di4Callback != NULL) {
_di4Callback(pin, value);
}
break;

case DI5:
_di5deb = value == HIGH;
if (_di5deb) {
_di5count++;
}
if (_di5Callback != NULL) {
_di5Callback(pin, value);
}
break;

case DI6:
_di6deb = value == HIGH;
if (_di6deb) {
_di6count++;
}
if (_di6Callback != NULL) {
_di6Callback(pin, value);
}
break;
}
}
Expand Down
13 changes: 11 additions & 2 deletions IonoModbusRtu/IonoModbusRtuSlave.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,17 @@
#define IonoModbusRtuSlave_h

#include <ModbusRtuSlave.h>
#include <Iono.h>

#define MB_RESP_PASS 0xFE

class IonoModbusRtuSlaveClass {
public:
static void begin(byte unitAddr, unsigned long baud, unsigned long config, unsigned long diDebounceTime);
static void process();
static void setCustomHandler(Callback *callback);
static void setCustomHandler(ModbusRtuSlaveClass::Callback *callback);
static void setInputMode(int idx, char mode);
static void subscribeDigital(uint8_t pin, IonoClass::Callback *callback);

private:
static bool _di1deb;
Expand All @@ -42,9 +44,16 @@ class IonoModbusRtuSlaveClass {
static word _di5count;
static word _di6count;

static IonoClass::Callback *_di1Callback;
static IonoClass::Callback *_di2Callback;
static IonoClass::Callback *_di3Callback;
static IonoClass::Callback *_di4Callback;
static IonoClass::Callback *_di5Callback;
static IonoClass::Callback *_di6Callback;

static char _inMode[4];

static Callback *_customCallback;
static ModbusRtuSlaveClass::Callback *_customCallback;

static byte onRequest(byte unitAddr, byte function, word regAddr, word qty, byte *data);
static void onDIChange(uint8_t pin, float value);
Expand Down

0 comments on commit 0f1f6a5

Please sign in to comment.