10 #ifdef ARDUINO_ARCH_AVR 21 #include "DCCpp_Uno.h" 24 #ifdef USE_TEXTCOMMAND 25 #include "TextCommand.h" 35 void Turnout::begin(
int id,
int add,
int subAdd) {
36 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 37 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 38 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
39 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE DCCpp.begin() !"));
42 if (firstTurnout == NULL) {
45 else if (
get(
id) == NULL) {
46 Turnout *tt = firstTurnout;
47 while (tt->nextTurnout != NULL)
49 tt->nextTurnout =
this;
53 this->
set(id, add, subAdd);
55 #ifdef USE_TEXTCOMMAND 56 INTERFACE.print(
"<O>");
57 #if !defined(USE_ETHERNET) 58 INTERFACE.println(
"");
65 void Turnout::set(
int id,
int add,
int subAdd) {
67 this->data.address = add;
68 this->data.subAddress = subAdd;
69 this->data.tStatus = 0;
74 void Turnout::activate(
int s) {
76 DCCpp::mainRegs.setAccessory(this->data.address, this->data.subAddress, this->data.tStatus);
78 if (this->eepromPos>0)
80 EEPROM.put(this->eepromPos, (
void *) &(this->data.tStatus),
sizeof(
int));
82 EEPROM.put(this->eepromPos, this->data.tStatus);
85 #ifdef USE_TEXTCOMMAND 86 INTERFACE.print(
"<H");
87 INTERFACE.print(data.id);
88 if (data.tStatus == 0)
89 INTERFACE.print(
" 0>");
91 INTERFACE.print(
" 1>");
92 #if !defined(USE_ETHERNET) 93 INTERFACE.println(
"");
98 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 101 Turnout* Turnout::get(
int id) {
103 for (tt = firstTurnout; tt != NULL && tt->data.id != id; tt = tt->nextTurnout)
109 void Turnout::remove(
int id) {
112 for (tt = firstTurnout; tt != NULL && tt->data.id != id; pp = tt, tt = tt->nextTurnout)
116 #ifdef USE_TEXTCOMMAND 117 INTERFACE.print(
"<X>");
118 #if !defined(USE_ETHERNET) 119 INTERFACE.println(
"");
125 if (tt == firstTurnout)
126 firstTurnout = tt->nextTurnout;
128 pp->nextTurnout = tt->nextTurnout;
132 #ifdef USE_TEXTCOMMAND 133 INTERFACE.print(
"<O>");
134 #if !defined(USE_ETHERNET) 135 INTERFACE.println(
"");
142 int Turnout::count() {
145 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout)
153 void Turnout::load() {
154 struct TurnoutData data;
157 for (
int i = 0; i<EEStore::data.nTurnouts; i++) {
159 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(TurnoutData));
161 EEPROM.get(EEStore::pointer(), data);
163 #if defined(USE_TEXTCOMMAND) 164 tt = create(data.id, data.address, data.subAddress);
167 #ifdef DCCPP_DEBUG_MODE 169 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE Turnout::load() !"));
172 tt->set(data.id, data.address, data.subAddress);
174 tt->data.tStatus = data.tStatus;
175 tt->eepromPos = EEStore::pointer();
176 EEStore::advance(
sizeof(tt->data));
182 void Turnout::store() {
186 EEStore::data.nTurnouts = 0;
189 tt->eepromPos = EEStore::pointer();
191 EEPROM.put(EEStore::pointer(), (
void *) &(tt->data),
sizeof(TurnoutData));
193 EEPROM.put(EEStore::pointer(), tt->data);
195 EEStore::advance(
sizeof(tt->data));
196 tt = tt->nextTurnout;
197 EEStore::data.nTurnouts++;
204 #if defined(USE_TEXTCOMMAND) 207 void Turnout::parse(
char *c){
211 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
217 #ifdef USE_TEXTCOMMAND 220 INTERFACE.print(
"<X>");
221 #if !defined(USE_ETHERNET) 222 INTERFACE.println(
"");
236 #ifdef DCCPP_PRINT_DCCPP 244 Turnout *Turnout::create(
int id,
int add,
int subAdd) {
245 Turnout *tt =
new Turnout();
248 #ifdef USE_TEXTCOMMAND 249 INTERFACE.print(
"<X>");
250 #if !defined(USE_ETHERNET) 251 INTERFACE.println(
"");
257 tt->begin(
id, add, subAdd);
262 #endif //USE_TEXTCOMMAND 264 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 265 #ifdef DCCPP_PRINT_DCCPP 269 void Turnout::show() {
272 if (firstTurnout == NULL) {
273 INTERFACE.print(
"<X>");
274 #if !defined(USE_ETHERNET) 275 INTERFACE.println(
"");
280 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout) {
281 INTERFACE.print(
"<H");
282 INTERFACE.print(tt->data.id);
283 INTERFACE.print(
" ");
284 INTERFACE.print(tt->data.address);
285 INTERFACE.print(
" ");
286 INTERFACE.print(tt->data.subAddress);
287 if (tt->data.tStatus == 0)
288 INTERFACE.print(
" 0>");
290 INTERFACE.print(
" 1>");
291 #if !defined(USE_ETHERNET) 292 INTERFACE.println(
"");
300 Turnout *Turnout::firstTurnout = NULL;