15 #include "TextCommand.h" 16 #include "DCCpp_Uno.h" 25 void Output::begin(
int id,
int pin,
int iFlag) {
26 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 27 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 28 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
29 INTERFACE.println(F(
"Output::begin() must be called BEFORE DCCpp.begin() !"));
32 if (firstOutput == NULL) {
35 else if ((
get(
id)) == NULL) {
36 Output *tt = firstOutput;
37 while (tt->nextOutput != NULL)
39 tt->nextOutput =
this;
43 this->
set(id, pin, iFlag);
45 #ifdef USE_TEXTCOMMAND 46 INTERFACE.print(
"<O>");
47 #if !defined(USE_ETHERNET) 48 INTERFACE.println(
"");
55 void Output::set(
int id,
int pin,
int iFlag) {
58 this->data.iFlag = iFlag;
59 this->data.oStatus = 0;
62 this->data.oStatus = bitRead(this->data.iFlag, 1) ? bitRead(this->data.iFlag, 2) : 0;
64 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
66 digitalWrite(this->data.pin, this->data.oStatus ^ bitRead(this->data.iFlag, 0));
68 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
70 pinMode(this->data.pin, OUTPUT);
75 void Output::activate(
int s){
77 digitalWrite(data.pin,data.oStatus ^ bitRead(data.iFlag,0));
81 EEPROM.put(num, (
void *)&data.oStatus, 1);
83 EEPROM.put(num, data.oStatus);
86 #ifdef USE_TEXTCOMMAND 87 INTERFACE.print(
"<Y");
88 INTERFACE.print(data.id);
90 INTERFACE.print(
" 0>");
92 INTERFACE.print(
" 1>");
93 #if !defined(USE_ETHERNET) 94 INTERFACE.println(
"");
99 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 102 Output* Output::get(
int n){
104 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;tt=tt->nextOutput);
109 void Output::remove(
int n){
112 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;pp=tt,tt=tt->nextOutput);
115 #ifdef USE_TEXTCOMMAND 116 INTERFACE.print(
"<X>");
117 #if !defined(USE_ETHERNET) 118 INTERFACE.println(
"");
125 firstOutput=tt->nextOutput;
127 pp->nextOutput=tt->nextOutput;
131 #ifdef USE_TEXTCOMMAND 132 INTERFACE.print(
"<O>");
133 #if !defined(USE_ETHERNET) 134 INTERFACE.println(
"");
141 int Output::count() {
144 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput)
152 void Output::load() {
153 struct OutputData data;
156 for (
int i = 0; i<EEStore::data.nOutputs; i++) {
158 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(OutputData));
160 EEPROM.get(EEStore::pointer(), data);
162 #if defined(USE_TEXTCOMMAND) 163 tt = create(data.id, data.pin, data.iFlag);
166 #ifdef DCCPP_DEBUG_MODE 168 INTERFACE.println(F(
"Output::begin() must be called BEFORE Output::load() !"));
171 tt->set(data.id, data.pin, data.iFlag);
174 tt->data.oStatus = bitRead(tt->data.iFlag, 1) ? bitRead(tt->data.iFlag, 2) : data.oStatus;
176 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
178 digitalWrite(tt->data.pin, tt->data.oStatus ^ bitRead(tt->data.iFlag, 0));
180 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
182 pinMode(tt->data.pin, OUTPUT);
183 tt->num = EEStore::pointer();
184 EEStore::advance(
sizeof(tt->data));
190 void Output::store() {
194 EEStore::data.nOutputs = 0;
197 tt->num = EEStore::pointer();
199 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(OutputData));
201 EEPROM.put(EEStore::pointer(), tt->data);
203 EEStore::advance(
sizeof(tt->data));
205 EEStore::data.nOutputs++;
212 #if defined(USE_TEXTCOMMAND) 215 void Output::parse(
char *c){
219 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
225 #ifdef USE_TEXTCOMMAND 228 INTERFACE.print(
"<X>");
229 #if !defined(USE_ETHERNET) 230 INTERFACE.println(
"");
244 #ifdef DCCPP_PRINT_DCCPP 254 Output *Output::create(
int id,
int pin,
int iFlag){
255 Output *tt =
new Output();
258 #ifdef USE_TEXTCOMMAND 259 INTERFACE.print(
"<X>");
260 #if !defined(USE_ETHERNET) 261 INTERFACE.println(
"");
267 tt->begin(
id, pin, iFlag);
272 #endif USE_TEXTCOMMAND 274 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 275 #ifdef DCCPP_PRINT_DCCPP 279 void Output::show() {
282 if (firstOutput == NULL) {
283 INTERFACE.print(
"<X>");
284 #if !defined(USE_ETHERNET) 285 INTERFACE.println(
"");
290 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput) {
291 INTERFACE.print(
"<Y");
292 INTERFACE.print(tt->data.id);
293 INTERFACE.print(
" ");
294 INTERFACE.print(tt->data.pin);
295 INTERFACE.print(
" ");
296 INTERFACE.print(tt->data.iFlag);
298 if (tt->data.oStatus == 0)
299 INTERFACE.print(
" 0>");
301 INTERFACE.print(
" 1>");
302 #if !defined(USE_ETHERNET) 303 INTERFACE.println(
"");
311 Output *Output::firstOutput=NULL;