Manchester

Committer:
junhong
Date:
Thu Apr 11 07:52:23 2019 +0000
Revision:
9:7a23184aa9ef
Parent:
8:c1b5893191fe
modified to adopt DALi protocol

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.h
hudakz 0:d5c75b0e5708 4 * @author Zoltan Hudak
hudakz 2:de778df5892c 5 * @version
hudakz 6:7454ad91f714 6 * @date 2017-May-16
hudakz 1:11292d238e50 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 This library implements Manchester code according to both IEEE 802.3
hudakz 6:7454ad91f714 30 and G.E. Thomas' conventions.
hudakz 5:3b2c7e9fda3f 31 • A '0' is expressed by a high-to-low transition, a '1' by low-to-high transition
hudakz 5:3b2c7e9fda3f 32 in the IEEE 802.3 convention. The reverse is true in the G.E. Thomas' convention.
hudakz 6:7454ad91f714 33 • The transitions which signify '0' or '1' occur at the midpoint of a period.
hudakz 5:3b2c7e9fda3f 34 • Transitions at the start of a period are overhead and don't signify data.
hudakz 5:3b2c7e9fda3f 35 • Least significant bit is sent first
hudakz 5:3b2c7e9fda3f 36 • There is one synchronization pulse at the begin of transmission
hudakz 5:3b2c7e9fda3f 37
hudakz 5:3b2c7e9fda3f 38 The IEEE 802.3 convention is used by default.
hudakz 5:3b2c7e9fda3f 39 Select a convention to be used by commenting or uncommenting
hudakz 5:3b2c7e9fda3f 40 the line "#define G_E_THOMAS 1" below.
hudakz 5:3b2c7e9fda3f 41 */
hudakz 0:d5c75b0e5708 42 #ifndef MANCHESTER_H
hudakz 0:d5c75b0e5708 43 #define MANCHESTER_H
hudakz 0:d5c75b0e5708 44
hudakz 0:d5c75b0e5708 45 #include "mbed.h"
hudakz 5:3b2c7e9fda3f 46
hudakz 0:d5c75b0e5708 47 class Manchester
hudakz 0:d5c75b0e5708 48 {
hudakz 0:d5c75b0e5708 49 enum State
hudakz 0:d5c75b0e5708 50 {
hudakz 0:d5c75b0e5708 51 IDLE,
hudakz 0:d5c75b0e5708 52 SYNCH_START,
hudakz 0:d5c75b0e5708 53 SYNCH_NEXT,
hudakz 0:d5c75b0e5708 54 SYNCH_END,
hudakz 0:d5c75b0e5708 55 SETUP,
hudakz 0:d5c75b0e5708 56 TRANSITION,
hudakz 0:d5c75b0e5708 57 COMPLETE,
hudakz 0:d5c75b0e5708 58 LISTEN,
hudakz 8:c1b5893191fe 59 DECODE_START,
hudakz 0:d5c75b0e5708 60 DECODE,
hudakz 8:c1b5893191fe 61 STOP,
hudakz 0:d5c75b0e5708 62 ERROR
hudakz 0:d5c75b0e5708 63 };
hudakz 0:d5c75b0e5708 64 public:
hudakz 0:d5c75b0e5708 65 Manchester
hudakz 0:d5c75b0e5708 66 (
hudakz 1:11292d238e50 67 PinName txPin, /* transmitter pin name */
hudakz 1:11292d238e50 68 PinName rxPin, /* receiver pin name */
hudakz 5:3b2c7e9fda3f 69 uint32_t speed = 1200, /* speed in bits per second */
junhong 9:7a23184aa9ef 70 uint8_t tol = 10, /* pulse width tolerance (+/-) in % */
hudakz 8:c1b5893191fe 71 float rxTimeout = 5 /* receive timeout */
hudakz 0:d5c75b0e5708 72 );
hudakz 8:c1b5893191fe 73 ~ Manchester(void) { }
junhong 9:7a23184aa9ef 74 void transmit(uint8_t *msg, uint8_t len);
junhong 9:7a23184aa9ef 75 bool receive(uint8_t *msg, uint8_t *len);
hudakz 8:c1b5893191fe 76 void setPreamble(uint8_t preamble) { _preamble = preamble; }
hudakz 8:c1b5893191fe 77 void setRxTimeout(float seconds) { _rxTimeout = seconds; }
junhong 9:7a23184aa9ef 78
hudakz 0:d5c75b0e5708 79 private:
hudakz 8:c1b5893191fe 80 DigitalOut _tx; // transmitter line
hudakz 8:c1b5893191fe 81 InterruptIn _rx; // receiver line
hudakz 8:c1b5893191fe 82 Ticker _txTicker; // transmitter ticker
hudakz 8:c1b5893191fe 83 Timeout _timeout; // timeout (watchdog)
hudakz 8:c1b5893191fe 84 Timer _timer;
hudakz 8:c1b5893191fe 85 uint32_t _midBitTime; // mid-bit time [us]
hudakz 8:c1b5893191fe 86 uint32_t _minPulseWidth; // minimum pulse width [us]
hudakz 8:c1b5893191fe 87 uint32_t _maxPulseWidth; // maximum pulse width [us]
hudakz 8:c1b5893191fe 88 uint32_t _tol;
hudakz 8:c1b5893191fe 89 float _rxTimeout; // reception timeout [s]
hudakz 8:c1b5893191fe 90 State _state; // state
hudakz 8:c1b5893191fe 91 char* _data; // data array
junhong 9:7a23184aa9ef 92 uint8_t _len; // data length in bytes
junhong 9:7a23184aa9ef 93 uint8_t _maxLen; // maximum length
hudakz 8:c1b5893191fe 94 size_t _preamble; // number of start patterns
hudakz 0:d5c75b0e5708 95 void transmission(void);
hudakz 0:d5c75b0e5708 96 void reception(void);
hudakz 8:c1b5893191fe 97 void onTxTimeout(void);
hudakz 8:c1b5893191fe 98 void onRxTimeout(void);
hudakz 0:d5c75b0e5708 99 };
hudakz 0:d5c75b0e5708 100 #endif // MANCHESTER_H