Jordan Earls
/
pjon_testing
Testing getting PJON working on mbed https://github.com/gioblu/PJON
pjon.h@2:5648483c5dbc, 2016-01-16 (annotated)
- Committer:
- earlz
- Date:
- Sat Jan 16 15:51:23 2016 +0000
- Revision:
- 2:5648483c5dbc
- Parent:
- 1:bd0ee507dd4c
Attempting to make things work, but it currently just freezes for some reason
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:5648483c5dbc | 67 | /* |
earlz | 2:5648483c5dbc | 68 | #define BIT_WIDTH 52 |
earlz | 2:5648483c5dbc | 69 | #define BIT_SPACER 121 |
earlz | 2:5648483c5dbc | 70 | #define ACCEPTANCE 51 |
earlz | 2:5648483c5dbc | 71 | #define READ_DELAY 29 |
earlz | 2:5648483c5dbc | 72 | */ |
earlz | 2:5648483c5dbc | 73 | #define BIT_WIDTH 45 |
earlz | 2:5648483c5dbc | 74 | #define BIT_SPACER 113 |
earlz | 2:5648483c5dbc | 75 | #define ACCEPTANCE 45 |
earlz | 2:5648483c5dbc | 76 | #define READ_DELAY 23 |
earlz | 0:fa2f348efd7e | 77 | /* The following constants setup are quite conservative and determined only |
earlz | 0:fa2f348efd7e | 78 | with a huge amount of time and blind testing (without oscilloscope) |
earlz | 0:fa2f348efd7e | 79 | tweaking values and analysing results. Theese can be changed to obtain |
earlz | 0:fa2f348efd7e | 80 | faster speed. Probably you need experience, time and an oscilloscope. */ |
earlz | 0:fa2f348efd7e | 81 | |
earlz | 0:fa2f348efd7e | 82 | #if defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) |
earlz | 0:fa2f348efd7e | 83 | #if (F_CPU == 16000000 && !COMPATIBILITY_MODE) |
earlz | 0:fa2f348efd7e | 84 | #define BIT_WIDTH 20 |
earlz | 0:fa2f348efd7e | 85 | #define BIT_SPACER 56 |
earlz | 0:fa2f348efd7e | 86 | #define ACCEPTANCE 20 |
earlz | 0:fa2f348efd7e | 87 | #define READ_DELAY 8 |
earlz | 0:fa2f348efd7e | 88 | #endif |
earlz | 0:fa2f348efd7e | 89 | #if (F_CPU == 8000000 || COMPATIBILITY_MODE) |
earlz | 0:fa2f348efd7e | 90 | #define BIT_WIDTH 40 |
earlz | 0:fa2f348efd7e | 91 | #define BIT_SPACER 112 |
earlz | 0:fa2f348efd7e | 92 | #define ACCEPTANCE 40 |
earlz | 0:fa2f348efd7e | 93 | #define READ_DELAY 16 |
earlz | 0:fa2f348efd7e | 94 | #endif |
earlz | 0:fa2f348efd7e | 95 | #endif |
earlz | 0:fa2f348efd7e | 96 | |
earlz | 0:fa2f348efd7e | 97 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) |
earlz | 0:fa2f348efd7e | 98 | #if (F_CPU == 16000000 && !COMPATIBILITY_MODE) |
earlz | 0:fa2f348efd7e | 99 | /* Mega has shorter values than Duemianove / Uno because |
earlz | 0:fa2f348efd7e | 100 | micros() produces longer delays on ATmega1280/2560 */ |
earlz | 0:fa2f348efd7e | 101 | #define BIT_WIDTH 18 |
earlz | 0:fa2f348efd7e | 102 | #define BIT_SPACER 54 |
earlz | 0:fa2f348efd7e | 103 | #define ACCEPTANCE 18 |
earlz | 0:fa2f348efd7e | 104 | #define READ_DELAY 8 |
earlz | 0:fa2f348efd7e | 105 | #endif |
earlz | 0:fa2f348efd7e | 106 | #if (F_CPU == 8000000 || COMPATIBILITY_MODE) |
earlz | 0:fa2f348efd7e | 107 | /* Mega has shorter values than Duemianove / Uno because |
earlz | 0:fa2f348efd7e | 108 | micros() produces longer delays on ATmega1280/2560 */ |
earlz | 0:fa2f348efd7e | 109 | #define BIT_WIDTH 38 |
earlz | 0:fa2f348efd7e | 110 | #define BIT_SPACER 110 |
earlz | 0:fa2f348efd7e | 111 | #define ACCEPTANCE 38 |
earlz | 0:fa2f348efd7e | 112 | #define READ_DELAY 16 |
earlz | 0:fa2f348efd7e | 113 | #endif |
earlz | 0:fa2f348efd7e | 114 | #endif |
earlz | 0:fa2f348efd7e | 115 | |
earlz | 0:fa2f348efd7e | 116 | #if defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) |
earlz | 0:fa2f348efd7e | 117 | #if (F_CPU == 8000000 || COMPATIBILITY_MODE) // Internal clock |
earlz | 0:fa2f348efd7e | 118 | /* ATtiny has shorter values than Duemianove / Uno because |
earlz | 0:fa2f348efd7e | 119 | micros() produces longer delays on ATtiny45/85 */ |
earlz | 0:fa2f348efd7e | 120 | #define BIT_WIDTH 35 |
earlz | 0:fa2f348efd7e | 121 | #define BIT_SPACER 108 |
earlz | 0:fa2f348efd7e | 122 | #define ACCEPTANCE 35 |
earlz | 0:fa2f348efd7e | 123 | #define READ_DELAY 16 |
earlz | 0:fa2f348efd7e | 124 | #endif |
earlz | 0:fa2f348efd7e | 125 | #endif |
earlz | 0:fa2f348efd7e | 126 | |
earlz | 0:fa2f348efd7e | 127 | #endif |
earlz | 0:fa2f348efd7e | 128 | |
earlz | 0:fa2f348efd7e | 129 | // Protocol symbols |
earlz | 0:fa2f348efd7e | 130 | #define ACK 6 |
earlz | 0:fa2f348efd7e | 131 | #define NAK 21 |
earlz | 0:fa2f348efd7e | 132 | #define FAIL 0x100 |
earlz | 0:fa2f348efd7e | 133 | #define BUSY 666 |
earlz | 0:fa2f348efd7e | 134 | #define BROADCAST 124 |
earlz | 0:fa2f348efd7e | 135 | #define TO_BE_SENT 74 |
earlz | 0:fa2f348efd7e | 136 | |
earlz | 0:fa2f348efd7e | 137 | // Errors |
earlz | 0:fa2f348efd7e | 138 | #define CONNECTION_LOST 101 |
earlz | 0:fa2f348efd7e | 139 | #define PACKETS_BUFFER_FULL 102 |
earlz | 0:fa2f348efd7e | 140 | #define MEMORY_FULL 103 |
earlz | 0:fa2f348efd7e | 141 | |
earlz | 0:fa2f348efd7e | 142 | // Maximum sending attempts before throwing CONNECTON_LOST error |
earlz | 0:fa2f348efd7e | 143 | #define MAX_ATTEMPTS 250 |
earlz | 0:fa2f348efd7e | 144 | |
earlz | 0:fa2f348efd7e | 145 | // Packets buffer length, if full PACKET_BUFFER_FULL error is thrown |
earlz | 0:fa2f348efd7e | 146 | #define MAX_PACKETS 10 |
earlz | 0:fa2f348efd7e | 147 | |
earlz | 0:fa2f348efd7e | 148 | // Max packet length, higher if necessary (affects memory) |
earlz | 0:fa2f348efd7e | 149 | #define PACKET_MAX_LENGTH 50 |
earlz | 0:fa2f348efd7e | 150 | |
earlz | 0:fa2f348efd7e | 151 | struct packet { |
earlz | 0:fa2f348efd7e | 152 | uint8_t attempts; |
earlz | 0:fa2f348efd7e | 153 | uint8_t device_id; |
earlz | 0:fa2f348efd7e | 154 | char *content; |
earlz | 0:fa2f348efd7e | 155 | uint8_t length; |
earlz | 2:5648483c5dbc | 156 | uint32_t registration; |
earlz | 0:fa2f348efd7e | 157 | int state; |
earlz | 2:5648483c5dbc | 158 | uint32_t timing; |
earlz | 0:fa2f348efd7e | 159 | }; |
earlz | 0:fa2f348efd7e | 160 | |
earlz | 0:fa2f348efd7e | 161 | typedef void (* receiver)(uint8_t length, uint8_t *payload); |
earlz | 0:fa2f348efd7e | 162 | typedef void (* pjon_error)(uint8_t code, uint8_t data); |
earlz | 0:fa2f348efd7e | 163 | |
earlz | 2:5648483c5dbc | 164 | static void dummy_error_handler(uint8_t code, uint8_t data) { |
earlz | 2:5648483c5dbc | 165 | DigitalOut myled(LED1); |
earlz | 2:5648483c5dbc | 166 | myled = 1; |
earlz | 2:5648483c5dbc | 167 | }; |
earlz | 0:fa2f348efd7e | 168 | |
earlz | 0:fa2f348efd7e | 169 | class PJON { |
earlz | 0:fa2f348efd7e | 170 | |
earlz | 0:fa2f348efd7e | 171 | public: |
earlz | 0:fa2f348efd7e | 172 | PJON(PinName input_pin); |
earlz | 0:fa2f348efd7e | 173 | PJON(PinName input_pin, uint8_t id); |
earlz | 0:fa2f348efd7e | 174 | |
earlz | 0:fa2f348efd7e | 175 | void initialize(); |
earlz | 0:fa2f348efd7e | 176 | |
earlz | 0:fa2f348efd7e | 177 | void set_id(uint8_t id); |
earlz | 0:fa2f348efd7e | 178 | void set_receiver(receiver r); |
earlz | 0:fa2f348efd7e | 179 | void set_error(pjon_error e); |
earlz | 0:fa2f348efd7e | 180 | |
earlz | 0:fa2f348efd7e | 181 | int receive_byte(); |
earlz | 0:fa2f348efd7e | 182 | int receive(); |
earlz | 0:fa2f348efd7e | 183 | int receive(unsigned long duration); |
earlz | 0:fa2f348efd7e | 184 | |
earlz | 0:fa2f348efd7e | 185 | void send_bit(uint8_t VALUE, int duration); |
earlz | 0:fa2f348efd7e | 186 | void send_byte(uint8_t b); |
earlz | 0:fa2f348efd7e | 187 | int send_string(uint8_t id, char *string, uint8_t length); |
earlz | 0:fa2f348efd7e | 188 | int send(uint8_t id, char *packet, uint8_t length, unsigned long timing = 0); |
earlz | 0:fa2f348efd7e | 189 | |
earlz | 0:fa2f348efd7e | 190 | void update(); |
earlz | 0:fa2f348efd7e | 191 | void remove(int id); |
earlz | 0:fa2f348efd7e | 192 | |
earlz | 0:fa2f348efd7e | 193 | uint8_t read_byte(); |
earlz | 0:fa2f348efd7e | 194 | bool can_start(); |
earlz | 0:fa2f348efd7e | 195 | |
earlz | 0:fa2f348efd7e | 196 | uint8_t syncronization_bit(); |
earlz | 0:fa2f348efd7e | 197 | |
earlz | 0:fa2f348efd7e | 198 | uint8_t data[PACKET_MAX_LENGTH]; |
earlz | 0:fa2f348efd7e | 199 | packet packets[MAX_PACKETS]; |
earlz | 0:fa2f348efd7e | 200 | |
earlz | 0:fa2f348efd7e | 201 | private: |
earlz | 0:fa2f348efd7e | 202 | DigitalInOut _input_pin; |
earlz | 0:fa2f348efd7e | 203 | uint8_t _device_id; |
earlz | 0:fa2f348efd7e | 204 | //int _input_pin; |
earlz | 0:fa2f348efd7e | 205 | receiver _receiver; |
earlz | 0:fa2f348efd7e | 206 | pjon_error _error; |
earlz | 0:fa2f348efd7e | 207 | Timer _reg_timer; |
earlz | 0:fa2f348efd7e | 208 | }; |