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

Dependencies:   mbed

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?

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 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 };