10 #ifdef ARDUINO_ARCH_AVR 20 #include "TextCommand.h" 21 #include "DCCpp_Uno.h" 30 void Output::begin(
int id,
int pin,
int iFlag) {
31 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 32 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 33 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
34 INTERFACE.println(F(
"Output::begin() must be called BEFORE DCCpp.begin() !"));
37 if (firstOutput == NULL) {
40 else if ((
get(
id)) == NULL) {
41 Output *tt = firstOutput;
42 while (tt->nextOutput != NULL)
44 tt->nextOutput =
this;
48 this->
set(id, pin, iFlag);
50 #ifdef USE_TEXTCOMMAND 51 INTERFACE.print(
"<O>");
52 #if !defined(USE_ETHERNET) 53 INTERFACE.println(
"");
60 void Output::set(
int id,
int pin,
int iFlag) {
63 this->data.iFlag = iFlag;
64 this->data.oStatus = 0;
67 this->data.oStatus = bitRead(this->data.iFlag, 1) ? bitRead(this->data.iFlag, 2) : 0;
69 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
71 digitalWrite(this->data.pin, this->data.oStatus ^ bitRead(this->data.iFlag, 0));
73 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
75 pinMode(this->data.pin, OUTPUT);
80 void Output::activate(
int s){
82 digitalWrite(data.pin,data.oStatus ^ bitRead(data.iFlag,0));
86 EEPROM.put(num, (
void *)&data.oStatus, 1);
88 EEPROM.put(num, data.oStatus);
91 #ifdef USE_TEXTCOMMAND 92 INTERFACE.print(
"<Y");
93 INTERFACE.print(data.id);
95 INTERFACE.print(
" 0>");
97 INTERFACE.print(
" 1>");
98 #if !defined(USE_ETHERNET) 99 INTERFACE.println(
"");
104 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 107 Output* Output::get(
int n){
109 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;tt=tt->nextOutput);
114 void Output::remove(
int n){
117 for(tt=firstOutput;tt!=NULL && tt->data.id!=n;pp=tt,tt=tt->nextOutput);
120 #ifdef USE_TEXTCOMMAND 121 INTERFACE.print(
"<X>");
122 #if !defined(USE_ETHERNET) 123 INTERFACE.println(
"");
130 firstOutput=tt->nextOutput;
132 pp->nextOutput=tt->nextOutput;
136 #ifdef USE_TEXTCOMMAND 137 INTERFACE.print(
"<O>");
138 #if !defined(USE_ETHERNET) 139 INTERFACE.println(
"");
146 int Output::count() {
149 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput)
157 void Output::load() {
158 struct OutputData data;
161 for (
int i = 0; i<EEStore::data.nOutputs; i++) {
163 EEPROM.get(EEStore::pointer(), (
void *)&data,
sizeof(OutputData));
165 EEPROM.get(EEStore::pointer(), data);
167 #if defined(USE_TEXTCOMMAND) 168 tt = create(data.id, data.pin, data.iFlag);
171 #ifdef DCCPP_DEBUG_MODE 173 INTERFACE.println(F(
"Output::begin() must be called BEFORE Output::load() !"));
176 tt->set(data.id, data.pin, data.iFlag);
179 tt->data.oStatus = bitRead(tt->data.iFlag, 1) ? bitRead(tt->data.iFlag, 2) : data.oStatus;
181 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
183 digitalWrite(tt->data.pin, tt->data.oStatus ^ bitRead(tt->data.iFlag, 0));
185 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
187 pinMode(tt->data.pin, OUTPUT);
188 tt->num = EEStore::pointer();
189 EEStore::advance(
sizeof(tt->data));
195 void Output::store() {
199 EEStore::data.nOutputs = 0;
202 tt->num = EEStore::pointer();
204 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(OutputData));
206 EEPROM.put(EEStore::pointer(), tt->data);
208 EEStore::advance(
sizeof(tt->data));
210 EEStore::data.nOutputs++;
217 #if defined(USE_TEXTCOMMAND) 220 void Output::parse(
char *c){
224 switch(sscanf(c,
"%d %d %d",&n,&s,&m)){
232 INTERFACE.print(
"<X>");
233 #if !defined(USE_ETHERNET) 234 INTERFACE.println(
"");
247 #ifdef DCCPP_PRINT_DCCPP 257 Output *Output::create(
int id,
int pin,
int iFlag){
258 Output *tt =
new Output();
261 INTERFACE.print(
"<X>");
262 #if !defined(USE_ETHERNET) 263 INTERFACE.println(
"");
268 tt->begin(
id, pin, iFlag);
275 #if defined(USE_EEPROM) || defined(USE_TEXTCOMMAND) 276 #ifdef DCCPP_PRINT_DCCPP 280 void Output::show() {
283 if (firstOutput == NULL) {
284 INTERFACE.print(
"<X>");
285 #if !defined(USE_ETHERNET) 286 INTERFACE.println(
"");
291 for (tt = firstOutput; tt != NULL; tt = tt->nextOutput) {
292 INTERFACE.print(
"<Y");
293 INTERFACE.print(tt->data.id);
294 INTERFACE.print(
" ");
295 INTERFACE.print(tt->data.pin);
296 INTERFACE.print(
" ");
297 INTERFACE.print(tt->data.iFlag);
299 if (tt->data.oStatus == 0)
300 INTERFACE.print(
" 0>");
302 INTERFACE.print(
" 1>");
303 #if !defined(USE_ETHERNET) 304 INTERFACE.println(
"");
312 Output *Output::firstOutput=NULL;