byte cmdlen = 0; void setup() { DDRC = B11111111; DDRB = B11111111; DDRD = B11111110; Serial.begin(9600); PORTC = B00000000; PORTB = B00000000; PORTD = B00000000; } void loop() { ServeConsole(); } void ServeConsole() { static char cmd[16]; while(Serial.available()) { // Read chars from buffer. byte c = Serial.read(); if (cmdlen>=sizeof(cmd)) { Serial.println("Troll detected!"); c = '-'; } Serial.print((char)c); if (c == 10 || c == 13 || c==64) { for (cmdlen=cmdlen; cmdlen<sizeof(cmd); cmdlen++) { // clean rest of cmd, because a troll user may occur cmd[cmdlen] = 0; // FIXME: better way is correct command terminator handling } Serial.println("exec"); ExecCommand(cmd); cmd[cmdlen = 0] = 0; return; } if (c == '-') { cmd[cmdlen = 0] = 0; Serial.println("Aborted."); return; } cmd[cmdlen++] = c; cmd[cmdlen] = 0; } return; } void ExecCommand(char *cmd) { byte portnum; boolean status; switch (cmd[0]) { case 's': /* set bit 1 → portid (a-) 2 → state (1/0) FIXME: syntax checking */ portnum = cmd[1]-97; status = false; if (cmd[2] == '1') { status = true; } if (portnum <= 7) { PORTD = SetBit(portnum, PORTD, status); } else if (portnum <= 15) { PORTB = SetBit(portnum-8, PORTB, status); } else if (portnum <= 23) { PORTC = SetBit(portnum-16, PORTC, status); } break; default: Serial.println("WTF?"); break; } return; } byte SetBit (byte pos, byte packet, boolean state) { if(state) { bitWrite(packet, pos, 1); } else { bitWrite(packet, pos, 0); } return packet; }