Manchester
Diff: Manchester.cpp
- Revision:
- 9:7a23184aa9ef
- Parent:
- 8:c1b5893191fe
diff -r c1b5893191fe -r 7a23184aa9ef Manchester.cpp
--- a/Manchester.cpp Sun Oct 14 09:38:33 2018 +0000
+++ b/Manchester.cpp Thu Apr 11 07:52:23 2019 +0000
@@ -40,7 +40,10 @@
the line "#define G_E_THOMAS 1" in the Manchester.h header file.
*/
#include "Manchester.h"
-#include "ManchesterMsg.h"
+#include "mbed-trace/mbed_trace.h"
+
+#undef TRACE_GROUP
+#define TRACE_GROUP "Manchester"
/**
* @brief Creates a Manchester object
@@ -70,16 +73,12 @@
_rx.disable_irq();
_rx.rise(callback(this, &Manchester::reception));
_rx.fall(callback(this, &Manchester::reception));
- _preamble = 8; // number of synch_start patterns
- _error = "no error";
- // printf("_midBitTime = %d\r\n", _midBitTime);
- // printf("_minPulseWidth = %d\r\n", _minPulseWidth);
- // printf("_maxPulseWidth = %d\r\n", _maxPulseWidth);
-#ifdef G_E_THOMAS
- _tx = 1;
-#else
+ _preamble = 1; // number of synch_start patterns
+
+ tr_debug("_midBitTime = %d", _midBitTime);
+ tr_debug("_minPulseWidth = %d", _minPulseWidth);
+ tr_debug("_maxPulseWidth = %d", _maxPulseWidth);
_tx = 0;
-#endif
}
/**
@@ -88,12 +87,12 @@
* @param msg Message to transmit
* @retval
*/
-void Manchester::transmit(ManchesterMsg& msg)
+void Manchester::transmit(uint8_t* msg, uint8_t len)
{
bool txFinished;
- _data = msg.data;
- _len = msg.len;
+ _data = (char*)msg;
+ _len = len;
_state = SYNCH_START;
_txTicker.attach_us(callback(this, &Manchester::transmission), _midBitTime);
@@ -133,48 +132,32 @@
break;
}
- #ifdef G_E_THOMAS
- _tx = 0; // pull line low to start synch pulse
- #else
_tx = 1; // bring line high to start synch pulse
- #endif
+
counter = 0;
_state = SYNCH_NEXT;
break;
case SYNCH_NEXT:
counter++;
- if ((counter % 4) == 0)
- _tx = !_tx;
- if (counter < (_preamble * 8))
- break;
- else
- {
- byteIndex = 0;
- encodeByte = _data[byteIndex];
- bitIndex = 0;
- _state = SETUP;
- break;
- }
+ _tx = !_tx;
+ byteIndex = 0;
+ encodeByte = _data[byteIndex];
+ bitIndex = 0;
+ _state = SETUP;
+ break;
case SETUP:
- #ifdef G_E_THOMAS
- _tx = encodeByte & 0x01; // setup for next bit to transmit
- #else
- _tx = !(encodeByte & 0x01); // setup for next bit to transmit
- #endif
+ _tx = ((encodeByte >> 7) & 0x01); // setup for next bit to transmit
_state = TRANSITION;
break;
case TRANSITION:
- #ifdef G_E_THOMAS
- _tx = !(encodeByte & 0x01); // set line appropriately for transition
- #else
- _tx = encodeByte & 0x01; // set line appropriately for transition
- #endif
+ _tx = !((encodeByte >> 7) & 0x01); // set line appropriately for transition
+
if (++bitIndex < 8)
{
- encodeByte = (encodeByte >> 1);
+ encodeByte = (encodeByte << 1);
_state = SETUP;
}
else
@@ -195,34 +178,14 @@
case STOP:
counter++;
- if (counter == 1)
- {
- #ifdef G_E_THOMAS
- _tx = 1;
- #else
- _tx = 0;
- #endif
- }
- else
- if (counter == 5)
- {
- #ifdef G_E_THOMAS
- _tx = 0;
- #else
- _tx = 1;
- #endif
- }
- else
- if (counter == 8)
+ _tx = 0;
+
+ if (counter == 4)
_state = COMPLETE;
break;
case COMPLETE:
- #ifdef G_E_THOMAS
- _tx = 1;
- #else
_tx = 0;
- #endif
_state = IDLE;
break;
@@ -253,12 +216,12 @@
* @retval true On success
* false Otherwise
*/
-bool Manchester::receive(ManchesterMsg& msg)
+bool Manchester::receive(uint8_t *msg, uint8_t *len)
{
bool rxFinished;
- _data = msg.data;
- _maxLen = msg.maxLen();
+ _data = (char*)msg;
+ _maxLen = *len;
_state = LISTEN;
_timeout.attach(callback(this, &Manchester::onRxTimeout), _rxTimeout);
_rx.enable_irq();
@@ -275,13 +238,13 @@
if (_state == ERROR)
{
- msg.len = 0;
+ len = 0;
_state = IDLE;
return false;
}
else
{
- msg.len = _len;
+ *len = _len;
return true;
}
}
@@ -304,19 +267,13 @@
{
case LISTEN:
begin = now;
- if (
- #ifdef G_E_THOMAS
- _rx == 0
- #else
- _rx == 1
- #endif
- )
+ if (_rx == 1)
{
_state = SYNCH_START;
}
else
{
- _error = "SYNCH_START: Isn't a SYNCH pulse";
+ tr_err("SYNCH_START: Isn't a SYNCH pulse");
_state = ERROR;
}
break;
@@ -331,7 +288,7 @@
}
else
{
- _error = "SYNCH_START: Isn't a SYNCH pulse";
+ tr_err("SYNCH_START: Isn't a SYNCH pulse");
_state = ERROR;
}
break;
@@ -351,11 +308,7 @@
decodeByte = 0;
bitIndex = 0;
_len = 0;
- #ifdef G_E_THOMAS
- decodeByte |= (((_rx == 0) & 0x01) << bitIndex++);
- #else
decodeByte |= (((_rx == 1) & 0x01) << bitIndex++);
- #endif
_state = DECODE;
}
break;
@@ -365,11 +318,7 @@
if ((_minPulseWidth <= pulseWidth) && (pulseWidth <= _maxPulseWidth))
{
begin = now;
- #ifdef G_E_THOMAS
- decodeByte |= (((_rx == 0) & 0x01) << bitIndex++);
- #else
decodeByte |= (((_rx == 1) & 0x01) << bitIndex++);
- #endif
if (bitIndex > 7)
{
_data[_len++] = decodeByte;
@@ -386,13 +335,7 @@
if (pulseWidth > _maxPulseWidth)
{
- if (
- #ifdef G_E_THOMAS
- _rx == 0
- #else
- _rx == 1
- #endif
- )
+ if (_rx == 1)
{
begin = now;
_state = COMPLETE; // End of reception
@@ -404,13 +347,7 @@
pulseWidth = now - begin;
if (pulseWidth > _maxPulseWidth)
{
- if (
- #ifdef G_E_THOMAS
- _rx == 1
- #else
- _rx == 0
- #endif
- )
+ if (_rx == 0)
{
_state = IDLE; // End of reception
}
@@ -437,18 +374,14 @@
{
_timeout.detach();
-#ifdef G_E_THOMAS
- if ((_state == DECODE) && (_rx == 1))
-#else
- if ((_state == DECODE) && (_rx == 0))
-#endif
- {
- _error = "rx timeout";
- _state = IDLE; // Reception successful
- }
- else
- {
- _error = "reception error";
- _state = ERROR; // Reception incomplete
- }
+ if ((_state == DECODE) && (_rx == 0))
+ {
+ tr_err("rx timeout");
+ _state = IDLE; // Reception successful
+ }
+ else
+ {
+ tr_err("reception error");
+ _state = ERROR; // Reception incomplete
+ }
}