65 lines
2.1 KiB
C
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
|