Files
ESP32/DCC-Centrale/Firmware/BaseStation/DCCpp_Uno/PacketRegister.h
2026-02-10 11:05:54 +01:00

65 lines
2.1 KiB
C

/**********************************************************************
PacketRegister.h
COPYRIGHT (c) 2013-2016 Gregg E. Berman
Part of DCC++ BASE STATION for the Arduino
**********************************************************************/
#ifndef PacketRegister_h
#define PacketRegister_h
#include "Arduino.h"
// Define constants used for reading CVs from the Programming Track
#define ACK_BASE_COUNT 100 // number of analogRead samples to take before each CV verify to establish a baseline current
#define ACK_SAMPLE_COUNT 500 // number of analogRead samples to take when monitoring current after a CV verify (bit or byte) has been sent
#define ACK_SAMPLE_SMOOTHING 0.2 // exponential smoothing to use in processing the analogRead samples after a CV verify (bit or byte) has been sent
#define ACK_SAMPLE_THRESHOLD 30 // the threshold that the exponentially-smoothed analogRead samples (after subtracting the baseline current) must cross to establish ACKNOWLEDGEMENT
// Define a series of registers that can be sequentially accessed over a loop to generate a repeating series of DCC Packets
struct Packet{
byte buf[10];
byte nBits;
}; // Packet
struct Register{
Packet packet[2];
Packet *activePacket;
Packet *updatePacket;
void initPackets();
}; // Register
struct RegisterList{
int maxNumRegs;
Register *reg;
Register **regMap;
Register *currentReg;
Register *maxLoadedReg;
Register *nextReg;
Packet *tempPacket;
byte currentBit;
byte nRepeat;
int *speedTable;
static byte idlePacket[];
static byte resetPacket[];
static byte bitMask[];
RegisterList(int);
void loadPacket(int, byte *, int, int, int=0) volatile;
void setThrottle(char *) volatile;
void setFunction(char *) volatile;
void setAccessory(char *) volatile;
void writeTextPacket(char *) volatile;
void readCV(char *) volatile;
void writeCVByte(char *) volatile;
void writeCVBit(char *) volatile;
void writeCVByteMain(char *) volatile;
void writeCVBitMain(char *s) volatile;
void printPacket(int, byte *, int, int) volatile;
};
#endif