15 #include "DCCpp_Uno.h" 18 #ifdef USE_TEXTCOMMAND 19 #include "TextCommand.h" 29 void Turnout::begin(
int id,
int add,
int subAdd) {
30 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 31 #ifdef DCCPP_DEBUG_MODE 32 if (EEStore::eeStore != NULL)
34 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE DCCpp.begin() !"));
37 if (firstTurnout == NULL) {
40 else if (
get(
id) == NULL) {
41 Turnout *tt = firstTurnout;
42 while (tt->nextTurnout != NULL)
44 tt->nextTurnout =
this;
48 this->
set(id, add, subAdd);
50 #ifdef DCCPP_DEBUG_MODE 51 INTERFACE.println(
"<O>");
57 void Turnout::set(
int id,
int add,
int subAdd) {
59 this->data.address = add;
60 this->data.subAddress = subAdd;
61 this->data.tStatus = 0;
66 void Turnout::activate(
int s) {
68 DCCppClass::mainRegs.setAccessory(this->data.address, this->data.subAddress, this->data.tStatus);
70 if (this->eepromPos>0)
72 EEPROM.put(this->eepromPos, (
void *) &(this->data.tStatus),
sizeof(
int));
74 EEPROM.put(this->eepromPos, this->data.tStatus);
77 #ifdef DCCPP_DEBUG_MODE 78 INTERFACE.print(
"<H");
79 INTERFACE.print(data.id);
80 if (data.tStatus == 0)
81 INTERFACE.println(
" 0>");
83 INTERFACE.println(
" 1>");
87 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 90 Turnout* Turnout::get(
int id) {
92 for (tt = firstTurnout; tt != NULL && tt->data.id != id; tt = tt->nextTurnout)
98 void Turnout::remove(
int id) {
101 for (tt = firstTurnout; tt != NULL && tt->data.id != id; pp = tt, tt = tt->nextTurnout)
105 #ifdef DCCPP_DEBUG_MODE 106 INTERFACE.println(
"<X>");
111 if (tt == firstTurnout)
112 firstTurnout = tt->nextTurnout;
114 pp->nextTurnout = tt->nextTurnout;
118 #ifdef DCCPP_DEBUG_MODE 119 INTERFACE.println(
"<O>");
125 int Turnout::count() {
128 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout)
136 void Turnout::load() {
137 struct TurnoutData data;
140 for (
int i = 0; i<EEStore::eeStore->data.nTurnouts; i++) {
142 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(TurnoutData));
144 EEPROM.get(EEStore::pointer(), data);
146 #if defined(USE_TEXTCOMMAND) 147 tt = create(data.id, data.address, data.subAddress);
150 #ifdef DCCPP_DEBUG_MODE 152 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE Turnout::load() !"));
155 tt->set(data.id, data.address, data.subAddress);
157 tt->data.tStatus = data.tStatus;
158 tt->eepromPos = EEStore::pointer();
159 EEStore::advance(
sizeof(tt->data));
165 void Turnout::store() {
169 EEStore::eeStore->data.nTurnouts = 0;
172 tt->eepromPos = EEStore::pointer();
174 EEPROM.put(EEStore::pointer(), (
void *) &(tt->data),
sizeof(TurnoutData));
176 EEPROM.put(EEStore::pointer(), tt->data);
178 EEStore::advance(
sizeof(tt->data));
179 tt = tt->nextTurnout;
180 EEStore::eeStore->data.nTurnouts++;
187 #if defined(USE_TEXTCOMMAND) 190 void Turnout::parse(
char *c){
194 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
200 #ifdef DCCPP_DEBUG_MODE 202 INTERFACE.println(
"<X>");
214 #ifdef DCCPP_DEBUG_MODE 222 Turnout *Turnout::create(
int id,
int add,
int subAdd) {
223 Turnout *tt =
new Turnout();
226 #ifdef DCCPP_DEBUG_MODE 227 INTERFACE.println(
"<X>");
232 tt->begin(
id, add, subadd);
237 #endif USE_TEXTCOMMAND 239 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 240 #ifdef DCCPP_PRINT_DCCPP 244 void Turnout::show() {
247 if (firstTurnout == NULL) {
248 INTERFACE.println(
"<X>");
252 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout) {
253 INTERFACE.print(
"<H");
254 INTERFACE.print(tt->data.id);
255 INTERFACE.print(
" ");
256 INTERFACE.print(tt->data.address);
257 INTERFACE.print(
" ");
258 INTERFACE.print(tt->data.subAddress);
259 if (tt->data.tStatus == 0)
260 INTERFACE.println(
" 0>");
262 INTERFACE.println(
" 1>");
269 Turnout *Turnout::firstTurnout = NULL;