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) {
42 while (tt->nextTurnout != NULL)
44 tt->nextTurnout =
this;
48 this->
set(id, add, subAdd);
50 #ifdef USE_TEXTCOMMAND 51 INTERFACE.print(
"<O>");
52 #if !defined(USE_ETHERNET) 53 INTERFACE.println(
"");
60 void Turnout::set(
int id,
int add,
int subAdd) {
62 this->data.address = add;
63 this->data.subAddress = subAdd;
64 this->data.tStatus = 0;
69 void Turnout::activate(
int s) {
71 DCCppClass::mainRegs.setAccessory(this->data.address, this->data.subAddress, this->data.tStatus);
73 if (this->eepromPos>0)
75 EEPROM.put(this->eepromPos, (
void *) &(this->data.tStatus),
sizeof(
int));
77 EEPROM.put(this->eepromPos, this->data.tStatus);
80 #ifdef USE_TEXTCOMMAND 81 INTERFACE.print(
"<H");
82 INTERFACE.print(data.id);
83 if (data.tStatus == 0)
84 INTERFACE.print(
" 0>");
86 INTERFACE.print(
" 1>");
87 #if !defined(USE_ETHERNET) 88 INTERFACE.println(
"");
93 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 98 for (tt = firstTurnout; tt != NULL && tt->data.id != id; tt = tt->nextTurnout)
104 void Turnout::remove(
int id) {
107 for (tt = firstTurnout; tt != NULL && tt->data.id != id; pp = tt, tt = tt->nextTurnout)
111 #ifdef USE_TEXTCOMMAND 112 INTERFACE.print(
"<X>");
113 #if !defined(USE_ETHERNET) 114 INTERFACE.println(
"");
120 if (tt == firstTurnout)
121 firstTurnout = tt->nextTurnout;
123 pp->nextTurnout = tt->nextTurnout;
127 #ifdef USE_TEXTCOMMAND 128 INTERFACE.print(
"<O>");
129 #if !defined(USE_ETHERNET) 130 INTERFACE.println(
"");
137 int Turnout::count() {
140 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout)
148 void Turnout::load() {
152 for (
int i = 0; i<EEStore::eeStore->data.nTurnouts; i++) {
154 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(
TurnoutData));
156 EEPROM.get(EEStore::pointer(), data);
158 #if defined(USE_TEXTCOMMAND) 159 tt = create(data.id, data.address, data.subAddress);
162 #ifdef DCCPP_DEBUG_MODE 164 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE Turnout::load() !"));
167 tt->set(data.id, data.address, data.subAddress);
169 tt->data.tStatus = data.tStatus;
170 tt->eepromPos = EEStore::pointer();
171 EEStore::advance(
sizeof(tt->data));
177 void Turnout::store() {
181 EEStore::eeStore->data.nTurnouts = 0;
184 tt->eepromPos = EEStore::pointer();
186 EEPROM.put(EEStore::pointer(), (
void *) &(tt->data),
sizeof(
TurnoutData));
188 EEPROM.put(EEStore::pointer(), tt->data);
190 EEStore::advance(
sizeof(tt->data));
191 tt = tt->nextTurnout;
192 EEStore::eeStore->data.nTurnouts++;
199 #if defined(USE_TEXTCOMMAND) 202 void Turnout::parse(
char *c){
206 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
212 #ifdef USE_TEXTCOMMAND 215 INTERFACE.print(
"<X>");
216 #if !defined(USE_ETHERNET) 217 INTERFACE.println(
"");
231 #ifdef DCCPP_PRINT_DCCPP 239 Turnout *Turnout::create(
int id,
int add,
int subAdd) {
243 #ifdef DCCPP_DEBUG_MODE 244 INTERFACE.print(
"<X>");
245 #if !defined(USE_ETHERNET) 246 INTERFACE.println(
"");
252 tt->begin(
id, add, subAdd);
257 #endif USE_TEXTCOMMAND 259 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 260 #ifdef DCCPP_PRINT_DCCPP 264 void Turnout::show() {
267 if (firstTurnout == NULL) {
268 INTERFACE.print(
"<X>");
269 #if !defined(USE_ETHERNET) 270 INTERFACE.println(
"");
275 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout) {
276 INTERFACE.print(
"<H");
277 INTERFACE.print(tt->data.id);
278 INTERFACE.print(
" ");
279 INTERFACE.print(tt->data.address);
280 INTERFACE.print(
" ");
281 INTERFACE.print(tt->data.subAddress);
282 if (tt->data.tStatus == 0)
283 INTERFACE.print(
" 0>");
285 INTERFACE.print(
" 1>");
286 #if !defined(USE_ETHERNET) 287 INTERFACE.println(
"");
295 Turnout *Turnout::firstTurnout = NULL;