20 #include "DCCpp_Uno.h" 23 #ifdef USE_TEXTCOMMAND 24 #include "TextCommand.h" 34 void Turnout::begin(
int id,
int add,
int subAdd) {
35 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 36 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 37 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
38 DCCPP_INTERFACE.println(F(
"Turnout::begin() must be called BEFORE DCCpp.begin() !"));
41 if (firstTurnout == NULL) {
44 else if (get(
id) == NULL) {
45 Turnout *tt = firstTurnout;
46 while (tt->nextTurnout != NULL)
48 tt->nextTurnout =
this;
52 this->set(
id, add, subAdd);
54 #ifdef USE_TEXTCOMMAND 55 DCCPP_INTERFACE.print(
"<O>");
56 #if !defined(USE_ETHERNET) 57 DCCPP_INTERFACE.println(
"");
64 void Turnout::set(
int id,
int add,
int subAdd) {
66 this->data.address = add;
67 this->data.subAddress = subAdd;
68 this->data.tStatus = 0;
73 void Turnout::activate(
int s) {
75 DCCpp::mainRegs.setAccessory(this->data.address, this->data.subAddress, this->data.tStatus);
77 if (this->eepromPos>0)
79 EEPROM.put(this->eepromPos, (
void *) &(this->data.tStatus),
sizeof(
int));
81 EEPROM.put(this->eepromPos, this->data.tStatus);
84 #ifdef USE_TEXTCOMMAND 85 DCCPP_INTERFACE.print(
"<H");
86 DCCPP_INTERFACE.print(data.id);
87 if (data.tStatus == 0)
88 DCCPP_INTERFACE.print(
" 0>");
90 DCCPP_INTERFACE.print(
" 1>");
91 #if !defined(USE_ETHERNET) 92 DCCPP_INTERFACE.println(
"");
97 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 100 Turnout* Turnout::get(
int id) {
102 for (tt = firstTurnout; tt != NULL && tt->data.id != id; tt = tt->nextTurnout)
108 void Turnout::remove(
int id) {
111 for (tt = firstTurnout, pp = NULL; tt != NULL && tt->data.id != id; pp = tt, tt = tt->nextTurnout)
115 #ifdef USE_TEXTCOMMAND 116 DCCPP_INTERFACE.print(
"<X>");
117 #if !defined(USE_ETHERNET) 118 DCCPP_INTERFACE.println(
"");
124 if (tt == firstTurnout)
125 firstTurnout = tt->nextTurnout;
127 pp->nextTurnout = tt->nextTurnout;
131 #ifdef USE_TEXTCOMMAND 132 DCCPP_INTERFACE.print(
"<O>");
133 #if !defined(USE_ETHERNET) 134 DCCPP_INTERFACE.println(
"");
141 int Turnout::count() {
144 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout)
152 void Turnout::load() {
153 struct TurnoutData data;
156 for (
int i = 0; i<EEStore::data.nTurnouts; i++) {
158 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(TurnoutData));
160 EEPROM.get(EEStore::pointer(), data);
162 #if defined(USE_TEXTCOMMAND) 163 tt = create(data.id, data.address, data.subAddress);
166 #ifdef DCCPP_DEBUG_MODE 168 DCCPP_INTERFACE.println(F(
"Turnout::begin() must be called BEFORE Turnout::load() !"));
171 tt->set(data.id, data.address, data.subAddress);
173 tt->data.tStatus = data.tStatus;
174 tt->eepromPos = EEStore::pointer();
175 EEStore::advance(
sizeof(tt->data));
181 void Turnout::store() {
185 EEStore::data.nTurnouts = 0;
188 tt->eepromPos = EEStore::pointer();
190 EEPROM.put(EEStore::pointer(), (
void *) &(tt->data),
sizeof(TurnoutData));
192 EEPROM.put(EEStore::pointer(), tt->data);
194 EEStore::advance(
sizeof(tt->data));
195 tt = tt->nextTurnout;
196 EEStore::data.nTurnouts++;
203 #if defined(USE_TEXTCOMMAND) 206 bool Turnout::parse(
char *c){
210 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
218 DCCPP_INTERFACE.print(
"<H");
219 DCCPP_INTERFACE.print(n);
220 if (t->data.tStatus == 0)
221 DCCPP_INTERFACE.print(
" 0>");
223 DCCPP_INTERFACE.print(
" 1>");
224 #if !defined(USE_ETHERNET) 225 DCCPP_INTERFACE.println(
"");
231 #ifdef USE_TEXTCOMMAND 234 DCCPP_INTERFACE.print(
"<X>");
235 #if !defined(USE_ETHERNET) 236 DCCPP_INTERFACE.println(
"");
250 #ifdef DCCPP_PRINT_DCCPP 259 Turnout *Turnout::create(
int id,
int add,
int subAdd) {
260 Turnout *tt =
new Turnout();
263 #ifdef USE_TEXTCOMMAND 264 DCCPP_INTERFACE.print(
"<X>");
265 #if !defined(USE_ETHERNET) 266 DCCPP_INTERFACE.println(
"");
272 tt->begin(
id, add, subAdd);
277 #endif //USE_TEXTCOMMAND 279 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 280 #ifdef DCCPP_PRINT_DCCPP 284 void Turnout::show() {
287 if (firstTurnout == NULL) {
288 DCCPP_INTERFACE.print(
"<X>");
289 #if !defined(USE_ETHERNET) 290 DCCPP_INTERFACE.println(
"");
295 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout) {
296 DCCPP_INTERFACE.print(
"<H");
297 DCCPP_INTERFACE.print(tt->data.id);
298 DCCPP_INTERFACE.print(
" ");
299 DCCPP_INTERFACE.print(tt->data.address);
300 DCCPP_INTERFACE.print(
" ");
301 DCCPP_INTERFACE.print(tt->data.subAddress);
302 if (tt->data.tStatus == 0)
303 DCCPP_INTERFACE.print(
" 0>");
305 DCCPP_INTERFACE.print(
" 1>");
306 #if !defined(USE_ETHERNET) 307 DCCPP_INTERFACE.println(
"");
315 Turnout *Turnout::firstTurnout = NULL;