// ***** Parse the commands from serial input void parseCmd(void) { int analogInput; // analog input temporary variable float analogVolts; ack = 1; if (sBuffer[0] == outputsCmd) { // Parse output commands ---------- switch (sBuffer[1]) { case '0': switch (sBuffer[2]) { case '0': //inputsMask = 0; blk = 0; outputs = 0; // reset all outputs buzzer = 0; // mute buzzer break; case '1': inputsMask = 0; blk = 0; outputs = 255; // set all outputs break; case '2': inputsMask = 0; blk = 255; // all outputs blink outputs = 255; break; case '8': Serial.print(outputsMask); // send back outputs status Serial.print(","); Serial.println(blk); ack = 0; break; default: ack = 2; } break; case '1': // output 1 (same follow outputs 2...8) switch (sBuffer[2]) { case '0': bitClear(inputsMask, 0); //bitSet(outputsMask, 0); bitClear(blk, 0); bitClear(outputs, 0); // reset output 1 break; case '1': bitClear(inputsMask, 0); //bitSet(outputsMask, 0); bitClear(blk, 0); bitSet(outputs, 0); // set output 1 break; case '2': bitClear(inputsMask, 0); //bitSet(outputsMask, 0); bitSet(blk, 0); // output blink 1 bitSet(outputs, 0); break; default: ack = 2; } break; case '2': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 1); //bitSet(outputsMask, 1); bitClear(blk, 1); bitClear(outputs, 1); break; case '1': bitClear(inputsMask, 1); //bitSet(outputsMask, 1); bitClear(blk, 1); bitSet(outputs, 1); break; case '2': bitClear(inputsMask, 1); //bitSet(outputsMask, 1); bitSet(blk, 1); bitSet(outputs, 1); break; default: ack = 2; } break; case '3': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 2); //bitSet(outputsMask, 2); bitClear(blk, 2); bitClear(outputs, 2); break; case '1': bitClear(inputsMask, 2); //bitSet(outputsMask, 2); bitClear(blk, 2); bitSet(outputs, 2); break; case '2': bitClear(inputsMask, 2); //bitSet(outputsMask, 2); bitSet(blk, 2); bitSet(outputs, 2); break; default: ack = 2; } break; case '4': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 3); //bitSet(outputsMask, 3); bitClear(blk, 3); bitClear(outputs, 3); break; case '1': bitClear(inputsMask, 3); //bitSet(outputsMask, 3); bitClear(blk, 3); bitSet(outputs, 3); break; case '2': bitClear(inputsMask, 3); //bitSet(outputsMask, 3); bitSet(blk, 3); bitSet(outputs, 3); break; default: ack = 2; } break; case '5': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 4); //bitSet(outputsMask, 4); bitClear(blk, 4); bitClear(outputs, 4); break; case '1': bitClear(inputsMask, 4); //bitSet(outputsMask, 4); bitClear(blk, 4); bitSet(outputs, 4); break; case '2': bitClear(inputsMask, 4); //bitSet(outputsMask, 4); bitSet(blk, 4); bitSet(outputs, 4); break; default: ack = 2; } break; case '6': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 5); //bitSet(outputsMask, 5); bitClear(blk, 5); bitClear(outputs, 5); break; case '1': bitClear(inputsMask, 5); //bitSet(outputsMask, 5); bitClear(blk, 5); bitSet(outputs, 5); break; case '2': bitClear(inputsMask, 5); //bitSet(outputsMask, 5); bitSet(blk, 5); bitSet(outputs, 5); break; default: ack = 2; } break; case '7': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 6); //bitSet(outputsMask, 6); bitClear(blk, 6); bitClear(outputs, 6); break; case '1': bitClear(inputsMask, 6); //bitSet(outputsMask, 6); bitClear(blk, 6); bitSet(outputs, 6); break; case '2': bitClear(inputsMask, 6); //bitSet(outputsMask, 6); bitSet(blk, 6); bitSet(outputs, 6); break; default: ack = 2; } break; case '8': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 7); //bitSet(outputsMask, 7); bitClear(blk, 7); bitClear(outputs, 7); break; case '1': bitClear(inputsMask, 7); //bitSet(outputsMask, 7); bitClear(blk, 7); bitSet(outputs, 7); break; case '2': bitClear(inputsMask, 7); //bitSet(outputsMask, 7); bitSet(blk, 7); bitSet(outputs, 7); break; default: ack = 2; } break; case '9': switch (sBuffer[2]) { case '0': buzzer = 0; // mute buzzer break; case '1': buzzer = 1; // buzzer on break; case '2': buzzer = 2; // one beep break; case '3': buzzer = 3; // continous beep beep... break; default: ack = 2; } break; default: ack = 2; } goto cmdEnd; }// Parse output commands end ---------- if (sBuffer[0] == settingsCmd) { // Parse settings commands ---------- switch (sBuffer[1]) { case '0': switch (sBuffer[2]) { case '0': // all outputs outputs = 0; inputsMask = 0; //outputsMask = 255; pullUp = 0; pinMode(pin1, OUTPUT); pinMode(pin2, OUTPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); pinMode(pin5, OUTPUT); pinMode(pin6, OUTPUT); pinMode(pin7, OUTPUT); pinMode(pin8, OUTPUT); break; case '1': // all inputs inputsMask = 255; //outputsMask = 0; pullUp = 0; digitalWrite(pin1, 0); digitalWrite(pin2, 0); digitalWrite(pin3, 0); digitalWrite(pin4, 0); digitalWrite(pin5, 0); digitalWrite(pin6, 0); digitalWrite(pin7, 0); digitalWrite(pin8, 0); pinMode(pin1, INPUT); pinMode(pin2, INPUT); pinMode(pin3, INPUT); pinMode(pin4, INPUT); pinMode(pin5, INPUT); pinMode(pin6, INPUT); pinMode(pin7, INPUT); pinMode(pin8, INPUT); break; case '2': // all inputs with pullup inputsMask = 255; //outputsMask = 0; pullUp = 255; digitalWrite(pin1, 0); digitalWrite(pin2, 0); digitalWrite(pin3, 0); digitalWrite(pin4, 0); digitalWrite(pin5, 0); digitalWrite(pin6, 0); digitalWrite(pin7, 0); digitalWrite(pin8, 0); pinMode(pin1, INPUT_PULLUP); pinMode(pin2, INPUT_PULLUP); pinMode(pin3, INPUT_PULLUP); pinMode(pin4, INPUT_PULLUP); pinMode(pin5, INPUT_PULLUP); pinMode(pin6, INPUT_PULLUP); pinMode(pin7, INPUT_PULLUP); pinMode(pin8, INPUT_PULLUP); break; case '3': // inputs 1 to 6 analog, 7 & 8 as outputs inputsMask = 63; //outputsMask = 192; pullUp = 0; digitalWrite(pin1, 0); digitalWrite(pin2, 0); digitalWrite(pin3, 0); digitalWrite(pin4, 0); digitalWrite(pin5, 0); digitalWrite(pin6, 0); digitalWrite(pin7, 0); digitalWrite(pin8, 0); pinMode(pin1, INPUT); pinMode(pin2, INPUT); pinMode(pin3, INPUT); pinMode(pin4, INPUT); pinMode(pin5, INPUT); pinMode(pin6, INPUT); pinMode(pin7, OUTPUT); pinMode(pin8, OUTPUT); break; case '4': // inputs 1 to 6 analog, 7 & 8 as inputs inputsMask = 255; pullUp = 0; digitalWrite(pin1, 0); digitalWrite(pin2, 0); digitalWrite(pin3, 0); digitalWrite(pin4, 0); digitalWrite(pin5, 0); digitalWrite(pin6, 0); digitalWrite(pin7, 0); digitalWrite(pin8, 0); pinMode(pin1, INPUT); pinMode(pin2, INPUT); pinMode(pin3, INPUT); pinMode(pin4, INPUT); pinMode(pin5, INPUT); pinMode(pin6, INPUT); pinMode(pin7, INPUT); pinMode(pin8, INPUT); break; case '5': // inputs 1 to 6 analog, 7 & 8 as inputs pullup inputsMask = 255; pullUp = 63; digitalWrite(pin1, 0); digitalWrite(pin2, 0); digitalWrite(pin3, 0); digitalWrite(pin4, 0); digitalWrite(pin5, 0); digitalWrite(pin6, 0); digitalWrite(pin7, 0); digitalWrite(pin8, 0); pinMode(pin1, INPUT); pinMode(pin2, INPUT); pinMode(pin3, INPUT); pinMode(pin4, INPUT); pinMode(pin5, INPUT); pinMode(pin6, INPUT); pinMode(pin7, INPUT_PULLUP); pinMode(pin8, INPUT_PULLUP); break; case '6': // set analog ref to Vcc (+5V) analogReference(DEFAULT); reference = 0; break; case '7': // set analog ref to internal 1.1V analogReference(INTERNAL); reference = 1; break; case '8': Serial.print(inputs & inputsMask); Serial.print(","); Serial.println(pullUp); ack = 0; break; default: ack = 2; } break; case '1': // set input/output 1 (same follow 2...8, except 7 & 8 not analog) switch (sBuffer[2]) { case '0': bitClear(inputsMask, 0); bitClear(pullUp, 0); pinMode(pin1, OUTPUT); // 1 as output break; case '1': bitSet(inputsMask, 0); // must be input bitClear(pullUp, 0); // without pullup if analog digitalWrite(pin1, 0); pinMode(pin1, INPUT); // 1 as input or analog input break; case '2': bitSet(inputsMask, 0); bitSet(pullUp, 0); digitalWrite(pin1, 0); pinMode(pin2, INPUT_PULLUP); // 1 as input pullup break; default: ack = 2; } break; case '2': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 1); bitClear(pullUp, 1); pinMode(pin2, OUTPUT); // 2 as output break; case '1': bitSet(inputsMask, 1); bitClear(pullUp, 1); digitalWrite(pin2, 0); pinMode(pin2, INPUT); // 2 as input or analog input break; case '2': bitSet(inputsMask, 1); bitSet(pullUp, 1); digitalWrite(pin2, 0); pinMode(pin2, INPUT_PULLUP); // 2 as input pullup break; default: ack = 2; } break; case '3': switch (sBuffer[2]) { case '0': bitClear(pullUp, 2); pinMode(pin3, OUTPUT); // 3 as output bitClear(inputsMask, 2); break; case '1': bitSet(inputsMask, 2); bitClear(pullUp, 2); digitalWrite(pin3, 0); pinMode(pin3, INPUT); // 3 as input or analog input break; case '2': bitSet(inputsMask, 2); bitSet(pullUp, 2); digitalWrite(pin3, 0); pinMode(pin3, INPUT_PULLUP); // 3 as input pullup break; default: ack = 2; } break; case '4': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 3); bitClear(pullUp, 3); pinMode(pin4, OUTPUT); // 4 as output break; case '1': bitSet(inputsMask, 3); bitClear(pullUp, 3); digitalWrite(pin4, 0); pinMode(pin4, INPUT); // 4 as input or analog input break; case '2': bitSet(inputsMask, 3); bitSet(pullUp, 3); digitalWrite(pin4, 0); pinMode(pin4, INPUT_PULLUP); // 4 as input pullup break; default: ack = 2; } break; case '5': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 4); bitClear(pullUp, 4); pinMode(pin5, OUTPUT); // 5 as output break; case '1': bitSet(inputsMask, 4); bitClear(pullUp, 4); digitalWrite(pin5, 0); pinMode(pin5, INPUT); // 5 as input or analog input break; case '2': bitSet(inputsMask, 4); bitSet(pullUp, 4); digitalWrite(pin5, 0); pinMode(pin5, INPUT_PULLUP); // 5 as input pullup break; default: ack = 2; } break; case '6': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 5); bitClear(pullUp, 5); pinMode(pin6, OUTPUT); // 6 as output break; case '1': bitSet(inputsMask, 5); bitClear(pullUp, 5); digitalWrite(pin6, 0); pinMode(pin6, INPUT); // 6 as input or analog input break; case '2': bitSet(inputsMask, 5); bitSet(pullUp, 5); digitalWrite(pin6, 0); pinMode(pin6, INPUT_PULLUP); // 6 as input pullup break; default: ack = 2; } break; case '7': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 6); bitClear(pullUp, 6); pinMode(pin7, OUTPUT); // 7 as output break; case '1': bitSet(inputsMask, 6); bitClear(pullUp, 6); digitalWrite(pin7, 0); pinMode(pin7, INPUT); // 7 as input (no analog possibility) break; case '2': bitSet(inputsMask, 6); bitSet(pullUp, 6); digitalWrite(pin7, 0); pinMode(pin7, INPUT_PULLUP); // 7 as input pullup break; default: ack = 2; } break; case '8': switch (sBuffer[2]) { case '0': bitClear(inputsMask, 7); bitClear(pullUp, 7); pinMode(pin8, OUTPUT); // 8 as output break; case '1': bitSet(inputsMask, 7); bitClear(pullUp, 7); digitalWrite(pin8, 0); pinMode(pin8, INPUT); // 8 as input (no analog possibility) break; case '2': bitSet(inputsMask, 7); bitSet(pullUp, 7); digitalWrite(pin8, 0); pinMode(pin8, INPUT_PULLUP); // 8 as input pullup break; default: ack = 2; } break; //EEPROMbyteStore(2, inputsMask); //EEPROMbyteStore(3, pullUp); default : ack = 2; } goto cmdEnd; }// Parse settings commands end ---------- if (sBuffer[0] == inputsCmd) { // Parse inputs commands ---------- switch (sBuffer[1]) { case '0': switch (sBuffer[2]) { case '8': Serial.println(inputs & inputsMask); ack = 0; break; default : ack = 2; } break; case '1': // analog 1 or input 1 analogInput = analogRead(pin1); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; switch (sBuffer[2]) { case '0': if (bitRead(inputs, 0) == 1) Serial.println(1); else Serial.println(0); Serial.println(inputs & 1); // return input 1 ack = 0; break; case '1': // return analog 1 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '2': // return analog 1 value 10 bits Serial.println(analogInput); ack = 0; break; case '3': // return analog 1 value 10 bits Serial.println(analogVolts); ack = 0; break; } break; case '2': // analog 2 or input 2 switch (sBuffer[2]) { analogInput = analogRead(pin2); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; case '0': if (bitRead(inputs, 1) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; case '1': // return analog 2 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '3': // return analog value in volts Serial.println(analogInput); ack = 0; break; } break; case '3': // analog 3 or input 3 switch (sBuffer[2]) { analogInput = analogRead(pin3); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; case '0': if (bitRead(inputs, 2) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; case '1': // return analog 3 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '2': // return analog 3 value 10 bits Serial.println(analogInput); ack = 0; break; } break; case '4': // analog 4 input 4 switch (sBuffer[2]) { analogInput = analogRead(pin4); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; case '0': if (bitRead(inputs, 3) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; case '1': // return analog 4 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '2': // return analog 4 value 10 bits Serial.println(analogInput); ack = 0; break; } break; case '5': // analog 5 or input 5 switch (sBuffer[2]) { analogInput = analogRead(pin5); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; case '0': if (bitRead(inputs, 4) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; case '1': // return analog 5 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '2': // return analog 5 value 10 bits Serial.println(analogInput); ack = 0; break; } break; case '6': // analog 6 or input 6 switch (sBuffer[2]) { analogInput = analogRead(pin6); if (reference == 0) analogVolts = vccRef / 1024 * analogInput; else if (reference == 0) analogVolts = 1.1 / 1024 * analogInput; case '0': if (bitRead(inputs, 5) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; case '1': // return analog 6 value 8 bits analogInput = analogInput >> 2; Serial.println(analogInput); ack = 0; break; case '2': // return analog 6 value 10 bits Serial.println(analogInput); ack = 0; break; } break; case '7': // input 7 switch (sBuffer[2]) { case '0': if (bitRead(inputs, 6) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; } break; case '8': // input 8 switch (sBuffer[2]) { case '0': if (bitRead(inputs, 7) == 1) Serial.println(1); else Serial.println(0); ack = 0; break; } break; default : ack = 2; } goto cmdEnd; }// Parse inputs commands end ---------- if (sBuffer[0] == systemCmd) { // Parse system commands ---------- switch (sBuffer[1]) { // set autoscan modes case '0': // no autoscan inputs scanStatus = 0; inputsScan = 10; // by default scan period saveEEPROM(); break; case '1': // send back inputs status each sec scanStatus = 1; saveEEPROM(); break; case '2': // autoscan inputs on change every 10 ms scanStatus = 2; inputsScan = 10; saveEEPROM(); break; case '3': // autoscan inputs on change every 50 ms scanStatus = 2; inputsScan = 50; saveEEPROM(); break; case '4': // autoscan inputs on change every 100 ms scanStatus = 2; inputsScan = 100; saveEEPROM(); break; case '5': // autoscan and change ms status Serial.print(scanStatus); Serial.print(","); Serial.println(inputsScan); ack = 0; break; case '8': // reset EEPROM default values initIOVars(); saveEEPROM(); break; case '9': // send back version # //delay(5000); // to test WDT 4 sec Serial.println(revision); ack = 0; break; case 'X': // send back version # Serial.println(); Serial.print("scanStatus: "); Serial.println(scanStatus); Serial.print("inputsMask: "); Serial.println(inputsMask); Serial.print("outputsMask: "); Serial.println(outputsMask); Serial.print("pullUp: "); Serial.println(pullUp); Serial.print("inputs: "); Serial.println(inputs); Serial.print("lastInputs: "); Serial.println(lastInputs); Serial.print("outputs: "); Serial.println(outputs); Serial.print("reference: "); Serial.println(reference); break; default: ack = 2; } }// Parse system commands end ---------- else ack = 2; cmdEnd: if (ack == 1) Serial.println("Ok"); if (ack == 2) Serial.println("?"); } // End Parse_cmd