-
Notifications
You must be signed in to change notification settings - Fork 0
/
PacketRegister.h
64 lines (53 loc) · 2.13 KB
/
PacketRegister.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**********************************************************************
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"
extern long calcADCforCT(long adcReading);
// 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 // (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