Testing getting PJON working on mbed https://github.com/gioblu/PJON

Dependencies:   mbed

Committer:
earlz
Date:
Sun Jan 10 09:41:00 2016 +0000
Revision:
1:bd0ee507dd4c
Parent:
0:fa2f348efd7e
Child:
2:5648483c5dbc
Use the network analysis example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
earlz 0:fa2f348efd7e 1
earlz 0:fa2f348efd7e 2 /*-O//\ __ __
earlz 0:fa2f348efd7e 3 |-gfo\ |__| | | | |\ |
earlz 0:fa2f348efd7e 4 |!y°o:\ | __| |__| | \| v1.0
earlz 0:fa2f348efd7e 5 |y"s§+`\ Giovanni Blu Mitolo 2012 - 2015
earlz 0:fa2f348efd7e 6 /so+:-..`\ gioscarab@gmail.com
earlz 0:fa2f348efd7e 7 |+/:ngr-*.`\
earlz 0:fa2f348efd7e 8 |5/:%&-a3f.:;\ PJON is a device communications bus system that connects up to 255
earlz 0:fa2f348efd7e 9 \+//u/+g%{osv,,\ arduino boards over one wire up to 5.29kB/s data communication speed.
earlz 0:fa2f348efd7e 10 \=+&/osw+olds.\\ Contains acknowledge, collision detection, CRC and encpryption all done
earlz 0:fa2f348efd7e 11 \:/+-.-°-:+oss\ with micros() and delayMicroseconds(), with no use of interrupts or timers.
earlz 0:fa2f348efd7e 12 | | \oy\\ Pull down resistor on the bus is generally used to reduce interference.
earlz 0:fa2f348efd7e 13 > <
earlz 0:fa2f348efd7e 14 _____-| |-________________________________________________________________________
earlz 0:fa2f348efd7e 15 | BIT_WIDTH 20 | BIT_SPACER 56 | ACCEPTANCE 20 | READ_DELAY 8 |
earlz 0:fa2f348efd7e 16 |----------------------------------------------------------------------------------|
earlz 0:fa2f348efd7e 17 |Transfer speed: 5.29kB/s | Absolute bandwidth: 3.23 kB/s |
earlz 0:fa2f348efd7e 18 |Baud rate: 42372 baud | Data throughput: 2.68 kB/s |
earlz 0:fa2f348efd7e 19 |__________________________________________________________________________________|
earlz 0:fa2f348efd7e 20
earlz 0:fa2f348efd7e 21 Copyright (c) 2012-2015, Giovanni Blu Mitolo All rights reserved.
earlz 0:fa2f348efd7e 22
earlz 0:fa2f348efd7e 23 Redistribution and use in source and binary forms, with or without
earlz 0:fa2f348efd7e 24 modification, are permitted provided that the following conditions are met:
earlz 0:fa2f348efd7e 25 - Redistributions of source code must retain the above copyright
earlz 0:fa2f348efd7e 26 notice, this list of conditions and the following disclaimer.
earlz 0:fa2f348efd7e 27
earlz 0:fa2f348efd7e 28 - Redistributions in binary form must reproduce the above copyright
earlz 0:fa2f348efd7e 29 notice, this list of conditions and the following disclaimer in the
earlz 0:fa2f348efd7e 30 documentation and/or other materials provided with the distribution.
earlz 0:fa2f348efd7e 31
earlz 0:fa2f348efd7e 32 - All advertising materials mentioning features or use of this software
earlz 0:fa2f348efd7e 33 must display the following acknowledgement:
earlz 0:fa2f348efd7e 34 This product includes PJON software developed by Giovanni Blu Mitolo.
earlz 0:fa2f348efd7e 35
earlz 0:fa2f348efd7e 36 - Neither the name of PJON, PJON_ASK nor the
earlz 0:fa2f348efd7e 37 names of its contributors may be used to endorse or promote products
earlz 0:fa2f348efd7e 38 derived from this software without specific prior written permission.
earlz 0:fa2f348efd7e 39
earlz 0:fa2f348efd7e 40 This software is provided by the copyright holders and contributors"as is"
earlz 0:fa2f348efd7e 41 and any express or implied warranties, including, but not limited to, the
earlz 0:fa2f348efd7e 42 implied warranties of merchantability and fitness for a particular purpose
earlz 0:fa2f348efd7e 43 are disclaimed. In no event shall the copyright holder or contributors be
earlz 0:fa2f348efd7e 44 liable for any direct, indirect, incidental, special, exemplary, or consequential
earlz 0:fa2f348efd7e 45 damages (including, but not limited to, procurement of substitute goods or services;
earlz 0:fa2f348efd7e 46 loss of use, data, or profits; or business interruption) however caused and on any
earlz 0:fa2f348efd7e 47 theory of liability, whether in contract, strict liability, or tort (including
earlz 0:fa2f348efd7e 48 negligence or otherwise) arising in any way out of the use of this software, even if
earlz 0:fa2f348efd7e 49 advised of the possibility of such damage. */
earlz 0:fa2f348efd7e 50
earlz 0:fa2f348efd7e 51 #ifndef PJON_h
earlz 0:fa2f348efd7e 52 #define PJON_h
earlz 0:fa2f348efd7e 53
earlz 0:fa2f348efd7e 54 #include "mbed.h"
earlz 0:fa2f348efd7e 55
earlz 0:fa2f348efd7e 56 /* COMPATIBILITY_MODE set to true:
earlz 0:fa2f348efd7e 57 Run the network with a cautious speed to support all architectures.
earlz 0:fa2f348efd7e 58 8Mhz devices will be able to communicate with 16 or more Mhz devices.
earlz 0:fa2f348efd7e 59 COMPATIBILITY_MODE set to false:
earlz 0:fa2f348efd7e 60 Run the network at full speed with the best performances, but is
earlz 0:fa2f348efd7e 61 indicated only for networks made by a group of devices with the
earlz 0:fa2f348efd7e 62 same architecture / processor (for example 10 Arduino Uno) */
earlz 0:fa2f348efd7e 63
earlz 0:fa2f348efd7e 64 #define COMPATIBILITY_MODE true
earlz 0:fa2f348efd7e 65
earlz 0:fa2f348efd7e 66 //mbed (needs tweaking)
earlz 1:bd0ee507dd4c 67 #define BIT_WIDTH 45
earlz 1:bd0ee507dd4c 68 #define BIT_SPACER 115
earlz 1:bd0ee507dd4c 69 #define ACCEPTANCE 39
earlz 1:bd0ee507dd4c 70 #define READ_DELAY 25
earlz 0:fa2f348efd7e 71
earlz 0:fa2f348efd7e 72 /* The following constants setup are quite conservative and determined only
earlz 0:fa2f348efd7e 73 with a huge amount of time and blind testing (without oscilloscope)
earlz 0:fa2f348efd7e 74 tweaking values and analysing results. Theese can be changed to obtain
earlz 0:fa2f348efd7e 75 faster speed. Probably you need experience, time and an oscilloscope. */
earlz 0:fa2f348efd7e 76
earlz 0:fa2f348efd7e 77 #if defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
earlz 0:fa2f348efd7e 78 #if (F_CPU == 16000000 && !COMPATIBILITY_MODE)
earlz 0:fa2f348efd7e 79 #define BIT_WIDTH 20
earlz 0:fa2f348efd7e 80 #define BIT_SPACER 56
earlz 0:fa2f348efd7e 81 #define ACCEPTANCE 20
earlz 0:fa2f348efd7e 82 #define READ_DELAY 8
earlz 0:fa2f348efd7e 83 #endif
earlz 0:fa2f348efd7e 84 #if (F_CPU == 8000000 || COMPATIBILITY_MODE)
earlz 0:fa2f348efd7e 85 #define BIT_WIDTH 40
earlz 0:fa2f348efd7e 86 #define BIT_SPACER 112
earlz 0:fa2f348efd7e 87 #define ACCEPTANCE 40
earlz 0:fa2f348efd7e 88 #define READ_DELAY 16
earlz 0:fa2f348efd7e 89 #endif
earlz 0:fa2f348efd7e 90 #endif
earlz 0:fa2f348efd7e 91
earlz 0:fa2f348efd7e 92 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
earlz 0:fa2f348efd7e 93 #if (F_CPU == 16000000 && !COMPATIBILITY_MODE)
earlz 0:fa2f348efd7e 94 /* Mega has shorter values than Duemianove / Uno because
earlz 0:fa2f348efd7e 95 micros() produces longer delays on ATmega1280/2560 */
earlz 0:fa2f348efd7e 96 #define BIT_WIDTH 18
earlz 0:fa2f348efd7e 97 #define BIT_SPACER 54
earlz 0:fa2f348efd7e 98 #define ACCEPTANCE 18
earlz 0:fa2f348efd7e 99 #define READ_DELAY 8
earlz 0:fa2f348efd7e 100 #endif
earlz 0:fa2f348efd7e 101 #if (F_CPU == 8000000 || COMPATIBILITY_MODE)
earlz 0:fa2f348efd7e 102 /* Mega has shorter values than Duemianove / Uno because
earlz 0:fa2f348efd7e 103 micros() produces longer delays on ATmega1280/2560 */
earlz 0:fa2f348efd7e 104 #define BIT_WIDTH 38
earlz 0:fa2f348efd7e 105 #define BIT_SPACER 110
earlz 0:fa2f348efd7e 106 #define ACCEPTANCE 38
earlz 0:fa2f348efd7e 107 #define READ_DELAY 16
earlz 0:fa2f348efd7e 108 #endif
earlz 0:fa2f348efd7e 109 #endif
earlz 0:fa2f348efd7e 110
earlz 0:fa2f348efd7e 111 #if defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
earlz 0:fa2f348efd7e 112 #if (F_CPU == 8000000 || COMPATIBILITY_MODE) // Internal clock
earlz 0:fa2f348efd7e 113 /* ATtiny has shorter values than Duemianove / Uno because
earlz 0:fa2f348efd7e 114 micros() produces longer delays on ATtiny45/85 */
earlz 0:fa2f348efd7e 115 #define BIT_WIDTH 35
earlz 0:fa2f348efd7e 116 #define BIT_SPACER 108
earlz 0:fa2f348efd7e 117 #define ACCEPTANCE 35
earlz 0:fa2f348efd7e 118 #define READ_DELAY 16
earlz 0:fa2f348efd7e 119 #endif
earlz 0:fa2f348efd7e 120 #endif
earlz 0:fa2f348efd7e 121
earlz 0:fa2f348efd7e 122 #endif
earlz 0:fa2f348efd7e 123
earlz 0:fa2f348efd7e 124 // Protocol symbols
earlz 0:fa2f348efd7e 125 #define ACK 6
earlz 0:fa2f348efd7e 126 #define NAK 21
earlz 0:fa2f348efd7e 127 #define FAIL 0x100
earlz 0:fa2f348efd7e 128 #define BUSY 666
earlz 0:fa2f348efd7e 129 #define BROADCAST 124
earlz 0:fa2f348efd7e 130 #define TO_BE_SENT 74
earlz 0:fa2f348efd7e 131
earlz 0:fa2f348efd7e 132 // Errors
earlz 0:fa2f348efd7e 133 #define CONNECTION_LOST 101
earlz 0:fa2f348efd7e 134 #define PACKETS_BUFFER_FULL 102
earlz 0:fa2f348efd7e 135 #define MEMORY_FULL 103
earlz 0:fa2f348efd7e 136
earlz 0:fa2f348efd7e 137 // Maximum sending attempts before throwing CONNECTON_LOST error
earlz 0:fa2f348efd7e 138 #define MAX_ATTEMPTS 250
earlz 0:fa2f348efd7e 139
earlz 0:fa2f348efd7e 140 // Packets buffer length, if full PACKET_BUFFER_FULL error is thrown
earlz 0:fa2f348efd7e 141 #define MAX_PACKETS 10
earlz 0:fa2f348efd7e 142
earlz 0:fa2f348efd7e 143 // Max packet length, higher if necessary (affects memory)
earlz 0:fa2f348efd7e 144 #define PACKET_MAX_LENGTH 50
earlz 0:fa2f348efd7e 145
earlz 0:fa2f348efd7e 146 struct packet {
earlz 0:fa2f348efd7e 147 uint8_t attempts;
earlz 0:fa2f348efd7e 148 uint8_t device_id;
earlz 0:fa2f348efd7e 149 char *content;
earlz 0:fa2f348efd7e 150 uint8_t length;
earlz 0:fa2f348efd7e 151 unsigned long registration;
earlz 0:fa2f348efd7e 152 int state;
earlz 0:fa2f348efd7e 153 unsigned long timing;
earlz 0:fa2f348efd7e 154 };
earlz 0:fa2f348efd7e 155
earlz 0:fa2f348efd7e 156 typedef void (* receiver)(uint8_t length, uint8_t *payload);
earlz 0:fa2f348efd7e 157 typedef void (* pjon_error)(uint8_t code, uint8_t data);
earlz 0:fa2f348efd7e 158
earlz 0:fa2f348efd7e 159 static void dummy_error_handler(uint8_t code, uint8_t data) {};
earlz 0:fa2f348efd7e 160
earlz 0:fa2f348efd7e 161 class PJON {
earlz 0:fa2f348efd7e 162
earlz 0:fa2f348efd7e 163 public:
earlz 0:fa2f348efd7e 164 PJON(PinName input_pin);
earlz 0:fa2f348efd7e 165 PJON(PinName input_pin, uint8_t id);
earlz 0:fa2f348efd7e 166
earlz 0:fa2f348efd7e 167 void initialize();
earlz 0:fa2f348efd7e 168
earlz 0:fa2f348efd7e 169 void set_id(uint8_t id);
earlz 0:fa2f348efd7e 170 void set_receiver(receiver r);
earlz 0:fa2f348efd7e 171 void set_error(pjon_error e);
earlz 0:fa2f348efd7e 172
earlz 0:fa2f348efd7e 173 int receive_byte();
earlz 0:fa2f348efd7e 174 int receive();
earlz 0:fa2f348efd7e 175 int receive(unsigned long duration);
earlz 0:fa2f348efd7e 176
earlz 0:fa2f348efd7e 177 void send_bit(uint8_t VALUE, int duration);
earlz 0:fa2f348efd7e 178 void send_byte(uint8_t b);
earlz 0:fa2f348efd7e 179 int send_string(uint8_t id, char *string, uint8_t length);
earlz 0:fa2f348efd7e 180 int send(uint8_t id, char *packet, uint8_t length, unsigned long timing = 0);
earlz 0:fa2f348efd7e 181
earlz 0:fa2f348efd7e 182 void update();
earlz 0:fa2f348efd7e 183 void remove(int id);
earlz 0:fa2f348efd7e 184
earlz 0:fa2f348efd7e 185 uint8_t read_byte();
earlz 0:fa2f348efd7e 186 bool can_start();
earlz 0:fa2f348efd7e 187
earlz 0:fa2f348efd7e 188 uint8_t syncronization_bit();
earlz 0:fa2f348efd7e 189
earlz 0:fa2f348efd7e 190 uint8_t data[PACKET_MAX_LENGTH];
earlz 0:fa2f348efd7e 191 packet packets[MAX_PACKETS];
earlz 0:fa2f348efd7e 192
earlz 0:fa2f348efd7e 193 private:
earlz 0:fa2f348efd7e 194 DigitalInOut _input_pin;
earlz 0:fa2f348efd7e 195 uint8_t _device_id;
earlz 0:fa2f348efd7e 196 //int _input_pin;
earlz 0:fa2f348efd7e 197 receiver _receiver;
earlz 0:fa2f348efd7e 198 pjon_error _error;
earlz 0:fa2f348efd7e 199 Timer _reg_timer;
earlz 0:fa2f348efd7e 200 };