This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
machines-backup/extrusion/lydia-print-head-v1/firmware/firmware/ModbusBridge.h

172 lines
3.4 KiB
C++

#ifndef MODBUS_BRIDGE_H
#define MODBUS_BRIDGE_H
#include "Addon.h"
#include <Controllino.h>
#include "Mudbus.h"
#define MAX_QUERY_BUFFER 20
class Modbus;
// query struct
class Query
{
public:
int slave;
long addr;
long value;
int state;
long fn;
millis_t ts;
int id;
int prio;
int owner;
long printNumber(int number)
{
Serial.print(" ");
int spaces = 0;
if (number < 1000)
{
spaces = 1;
}
if (number < 100)
{
spaces = 2;
}
if (number < 10)
{
spaces = 3;
}
for (int i = 0; i < spaces; i++)
{
Serial.print(" ");
}
Serial.print(number);
}
void print()
{
Serial.print("SLAVE: ");
Serial.print(slave);
Serial.print(" \t | Address: ");
// Serial.print(addr, HEX);
printNumber(addr);
Serial.print(" \t | VALUE: ");
printNumber(value);
Serial.print(" \t | STATE ");
if (state == DONE)
{
Serial.print("Done ");
}
if (state == PROCESSING)
{
Serial.print("Processsing");
}
if (state == QUEUED)
{
Serial.print("Queued ");
}
Serial.print(" \t | FN: ");
Serial.print(fn);
Serial.print(" \t | PRIO: ");
Serial.print(prio);
Serial.print(" | ");
Serial.print(" \t | OWNER: ");
Serial.print(owner);
Serial.print(" | ");
}
Query()
{
reset();
}
void reset()
{
state = DONE;
fn = 0;
ts = 0;
value = 0;
slave = 0;
addr = 0;
prio = 0;
owner = 0;
}
};
class ModbusBridge : public Addon
{
public:
ModbusBridge() : Addon("ModbusBridge", 50, ADDON_NORMAL),
mb(new Mudbus())
{
setFlag(DEBUG);
debug_flags = 0;
debug_flags = 1 << DEBUG_RECEIVE;
nextWaitingTime = 1000;
}
uint16_t ModbusSlaveRegisters[8];
// Addon std implementation
short debug(Stream *stream);
short info(Stream *stream);
short setup();
short loop();
short loop_test();
// current query
short id;
short fn;
short addr;
int nb;
long debug_flags;
short queryState();
short query(int slave, short function, long start, int coils, Addon *_addon, AddonFnPtr _mPtr);
short qstate();
// 0x6 callback
AddonFnPtr updatedPtr;
// on Error
AddonFnPtr onError;
// on RawMessage
AddonRxFn onMessage;
// callback owner
Addon *owner;
int nextWaitingTime;
Mudbus *mb;
// Modbus query / commands
Query *nextQueryByState(uchar state = DONE, int owner = -1);
Query *nextQueryByOwner(uchar state = DONE, int owner = -1);
Query *nextByPrio(uchar state, int prio);
Query *nextSame(uchar state, short slave, int addr, short fn, int value);
int numSame(uchar state, short slave, int addr, short fn, int value);
int numByState(int state);
void print();
enum FLAGS
{
DEBUG_RECEIVE = 1,
DEBUG_SEND = 2,
};
Query queries[MAX_QUERY_BUFFER];
millis_t startTS;
Modbus *modbus();
void setDebugSend(bool debug);
////////////////////////////////////////////////////////////////
//
// TCP Gateway
//
};
#endif