diff --git a/Arduino/Zeit/Zeit.ino b/Arduino/Zeit/Zeit.ino new file mode 100644 index 0000000..1511082 --- /dev/null +++ b/Arduino/Zeit/Zeit.ino @@ -0,0 +1,165 @@ +#include +#include +#include +SoftwareSerial rfid(11, 10); +SoftwareSerial disp(13, 12); +String rmsg; +String cmsg; +String dmsg; + +#define ALLOWED_TAG "0A006AB7AE79" +#define MAX_STORE_DATA 8 +#define DEBUG_FLAG true + +void setup() { + Serial.begin(9600); + Serial.println("Init...."); + rfid.begin(9600); + disp.begin(9600); + pinMode(2, INPUT_PULLUP); + pinMode(3, INPUT_PULLUP); + Serial.println("t="+String(now())); + Serial.println("Init loading!"); + loadFromDisplay(); + Serial.println("Init finished!"); +} + +int job = -1; +int online = -1; +bool keep = false; +int storeCount = -1; +String storeData[MAX_STORE_DATA]; + +void loadFromDisplay() { + disp.setTimeout(1000); + print_disp("getJob=1"); + parse(disp.readStringUntil('\n')); + print_disp("getOnline=1"); + parse(disp.readStringUntil('\n')); + print_disp("getStoreCount=1"); + parse(disp.readStringUntil('\n')); + if(storeCount > 0) { + print_disp("getStoreData=1"); + parse(disp.readStringUntil('\n')); + } + if(keepAlive()) { + doJob("getStore","1"); + } +} + +void loop() { + char c; + rfid.listen(); + if(rfid.available()) { + c = rfid.read(); + rmsg += c; + } + if(Serial.available()) { + c = Serial.read(); + if(c == '\n') { + parse(cmsg); + cmsg = ""; + } else { + cmsg += c; + } + } + if(rmsg.length() >= 14) { + rmsg = rmsg.substring(1,13); + if(rmsg == ALLOWED_TAG) { + online = online==1?0:1; + doJob("tag",rmsg); + doJob("online",String(online)); + delay(1000); + } + rmsg = ""; + } + if(((digitalRead(2) == LOW && job != 1) || (digitalRead(3) == LOW && job != 2))) { + job = digitalRead(2)==LOW?1:2; + doJob("job", String(job)); + rmsg = ""; + } +} + +void parse(String text) { + if(DEBUG_FLAG) { + Serial.println("i<-: "+text); + } + text.trim(); + String task = ""; + String value = ""; + if (text.indexOf("=") != -1) { + task = text.substring(0, text.indexOf("=")); + value = text.substring(text.indexOf("=") + 1); + doJob(task, value); + } +} + +void doJob(String task, String value) { + if(task == "tag") { + char hex[15]; + value.toCharArray(hex,14); + String answ = "tag="+String(strtol(hex, NULL, 16)); + answ += ";time="+String(now()); + answ += ";job="+String(job); + answ += ";online="+String(online); + if(keepAlive()) { + Serial.println(answ); + } else { + print_disp(answ); + } + } else if(task == "job") { + print_disp("job="+value); + } else if(task == "online") { + print_disp("online="+value); + } else if(task == "time") { + setTime(value.toInt()); + Serial.println("t="+String(now())); + } else if(task == "setJob") { + job = value.toInt(); + } else if(task == "setOnline") { + online = value.toInt(); + } else if(task == "keep") { + keep = true; + } else if(task == "hasCount") { + storeCount = value.toInt(); + } else if(task == "dataStore") { + int i = 0; + while(true) { + if(value.indexOf('|') == -1) { + storeData[i] = value; + i++; + break; + } + storeData[i] = value.substring(0, value.indexOf('|')); + value = value.substring(value.indexOf('|') + 1); + i++; + } + storeCount = i; + } else if(task == "getStore") { + if(storeCount > 0) { + for(int i=0; i < storeCount; i++) { + Serial.println(storeData[i]); + } + storeCount=0; + } + } +} + +void print_disp(String text) { + if(DEBUG_FLAG) { + Serial.println("d->: "+text); + } + disp.listen(); + disp.println(text); +} + +bool keepAlive() { + Serial.setTimeout(1000); + Serial.println("requestKeep=1"); + String a = Serial.readStringUntil('\n'); + if(a != "") { + parse(a); + } + return keep; +} +