19 #include "DCCpp_Uno.h" 22 #ifdef USE_TEXTCOMMAND 23 #include "TextCommand.h" 33 void Turnout::begin(
int id,
int add,
int subAdd) {
34 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 35 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 36 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
37 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE DCCpp.begin() !"));
40 if (firstTurnout == NULL) {
43 else if (
get(
id) == NULL) {
44 Turnout *tt = firstTurnout;
45 while (tt->nextTurnout != NULL)
47 tt->nextTurnout =
this;
51 this->
set(id, add, subAdd);
53 #ifdef USE_TEXTCOMMAND 54 INTERFACE.print(
"<O>");
55 #if !defined(USE_ETHERNET) 56 INTERFACE.println(
"");
63 void Turnout::set(
int id,
int add,
int subAdd) {
65 this->data.address = add;
66 this->data.subAddress = subAdd;
67 this->data.tStatus = 0;
72 void Turnout::activate(
int s) {
74 DCCpp::mainRegs.setAccessory(this->data.address, this->data.subAddress, this->data.tStatus);
76 if (this->eepromPos>0)
78 EEPROM.put(this->eepromPos, (
void *) &(this->data.tStatus),
sizeof(
int));
80 EEPROM.put(this->eepromPos, this->data.tStatus);
83 #ifdef USE_TEXTCOMMAND 84 INTERFACE.print(
"<H");
85 INTERFACE.print(data.id);
86 if (data.tStatus == 0)
87 INTERFACE.print(
" 0>");
89 INTERFACE.print(
" 1>");
90 #if !defined(USE_ETHERNET) 91 INTERFACE.println(
"");
96 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 99 Turnout* Turnout::get(
int id) {
101 for (tt = firstTurnout; tt != NULL && tt->data.id != id; tt = tt->nextTurnout)
107 void Turnout::remove(
int id) {
110 for (tt = firstTurnout; tt != NULL && tt->data.id != id; pp = tt, tt = tt->nextTurnout)
114 #ifdef USE_TEXTCOMMAND 115 INTERFACE.print(
"<X>");
116 #if !defined(USE_ETHERNET) 117 INTERFACE.println(
"");
123 if (tt == firstTurnout)
124 firstTurnout = tt->nextTurnout;
126 pp->nextTurnout = tt->nextTurnout;
130 #ifdef USE_TEXTCOMMAND 131 INTERFACE.print(
"<O>");
132 #if !defined(USE_ETHERNET) 133 INTERFACE.println(
"");
140 int Turnout::count() {
143 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout)
151 void Turnout::load() {
152 struct TurnoutData data;
155 for (
int i = 0; i<EEStore::data.nTurnouts; i++) {
157 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(TurnoutData));
159 EEPROM.get(EEStore::pointer(), data);
161 #if defined(USE_TEXTCOMMAND) 162 tt = create(data.id, data.address, data.subAddress);
165 #ifdef DCCPP_DEBUG_MODE 167 INTERFACE.println(F(
"Turnout::begin() must be called BEFORE Turnout::load() !"));
170 tt->set(data.id, data.address, data.subAddress);
172 tt->data.tStatus = data.tStatus;
173 tt->eepromPos = EEStore::pointer();
174 EEStore::advance(
sizeof(tt->data));
180 void Turnout::store() {
184 EEStore::data.nTurnouts = 0;
187 tt->eepromPos = EEStore::pointer();
189 EEPROM.put(EEStore::pointer(), (
void *) &(tt->data),
sizeof(TurnoutData));
191 EEPROM.put(EEStore::pointer(), tt->data);
193 EEStore::advance(
sizeof(tt->data));
194 tt = tt->nextTurnout;
195 EEStore::data.nTurnouts++;
202 #if defined(USE_TEXTCOMMAND) 205 void Turnout::parse(
char *c){
209 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
215 #ifdef USE_TEXTCOMMAND 218 INTERFACE.print(
"<X>");
219 #if !defined(USE_ETHERNET) 220 INTERFACE.println(
"");
234 #ifdef DCCPP_PRINT_DCCPP 242 Turnout *Turnout::create(
int id,
int add,
int subAdd) {
243 Turnout *tt =
new Turnout();
246 #ifdef USE_TEXTCOMMAND 247 INTERFACE.print(
"<X>");
248 #if !defined(USE_ETHERNET) 249 INTERFACE.println(
"");
255 tt->begin(
id, add, subAdd);
260 #endif USE_TEXTCOMMAND 262 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 263 #ifdef DCCPP_PRINT_DCCPP 267 void Turnout::show() {
270 if (firstTurnout == NULL) {
271 INTERFACE.print(
"<X>");
272 #if !defined(USE_ETHERNET) 273 INTERFACE.println(
"");
278 for (tt = firstTurnout; tt != NULL; tt = tt->nextTurnout) {
279 INTERFACE.print(
"<H");
280 INTERFACE.print(tt->data.id);
281 INTERFACE.print(
" ");
282 INTERFACE.print(tt->data.address);
283 INTERFACE.print(
" ");
284 INTERFACE.print(tt->data.subAddress);
285 if (tt->data.tStatus == 0)
286 INTERFACE.print(
" 0>");
288 INTERFACE.print(
" 1>");
289 #if !defined(USE_ETHERNET) 290 INTERFACE.println(
"");
298 Turnout *Turnout::firstTurnout = NULL;