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.

Manchester.h

Committer:
hudakz
Date:
2018-10-14
Revision:
8:c1b5893191fe
Parent:
6:7454ad91f714

File content as of revision 8:c1b5893191fe:

/*
 ******************************************************************************
 * @file    Manchester.h
 * @author  Zoltan Hudak
 * @version
 * @date    2017-May-16
 * @brief   Manchester code for mbed
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; COPYRIGHT(c) 2017 Zoltan Hudak <hudakz@outlook.com>
 *
 * All rights reserved.

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/*
   This library 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 is one synchronization pulse at the begin of transmission 
   
   The IEEE 802.3 convention is used by default.
   Select a convention to be used by commenting or uncommenting 
   the line "#define G_E_THOMAS 1" below. 
*/
#ifndef MANCHESTER_H
#define MANCHESTER_H

#include "mbed.h"
#include "ManchesterMsg.h"

//Uncomment the following line to use G.E.Thomas' convention

//#define G_E_THOMAS 1

class   Manchester
{
    enum State
    {
        IDLE,
        SYNCH_START,
        SYNCH_NEXT,
        SYNCH_END,
        SETUP,
        TRANSITION,
        COMPLETE,
        LISTEN,
        DECODE_START,
        DECODE,
        STOP,
        ERROR
    };
public:
    Manchester
    (
        PinName     txPin,          /* transmitter pin name */
        PinName     rxPin,          /* receiver pin name */
        uint32_t    speed = 1200,   /* speed in bits per second */
        uint8_t     tol = 25,       /* pulse width tolerance (+/-) in % */
        float       rxTimeout = 5   /* receive timeout */
    );
    ~       Manchester(void)    { }
    void    transmit(ManchesterMsg& msg);
    bool    receive(ManchesterMsg& msg);
    void    setPreamble(uint8_t preamble)   { _preamble = preamble; }
    void    setRxTimeout(float seconds)     { _rxTimeout = seconds; }
    char*   lastError()                     { return _error; }
private:
    DigitalOut  _tx;                // transmitter line
    InterruptIn _rx;                // receiver line
    Ticker      _txTicker;          // transmitter ticker
    Timeout     _timeout;           // timeout (watchdog)
    Timer       _timer;
    uint32_t    _midBitTime;        // mid-bit time [us]
    uint32_t    _minPulseWidth;     // minimum pulse width [us]
    uint32_t    _maxPulseWidth;     // maximum pulse width [us]
    uint32_t    _tol;
    float       _rxTimeout;         // reception timeout [s]
    State       _state;             // state
    char*       _data;              // data array
    size_t      _len;               // data length in bytes
    size_t      _maxLen;            // maximum length
    size_t      _preamble;          // number of start patterns
    char*       _error;
    void        transmission(void);
    void        reception(void);
    void        onTxTimeout(void);
    void        onRxTimeout(void);
};
#endif // MANCHESTER_H