//Main loop, wordt door gebruiker in loop aangeroepen. Voert 1 taak per keer uit, mag geen grote loops hebben, verdelen over meerdere runs void GPSTP::loop() { //snel uitvoerende code, snel weer klaar zijn, 1 handeling per keer //Loop voor de verschilende staten van het afhandelen van een frame switch (_state) { //begin van frame case EXPECT_HEADER: if (_serial->available() > 0) { _expectHeader(); } break; //Ontvang de daatwerkelijke header case RECIEVE_HEADER: if (_serial->available() > 0) { _startTime = millis(); _recieveHeader(); } //no serial data, but expected. Timeout countdown else { _timeOutHandler(); } break; //verwerk header case PROCESS_HEADER: _processHeader(); break; //ontvang payload (hier draait het om) case RECIEVE_PAYLOAD: if (_serial->available() > 0) { _startTime = millis(); _recievePayload(); } //no serial data, but expected. Timeout countdown else { _timeOutHandler(); } break; //verwerk payload, het aan de handler geven van de payload case PROCESS_PAYLOAD: _processPayload(); break; //ontvang de 16 bit (als 2 bytes) CRC case RECIEVE_CRC: if (_serial->available() > 0) { _startTime = millis(); _recieveCRC(); } //no serial data, but expected. Timeout countdown else { _timeOutHandler(); } break; //bereken en controlleer de CRC case PROCESS_CRC: _processCRC(); break; } //Niks hier plaatsen, alles in functies die worden aangeroepen boven, in de state switch }
/** * Read from client buffer. (Overloading from superclass) */ void ClientDbxZonePro::_readFromClient() { // When we enter here we expect to read a full package at a time, so we reset buffer: _resetBuffer(); uint16_t len = 0; bool overflow = false; while (_client.available()) { if (_bufferWriteIndex<_binBufferSize) { _binarybuffer[_bufferWriteIndex++] = _client.read(); } else { // Overflow. Only theoretical because we should at some point reach "21" for the headersize, see below. overflow = true; _client.read(); _bufferWriteIndex++; } if (_bufferWriteIndex==21) { // Header has been retrieved completely. Subprocess this: if (_binarybuffer[1] || _binarybuffer[2]) { // Error, we don't have that large a buffer! if (_serialOutput) Serial.println(F("ERROR: Too large package.")); } len = (_binarybuffer[3]<<8) | _binarybuffer[4]; _processPayload(len-_bufferWriteIndex); _resetBuffer(); len = 0; overflow = false; } if (overflow) { Serial.print(F("ERROR: Buffer overflow: Package was ")); Serial.print(len); Serial.println(F(" bytes.")); } } }