Manchester code (phase encoding) library.

Dependents:   Manchester_Transmitter Manchester_Receiver

Manchester code (phase encoding) library

It implements Manchester code according to both IEEE 802.3 and G.E. Thomas' conventions.

  • A '0' is expressed by a high-to-low transition, a '1' by low-to-high transition in the IEEE 802.3 convention. The reverse is true in the G.E. Thomas' convention.
  • The transitions which signify '0' or '1' occur at the midpoint of a period.
  • Transitions at the start of a period are overhead and don't signify data.
  • Least significant bit is sent first
  • There are synchronization pulses (the number can be set) at the begin of transmission

    Select a convention to be used by commenting or uncommenting the line below in the Manchester.h header file.

Manchester.h

#define G_E_THOMAS 1

The IEEE 802.3 convention is used by default.

A Manchester encoded message (using G.E. Thomas' convention), with one sync pulse in the preamble, carrying four bytes:

/media/uploads/hudakz/manchester01.png

ACKNOWLEDGEMENT: The code in this library was based on this article published by Robert Guastella.

Import programManchester_Transmitter

Manchester transmitter demo.


Import programManchester_Receiver

Manchester receiver demo.

NOTE: To perform a simple test (without radio modules) connect the txPin on transmitter board to the rxPin on the receiver board and make sure that grounds are also connected one another.

Committer:
hudakz
Date:
Sun May 21 19:17:28 2017 +0000
Revision:
5:3b2c7e9fda3f
Parent:
4:f2c392191c74
Child:
6:7454ad91f714
Added IEEE 802.3 convention.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:d5c75b0e5708 1 /*
hudakz 0:d5c75b0e5708 2 ******************************************************************************
hudakz 0:d5c75b0e5708 3 * @file Manchester.cpp
hudakz 0:d5c75b0e5708 4 * @author Zoltan Hudak
hudakz 2:de778df5892c 5 * @version
hudakz 0:d5c75b0e5708 6 * @date 16-May-2017
hudakz 0:d5c75b0e5708 7 * @brief Manchester code for mbed
hudakz 0:d5c75b0e5708 8 ******************************************************************************
hudakz 0:d5c75b0e5708 9 * @attention
hudakz 0:d5c75b0e5708 10 *
hudakz 0:d5c75b0e5708 11 * <h2><center>&copy; COPYRIGHT(c) 2017 Zoltan Hudak <hudakz@outlook.com>
hudakz 0:d5c75b0e5708 12 *
hudakz 0:d5c75b0e5708 13 * All rights reserved.
hudakz 0:d5c75b0e5708 14
hudakz 0:d5c75b0e5708 15 This program is free software: you can redistribute it and/or modify
hudakz 0:d5c75b0e5708 16 it under the terms of the GNU General Public License as published by
hudakz 0:d5c75b0e5708 17 the Free Software Foundation, either version 3 of the License, or
hudakz 0:d5c75b0e5708 18 (at your option) any later version.
hudakz 0:d5c75b0e5708 19
hudakz 0:d5c75b0e5708 20 This program is distributed in the hope that it will be useful,
hudakz 0:d5c75b0e5708 21 but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 0:d5c75b0e5708 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 0:d5c75b0e5708 23 GNU General Public License for more details.
hudakz 0:d5c75b0e5708 24
hudakz 0:d5c75b0e5708 25 You should have received a copy of the GNU General Public License
hudakz 0:d5c75b0e5708 26 along with this program. If not, see <http://www.gnu.org/licenses/>.
hudakz 0:d5c75b0e5708 27 */
hudakz 5:3b2c7e9fda3f 28
hudakz 5:3b2c7e9fda3f 29 /*
hudakz 5:3b2c7e9fda3f 30 This library implements Manchester code according to both IEEE 802.3
hudakz 5:3b2c7e9fda3f 31 and G.E. Thomas' convention.
hudakz 5:3b2c7e9fda3f 32 • A '0' is expressed by a high-to-low transition, a '1' by low-to-high transition
hudakz 5:3b2c7e9fda3f 33 in the IEEE 802.3 convention. The reverse is true in the G.E. Thomas' convention.
hudakz 5:3b2c7e9fda3f 34 • The transitions which signify 0 or 1 occur at the midpoint of a period.
hudakz 5:3b2c7e9fda3f 35 • Transitions at the start of a period are overhead and don't signify data.
hudakz 5:3b2c7e9fda3f 36 • Least significant bit is sent first
hudakz 5:3b2c7e9fda3f 37 • There is one synchronization pulse at the begin of transmission
hudakz 5:3b2c7e9fda3f 38
hudakz 5:3b2c7e9fda3f 39 The IEEE 802.3 convention is used by default.
hudakz 5:3b2c7e9fda3f 40 Select a convention to be used by commenting or uncommenting
hudakz 5:3b2c7e9fda3f 41 the line "#define G_E_THOMAS 1" in the Manchester.h header file.
hudakz 5:3b2c7e9fda3f 42 */
hudakz 5:3b2c7e9fda3f 43
hudakz 0:d5c75b0e5708 44 #include "Manchester.h"
hudakz 0:d5c75b0e5708 45 #include "ManchesterMsg.h"
hudakz 0:d5c75b0e5708 46
hudakz 0:d5c75b0e5708 47 /**
hudakz 0:d5c75b0e5708 48 * @brief Creates a Manchester object
hudakz 0:d5c75b0e5708 49 * @note
hudakz 0:d5c75b0e5708 50 * @param txPin Pin name of transmitter line
hudakz 0:d5c75b0e5708 51 * rxPin Pin name of receiver line
hudakz 0:d5c75b0e5708 52 * speed Communication bit rate in bits per second
hudakz 3:03109c995123 53 * tol Pulse width tolerance in %
hudakz 0:d5c75b0e5708 54 * @retval
hudakz 0:d5c75b0e5708 55 */
hudakz 3:03109c995123 56 Manchester::Manchester
hudakz 3:03109c995123 57 (
hudakz 3:03109c995123 58 PinName txPin,
hudakz 3:03109c995123 59 PinName rxPin,
hudakz 5:3b2c7e9fda3f 60 uint32_t speed, /* = 1200 bps */
hudakz 5:3b2c7e9fda3f 61 uint8_t tol /* = (+/-)25% */
hudakz 3:03109c995123 62 ) :
hudakz 3:03109c995123 63 _tx(txPin),
hudakz 2:de778df5892c 64 _rx(rxPin) {
hudakz 0:d5c75b0e5708 65 _state = IDLE;
hudakz 0:d5c75b0e5708 66 _midBitTime = 1000000 / speed / 2; // mid-bit time [us]
hudakz 0:d5c75b0e5708 67 _minPulseWidth = (_midBitTime * 2 * (100 - tol)) / 100; // [us]
hudakz 0:d5c75b0e5708 68 _maxPulseWidth = (_midBitTime * 2 * (100 + tol)) / 100; // [us]
hudakz 0:d5c75b0e5708 69 _rx.disable_irq();
hudakz 0:d5c75b0e5708 70 _rx.rise(callback(this, &Manchester::reception));
hudakz 0:d5c75b0e5708 71 _rx.fall(callback(this, &Manchester::reception));
hudakz 5:3b2c7e9fda3f 72 #ifdef G_E_THOMAS
hudakz 5:3b2c7e9fda3f 73 _tx = 1;
hudakz 5:3b2c7e9fda3f 74 #else
hudakz 5:3b2c7e9fda3f 75 _tx = 0;
hudakz 5:3b2c7e9fda3f 76 #endif
hudakz 0:d5c75b0e5708 77 }
hudakz 0:d5c75b0e5708 78
hudakz 0:d5c75b0e5708 79 /**
hudakz 0:d5c75b0e5708 80 * @brief Transmits message
hudakz 0:d5c75b0e5708 81 * @note
hudakz 0:d5c75b0e5708 82 * @param msg Message to transmit
hudakz 0:d5c75b0e5708 83 * @retval
hudakz 0:d5c75b0e5708 84 */
hudakz 0:d5c75b0e5708 85 void Manchester::transmit(ManchesterMsg& msg) {
hudakz 0:d5c75b0e5708 86 bool txComplete;
hudakz 0:d5c75b0e5708 87
hudakz 0:d5c75b0e5708 88 _data = msg.data;
hudakz 0:d5c75b0e5708 89 _len = msg.len;
hudakz 0:d5c75b0e5708 90 _state = SYNCH_START;
hudakz 0:d5c75b0e5708 91 _txTicker.attach_us(callback(this, &Manchester::transmission), _midBitTime);
hudakz 0:d5c75b0e5708 92
hudakz 0:d5c75b0e5708 93 do
hudakz 0:d5c75b0e5708 94 {
hudakz 0:d5c75b0e5708 95 core_util_critical_section_enter();
hudakz 0:d5c75b0e5708 96 txComplete = (_state == IDLE);
hudakz 0:d5c75b0e5708 97 core_util_critical_section_exit();
hudakz 0:d5c75b0e5708 98 } while(!txComplete);
hudakz 0:d5c75b0e5708 99
hudakz 0:d5c75b0e5708 100 _txTicker.detach();
hudakz 0:d5c75b0e5708 101 }
hudakz 0:d5c75b0e5708 102
hudakz 0:d5c75b0e5708 103 /**
hudakz 0:d5c75b0e5708 104 * @brief ISR handling transmission
hudakz 3:03109c995123 105 * @note Called by _txTicker
hudakz 0:d5c75b0e5708 106 * @param
hudakz 0:d5c75b0e5708 107 * @retval
hudakz 0:d5c75b0e5708 108 */
hudakz 0:d5c75b0e5708 109 void Manchester::transmission(void) {
hudakz 0:d5c75b0e5708 110 static uint8_t encodeByte;
hudakz 2:de778df5892c 111 static size_t byteIndex;
hudakz 0:d5c75b0e5708 112 static uint8_t bitIndex;
hudakz 0:d5c75b0e5708 113
hudakz 2:de778df5892c 114 _timeout.attach_us(callback(this, &Manchester::txTimeout), _maxPulseWidth * 4);
hudakz 2:de778df5892c 115
hudakz 0:d5c75b0e5708 116 switch(_state) {
hudakz 0:d5c75b0e5708 117 case SYNCH_START:
hudakz 5:3b2c7e9fda3f 118 #ifdef G_E_THOMAS
hudakz 5:3b2c7e9fda3f 119 _tx = 0; // pull line low to start synch pulse
hudakz 5:3b2c7e9fda3f 120 #else
hudakz 5:3b2c7e9fda3f 121 _tx = 1; // bring line high to start synch pulse
hudakz 5:3b2c7e9fda3f 122 #endif
hudakz 0:d5c75b0e5708 123 _state = SYNCH_NEXT;
hudakz 0:d5c75b0e5708 124 break;
hudakz 0:d5c75b0e5708 125
hudakz 0:d5c75b0e5708 126 case SYNCH_NEXT:
hudakz 0:d5c75b0e5708 127 _state = SYNCH_END; // synch pulse needs to be twice the interrupt rate
hudakz 0:d5c75b0e5708 128 break;
hudakz 0:d5c75b0e5708 129
hudakz 0:d5c75b0e5708 130 case SYNCH_END:
hudakz 5:3b2c7e9fda3f 131 #ifdef G_E_THOMAS
hudakz 2:de778df5892c 132 _tx = 1; // bring line high for end of sych pulse
hudakz 5:3b2c7e9fda3f 133 #else
hudakz 5:3b2c7e9fda3f 134 _tx = 0; // pull line low for end of sych pulse
hudakz 5:3b2c7e9fda3f 135 #endif
hudakz 0:d5c75b0e5708 136 byteIndex = 0;
hudakz 0:d5c75b0e5708 137 encodeByte = _data[byteIndex];
hudakz 0:d5c75b0e5708 138 bitIndex = 0;
hudakz 0:d5c75b0e5708 139 _state = SETUP;
hudakz 0:d5c75b0e5708 140 break;
hudakz 0:d5c75b0e5708 141
hudakz 0:d5c75b0e5708 142 case SETUP:
hudakz 5:3b2c7e9fda3f 143 #ifdef G_E_THOMAS
hudakz 5:3b2c7e9fda3f 144 _tx = encodeByte & 0x01; // setup for next bit to transmit
hudakz 5:3b2c7e9fda3f 145 #else
hudakz 5:3b2c7e9fda3f 146 _tx = !(encodeByte & 0x01); // setup for next bit to transmit
hudakz 5:3b2c7e9fda3f 147 #endif
hudakz 0:d5c75b0e5708 148 _state = TRANSITION;
hudakz 0:d5c75b0e5708 149 break;
hudakz 0:d5c75b0e5708 150
hudakz 0:d5c75b0e5708 151 case TRANSITION:
hudakz 5:3b2c7e9fda3f 152 #ifdef G_E_THOMAS
hudakz 5:3b2c7e9fda3f 153 _tx = !(encodeByte & 0x01); // set line appropriately for transition
hudakz 5:3b2c7e9fda3f 154 #else
hudakz 5:3b2c7e9fda3f 155 _tx = encodeByte & 0x01; // set line appropriately for transition
hudakz 5:3b2c7e9fda3f 156 #endif
hudakz 0:d5c75b0e5708 157 if(++bitIndex < 8) {
hudakz 0:d5c75b0e5708 158 encodeByte = (encodeByte >> 1);
hudakz 0:d5c75b0e5708 159 _state = SETUP;
hudakz 0:d5c75b0e5708 160 }
hudakz 0:d5c75b0e5708 161 else {
hudakz 0:d5c75b0e5708 162 if(++byteIndex < _len) {
hudakz 0:d5c75b0e5708 163 encodeByte = _data[byteIndex];
hudakz 0:d5c75b0e5708 164 _state = SETUP;
hudakz 0:d5c75b0e5708 165 bitIndex = 0;
hudakz 0:d5c75b0e5708 166 }
hudakz 0:d5c75b0e5708 167 else
hudakz 0:d5c75b0e5708 168 _state = COMPLETE;
hudakz 0:d5c75b0e5708 169 }
hudakz 0:d5c75b0e5708 170 break;
hudakz 0:d5c75b0e5708 171
hudakz 0:d5c75b0e5708 172 case COMPLETE:
hudakz 5:3b2c7e9fda3f 173 #ifdef G_E_THOMAS
hudakz 2:de778df5892c 174 _tx = 1; // transmission is complete, bring line high
hudakz 5:3b2c7e9fda3f 175 #else
hudakz 5:3b2c7e9fda3f 176 _tx = 0; // transmission is complete, pull line low
hudakz 5:3b2c7e9fda3f 177 #endif
hudakz 0:d5c75b0e5708 178 _state = IDLE;
hudakz 0:d5c75b0e5708 179 break;
hudakz 0:d5c75b0e5708 180
hudakz 0:d5c75b0e5708 181 case IDLE:
hudakz 0:d5c75b0e5708 182 default:
hudakz 2:de778df5892c 183 _timeout.detach();
hudakz 0:d5c75b0e5708 184 return;
hudakz 0:d5c75b0e5708 185 }
hudakz 0:d5c75b0e5708 186 }
hudakz 0:d5c75b0e5708 187
hudakz 0:d5c75b0e5708 188 /**
hudakz 2:de778df5892c 189 * @brief ISR handling 'transmission timeout'
hudakz 2:de778df5892c 190 * @note Called when transmitter is stuck.
hudakz 2:de778df5892c 191 * Signals 'end of transmission' by setting state to IDLE
hudakz 5:3b2c7e9fda3f 192 * @param
hudakz 5:3b2c7e9fda3f 193 * @retval
hudakz 2:de778df5892c 194 */
hudakz 2:de778df5892c 195 void Manchester::txTimeout(void) {
hudakz 2:de778df5892c 196 _timeout.detach();
hudakz 2:de778df5892c 197 _state = IDLE;
hudakz 2:de778df5892c 198 }
hudakz 2:de778df5892c 199
hudakz 2:de778df5892c 200 /**
hudakz 0:d5c75b0e5708 201 * @brief Receives message
hudakz 4:f2c392191c74 202 * @note Waits until a message is received or 'receive timeout' occured
hudakz 1:11292d238e50 203 * @param msg Container to store the received message
hudakz 0:d5c75b0e5708 204 * @retval true On success
hudakz 0:d5c75b0e5708 205 * false Otherwise
hudakz 0:d5c75b0e5708 206 */
hudakz 0:d5c75b0e5708 207 bool Manchester::receive(ManchesterMsg& msg) {
hudakz 0:d5c75b0e5708 208 bool rxFinished;
hudakz 0:d5c75b0e5708 209 uint32_t now = us_ticker_read();
hudakz 0:d5c75b0e5708 210
hudakz 0:d5c75b0e5708 211 _data = msg.data;
hudakz 0:d5c75b0e5708 212 _maxLen = msg.maxLen();
hudakz 0:d5c75b0e5708 213 _state = LISTEN;
hudakz 0:d5c75b0e5708 214
hudakz 0:d5c75b0e5708 215 core_util_critical_section_enter();
hudakz 0:d5c75b0e5708 216 _rx.enable_irq();
hudakz 0:d5c75b0e5708 217 core_util_critical_section_exit();
hudakz 0:d5c75b0e5708 218
hudakz 0:d5c75b0e5708 219 do
hudakz 0:d5c75b0e5708 220 {
hudakz 0:d5c75b0e5708 221 core_util_critical_section_enter();
hudakz 0:d5c75b0e5708 222 rxFinished = ((_state == IDLE) || (_state == ERROR));
hudakz 0:d5c75b0e5708 223 core_util_critical_section_exit();
hudakz 0:d5c75b0e5708 224 } while(!rxFinished);
hudakz 0:d5c75b0e5708 225
hudakz 0:d5c75b0e5708 226 core_util_critical_section_enter();
hudakz 0:d5c75b0e5708 227 _rx.disable_irq();
hudakz 0:d5c75b0e5708 228 core_util_critical_section_exit();
hudakz 0:d5c75b0e5708 229
hudakz 0:d5c75b0e5708 230 if(_state == ERROR) {
hudakz 0:d5c75b0e5708 231 msg.len = 0;
hudakz 0:d5c75b0e5708 232 _state = IDLE;
hudakz 0:d5c75b0e5708 233 return false;
hudakz 0:d5c75b0e5708 234 }
hudakz 0:d5c75b0e5708 235 else {
hudakz 0:d5c75b0e5708 236 msg.len = _len;
hudakz 0:d5c75b0e5708 237 return true;
hudakz 0:d5c75b0e5708 238 }
hudakz 0:d5c75b0e5708 239 }
hudakz 0:d5c75b0e5708 240
hudakz 0:d5c75b0e5708 241 /**
hudakz 2:de778df5892c 242 * @brief ISR handling reception
hudakz 2:de778df5892c 243 * @note Called on signal change (rise or fall) on receiver line
hudakz 0:d5c75b0e5708 244 * @param
hudakz 0:d5c75b0e5708 245 * @retval
hudakz 0:d5c75b0e5708 246 */
hudakz 0:d5c75b0e5708 247 void Manchester::reception(void) {
hudakz 0:d5c75b0e5708 248 uint32_t now = us_ticker_read();
hudakz 0:d5c75b0e5708 249 static uint32_t begin;
hudakz 0:d5c75b0e5708 250 uint32_t pulseWidth;
hudakz 0:d5c75b0e5708 251 static uint8_t decodeByte;
hudakz 0:d5c75b0e5708 252 static uint8_t bitIndex;
hudakz 0:d5c75b0e5708 253
hudakz 2:de778df5892c 254 _timeout.attach_us(callback(this, &Manchester::rxTimeout), _maxPulseWidth * 4);
hudakz 2:de778df5892c 255
hudakz 0:d5c75b0e5708 256 switch(_state) {
hudakz 0:d5c75b0e5708 257 case LISTEN:
hudakz 0:d5c75b0e5708 258 begin = now;
hudakz 5:3b2c7e9fda3f 259 #ifdef G_E_THOMAS
hudakz 2:de778df5892c 260 if(_rx == 0)
hudakz 5:3b2c7e9fda3f 261 #else
hudakz 5:3b2c7e9fda3f 262 if(_rx == 1)
hudakz 5:3b2c7e9fda3f 263 #endif
hudakz 0:d5c75b0e5708 264 _state = SYNCH_START;
hudakz 0:d5c75b0e5708 265 else
hudakz 3:03109c995123 266 _state = ERROR; // It isn't a synch pulse => error
hudakz 0:d5c75b0e5708 267 break;
hudakz 0:d5c75b0e5708 268
hudakz 0:d5c75b0e5708 269 case SYNCH_START:
hudakz 0:d5c75b0e5708 270 pulseWidth = now - begin;
hudakz 5:3b2c7e9fda3f 271 #ifdef G_E_THOMAS
hudakz 2:de778df5892c 272 if((_minPulseWidth <= pulseWidth) && (pulseWidth <= _maxPulseWidth) && (_rx == 1)) {
hudakz 5:3b2c7e9fda3f 273 #else
hudakz 5:3b2c7e9fda3f 274 if((_minPulseWidth <= pulseWidth) && (pulseWidth <= _maxPulseWidth) && (_rx == 0)) {
hudakz 5:3b2c7e9fda3f 275 #endif
hudakz 0:d5c75b0e5708 276 begin = now;
hudakz 0:d5c75b0e5708 277 decodeByte = 0;
hudakz 2:de778df5892c 278 bitIndex = 0;
hudakz 0:d5c75b0e5708 279 _len = 0;
hudakz 0:d5c75b0e5708 280 _state = DECODE;
hudakz 0:d5c75b0e5708 281 }
hudakz 2:de778df5892c 282 else
hudakz 2:de778df5892c 283 _state = ERROR; // It isn't a synch pulse => error
hudakz 0:d5c75b0e5708 284 break;
hudakz 0:d5c75b0e5708 285
hudakz 0:d5c75b0e5708 286 case DECODE:
hudakz 0:d5c75b0e5708 287 pulseWidth = now - begin;
hudakz 0:d5c75b0e5708 288 if((_minPulseWidth <= pulseWidth) && (pulseWidth <= _maxPulseWidth)) {
hudakz 0:d5c75b0e5708 289 begin = now;
hudakz 5:3b2c7e9fda3f 290 #ifdef G_E_THOMAS
hudakz 0:d5c75b0e5708 291 decodeByte |= (((_rx == 0) & 0x01) << bitIndex++);
hudakz 5:3b2c7e9fda3f 292 #else
hudakz 5:3b2c7e9fda3f 293 decodeByte |= (((_rx == 1) & 0x01) << bitIndex++);
hudakz 5:3b2c7e9fda3f 294 #endif
hudakz 0:d5c75b0e5708 295 if(bitIndex > 7) {
hudakz 0:d5c75b0e5708 296 _data[_len++] = decodeByte;
hudakz 0:d5c75b0e5708 297 if(_len > _maxLen - 1)
hudakz 0:d5c75b0e5708 298 _state = ERROR;
hudakz 0:d5c75b0e5708 299 else {
hudakz 0:d5c75b0e5708 300 decodeByte = 0;
hudakz 0:d5c75b0e5708 301 bitIndex = 0;
hudakz 0:d5c75b0e5708 302 }
hudakz 0:d5c75b0e5708 303 }
hudakz 0:d5c75b0e5708 304 }
hudakz 0:d5c75b0e5708 305
hudakz 2:de778df5892c 306 if(pulseWidth > _maxPulseWidth)
hudakz 2:de778df5892c 307 _state = ERROR; // Pulse width out of limit => error
hudakz 0:d5c75b0e5708 308
hudakz 0:d5c75b0e5708 309 break;
hudakz 0:d5c75b0e5708 310
hudakz 0:d5c75b0e5708 311 case IDLE:
hudakz 0:d5c75b0e5708 312 case ERROR:
hudakz 0:d5c75b0e5708 313 default:
hudakz 2:de778df5892c 314 _timeout.detach();
hudakz 0:d5c75b0e5708 315 break;
hudakz 0:d5c75b0e5708 316 }
hudakz 0:d5c75b0e5708 317 }
hudakz 0:d5c75b0e5708 318
hudakz 0:d5c75b0e5708 319 /**
hudakz 2:de778df5892c 320 * @brief ISR handling 'receive timeout'
hudakz 3:03109c995123 321 * @note Called when receiver line is idle longer than limit.
hudakz 2:de778df5892c 322 * Signals 'end of transmission' by setting state to IDLE
hudakz 2:de778df5892c 323 * or 'timeout error' by setting state to ERROR.
hudakz 5:3b2c7e9fda3f 324 * @param
hudakz 5:3b2c7e9fda3f 325 * @retval
hudakz 0:d5c75b0e5708 326 */
hudakz 0:d5c75b0e5708 327 void Manchester::rxTimeout(void) {
hudakz 2:de778df5892c 328 _timeout.detach();
hudakz 0:d5c75b0e5708 329
hudakz 5:3b2c7e9fda3f 330 #ifdef G_E_THOMAS
hudakz 2:de778df5892c 331 if((_state == DECODE) && (_rx == 1))
hudakz 5:3b2c7e9fda3f 332 #else
hudakz 5:3b2c7e9fda3f 333 if((_state == DECODE) && (_rx == 0))
hudakz 5:3b2c7e9fda3f 334 #endif
hudakz 0:d5c75b0e5708 335 _state = IDLE; // End of transmission
hudakz 0:d5c75b0e5708 336 else
hudakz 0:d5c75b0e5708 337 _state = ERROR; // Incomplete transmission
hudakz 0:d5c75b0e5708 338 }
hudakz 5:3b2c7e9fda3f 339