12 #include "TextCommand.h" 13 #include "DCCpp_Uno.h" 22 void Output::begin(
int id,
int pin,
int iFlag) {
23 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 24 #ifdef DCCPP_DEBUG_MODE 25 if (EEStore::eeStore != NULL)
27 INTERFACE.println(F(
"Output::begin() must be called BEFORE DCCpp.begin() !"));
30 if (firstOutput == NULL) {
33 else if ((
get(
id)) == NULL) {
35 while (tt->nextOutput != NULL)
37 tt->nextOutput =
this;
41 this->
set(id, pin, iFlag);
43 #ifdef USE_TEXTCOMMAND 44 INTERFACE.print(
"<O>");
45 #if !defined(USE_ETHERNET) 46 INTERFACE.println(
"");
53 void Output::set(
int id,
int pin,
int iFlag) {
56 this->data.iFlag = iFlag;
57 this->data.oStatus = 0;
60 this->data.oStatus = bitRead(this->data.iFlag, 1) ? bitRead(this->data.iFlag, 2) : 0;
62 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
64 digitalWrite(this->data.pin, this->data.oStatus ^ bitRead(this->data.iFlag, 0));
66 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
68 pinMode(this->data.pin,
OUTPUT);
73 void Output::activate(
int s){
75 digitalWrite(data.pin,data.oStatus ^ bitRead(data.iFlag,0));
79 EEPROM.put(num, (
void *)&data.oStatus, 1);
81 EEPROM.put(num, data.oStatus);
84 #ifdef USE_TEXTCOMMAND 85 INTERFACE.print(
"<Y");
86 INTERFACE.print(data.id);
88 INTERFACE.print(
" 0>");
90 INTERFACE.print(
" 1>");
91 #if !defined(USE_ETHERNET) 92 INTERFACE.println(
"");
97 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 100 Output* Output::get(
int n){
102 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;tt=tt->nextOutput);
107 void Output::remove(
int n){
110 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;pp=tt,tt=tt->nextOutput);
113 #ifdef USE_TEXTCOMMAND 114 INTERFACE.print(
"<X>");
115 #if !defined(USE_ETHERNET) 116 INTERFACE.println(
"");
123 firstOutput=tt->nextOutput;
125 pp->nextOutput=tt->nextOutput;
129 #ifdef USE_TEXTCOMMAND 130 INTERFACE.print(
"<O>");
131 #if !defined(USE_ETHERNET) 132 INTERFACE.println(
"");
139 int Output::count() {
142 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput)
150 void Output::load() {
154 for (
int i = 0; i<EEStore::eeStore->data.nOutputs; i++) {
156 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(
OutputData));
158 EEPROM.get(EEStore::pointer(), data);
160 #if defined(USE_TEXTCOMMAND) 161 tt = create(data.id, data.pin, data.iFlag);
164 #ifdef DCCPP_DEBUG_MODE 166 INTERFACE.println(F(
"Output::begin() must be called BEFORE Output::load() !"));
169 tt->set(data.id, data.pin, data.iFlag);
172 tt->data.oStatus = bitRead(tt->data.iFlag, 1) ? bitRead(tt->data.iFlag, 2) : data.oStatus;
174 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
176 digitalWrite(tt->data.pin, tt->data.oStatus ^ bitRead(tt->data.iFlag, 0));
178 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
180 pinMode(tt->data.pin,
OUTPUT);
181 tt->num = EEStore::pointer();
182 EEStore::advance(
sizeof(tt->data));
188 void Output::store() {
192 EEStore::eeStore->data.nOutputs = 0;
195 tt->num = EEStore::pointer();
197 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(
OutputData));
199 EEPROM.put(EEStore::pointer(), tt->data);
201 EEStore::advance(
sizeof(tt->data));
203 EEStore::eeStore->data.nOutputs++;
210 #if defined(USE_TEXTCOMMAND) 213 void Output::parse(
char *c){
217 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
223 #ifdef USE_TEXTCOMMAND 226 INTERFACE.print(
"<X>");
227 #if !defined(USE_ETHERNET) 228 INTERFACE.println(
"");
242 #ifdef DCCPP_PRINT_DCCPP 252 Output *Output::create(
int id,
int pin,
int iFlag){
256 #ifdef USE_TEXTCOMMAND 257 INTERFACE.print(
"<X>");
258 #if !defined(USE_ETHERNET) 259 INTERFACE.println(
"");
265 tt->begin(
id, pin, iFlag);
270 #endif USE_TEXTCOMMAND 272 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 273 #ifdef DCCPP_PRINT_DCCPP 277 void Output::show() {
280 if (firstOutput == NULL) {
281 INTERFACE.print(
"<X>");
282 #if !defined(USE_ETHERNET) 283 INTERFACE.println(
"");
288 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput) {
289 INTERFACE.print(
"<Y");
290 INTERFACE.print(tt->data.id);
291 INTERFACE.print(
" ");
292 INTERFACE.print(tt->data.pin);
293 INTERFACE.print(
" ");
294 INTERFACE.print(tt->data.iFlag);
296 if (tt->data.oStatus == 0)
297 INTERFACE.print(
" 0>");
299 INTERFACE.print(
" 1>");
300 #if !defined(USE_ETHERNET) 301 INTERFACE.println(
"");
309 Output *Output::firstOutput=NULL;