A simple wireless protocol to let my examples communicate each other. ssWi stands for Shared Slotted Wireless protocol

Dependents:   rover_car rover_pc supervisor watering_unit ... more

This library aims at implementing a simple communication protocol among nodes, abstracting from the hardware. The name ssWi stands for Shared Slotted Wireless. Wireless is part of the name, even though the library abstracts from the hardware, as the first version was entirely focused on the XBee modules and then the name has not been changed.

The communication channel is represented by ssWiChannel, an abstract class which models the channel that the transceivers access to. The concrete classes must implement the functions: init, read and write. The protocol automatically sends and receives data through the selected channel, exploiting the operting system timers. Addresses are not considered as the communication lays on broadcast transmissions.

The protocol provides the ssWiPort abstraction which is like memory areas shared among all the connected nodes. Reading from one port lets the node retrieve the last written value from the other nodes. Writing on one port means sending such value to other nodes.

Objects instantiated from ssWiSocket are the interface for allowing nodes to access the protocol ports.

/media/uploads/mariob/scheme.png

TODO:

  • improve the parsing of the received messages
  • communication tests with many nodes (so far, only 2 nodes have been tested)
Committer:
mariob
Date:
Wed Jan 18 21:01:25 2017 +0000
Revision:
17:8ba1b278b407
Parent:
15:fb0f6cbc0ed5
Child:
18:133e42dc82b0
bug fix: RtosTimer is executed with a low priority - coded moved into a RealTime task

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mariob 15:fb0f6cbc0ed5 1 /** \file xbee.cpp
mariob 15:fb0f6cbc0ed5 2 * \brief implementation of the ssWi channel using the XBee module
mariob 15:fb0f6cbc0ed5 3 *
mariob 15:fb0f6cbc0ed5 4 */
mariob 15:fb0f6cbc0ed5 5
mariob 15:fb0f6cbc0ed5 6 #include "xbee.hpp"
mariob 15:fb0f6cbc0ed5 7
mariob 15:fb0f6cbc0ed5 8 #include <sstream>
mariob 15:fb0f6cbc0ed5 9
mariob 15:fb0f6cbc0ed5 10
mariob 15:fb0f6cbc0ed5 11 void XBeeModule::readResponse (char* msg)
mariob 15:fb0f6cbc0ed5 12 {
mariob 15:fb0f6cbc0ed5 13 char c = 0;
mariob 15:fb0f6cbc0ed5 14 int i = 0;
mariob 15:fb0f6cbc0ed5 15 while (c!='\r')
mariob 15:fb0f6cbc0ed5 16 if (xbee.readable()) {
mariob 15:fb0f6cbc0ed5 17 c = xbee.getc();
mariob 15:fb0f6cbc0ed5 18 msg[i++] = c;
mariob 15:fb0f6cbc0ed5 19 }
mariob 15:fb0f6cbc0ed5 20 }
mariob 15:fb0f6cbc0ed5 21
mariob 15:fb0f6cbc0ed5 22 bool XBeeModule::executeWithOk (const char* cmd)
mariob 15:fb0f6cbc0ed5 23 {
mariob 15:fb0f6cbc0ed5 24 char msg[5];
mariob 15:fb0f6cbc0ed5 25 xbee.printf("%s", cmd);
mariob 15:fb0f6cbc0ed5 26 readResponse(msg);
mariob 15:fb0f6cbc0ed5 27 //printf("%s -> %s\n\r", cmd, msg);
mariob 15:fb0f6cbc0ed5 28 if (strncmp(msg, "OK\r", 3)!=0)
mariob 15:fb0f6cbc0ed5 29 return false;
mariob 15:fb0f6cbc0ed5 30 return true;
mariob 15:fb0f6cbc0ed5 31 }
mariob 15:fb0f6cbc0ed5 32
mariob 15:fb0f6cbc0ed5 33 void XBeeModule::executeWithRes (const char* cmd, char* res)
mariob 15:fb0f6cbc0ed5 34 {
mariob 15:fb0f6cbc0ed5 35 xbee.printf("%s", cmd);
mariob 15:fb0f6cbc0ed5 36 readResponse(res);
mariob 15:fb0f6cbc0ed5 37 //printf("\n\r%s -> %s\n\r", cmd, res);
mariob 15:fb0f6cbc0ed5 38 }
mariob 15:fb0f6cbc0ed5 39
mariob 15:fb0f6cbc0ed5 40 XBeeModule::XBeeModule (PinName tx, PinName rx, int panID, int channel) : xbee(tx, rx, 64)
mariob 15:fb0f6cbc0ed5 41 {
mariob 15:fb0f6cbc0ed5 42 status = false;
mariob 15:fb0f6cbc0ed5 43 wait(1);
mariob 15:fb0f6cbc0ed5 44 if (!_getLocalAddr())
mariob 15:fb0f6cbc0ed5 45 return;
mariob 15:fb0f6cbc0ed5 46 wait(1);
mariob 15:fb0f6cbc0ed5 47 if (!_setChannel(channel))
mariob 15:fb0f6cbc0ed5 48 return;
mariob 15:fb0f6cbc0ed5 49 wait(1);
mariob 15:fb0f6cbc0ed5 50 if (!_setPanID(panID))
mariob 15:fb0f6cbc0ed5 51 return;
mariob 15:fb0f6cbc0ed5 52 wait(1);
mariob 15:fb0f6cbc0ed5 53 status = true;
mariob 15:fb0f6cbc0ed5 54 }
mariob 15:fb0f6cbc0ed5 55
mariob 15:fb0f6cbc0ed5 56 XBeeAddress XBeeModule::getDstAddress ()
mariob 15:fb0f6cbc0ed5 57 {
mariob 15:fb0f6cbc0ed5 58 char tmp[10];
mariob 15:fb0f6cbc0ed5 59 std::stringstream s1, s2;
mariob 15:fb0f6cbc0ed5 60 string high, low;
mariob 15:fb0f6cbc0ed5 61 XBeeAddress addr;
mariob 15:fb0f6cbc0ed5 62 wait(1);
mariob 15:fb0f6cbc0ed5 63 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 64 return addr;
mariob 15:fb0f6cbc0ed5 65
mariob 15:fb0f6cbc0ed5 66 wait(1);
mariob 15:fb0f6cbc0ed5 67
mariob 15:fb0f6cbc0ed5 68 executeWithRes("ATDH \r", tmp);
mariob 15:fb0f6cbc0ed5 69 s1<<std::hex<<tmp;
mariob 15:fb0f6cbc0ed5 70 s1>>high;
mariob 15:fb0f6cbc0ed5 71
mariob 15:fb0f6cbc0ed5 72 executeWithRes("ATDL \r", tmp);
mariob 15:fb0f6cbc0ed5 73 s2<<std::hex<<tmp;
mariob 15:fb0f6cbc0ed5 74 s2>>low;
mariob 15:fb0f6cbc0ed5 75
mariob 15:fb0f6cbc0ed5 76 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 77 return addr;
mariob 15:fb0f6cbc0ed5 78
mariob 15:fb0f6cbc0ed5 79 wait(1);
mariob 15:fb0f6cbc0ed5 80 return XBeeAddress(low, high);
mariob 15:fb0f6cbc0ed5 81 }
mariob 15:fb0f6cbc0ed5 82
mariob 15:fb0f6cbc0ed5 83 bool XBeeModule::setDstAddress (XBeeAddress addr)
mariob 15:fb0f6cbc0ed5 84 {
mariob 15:fb0f6cbc0ed5 85 char s[10];
mariob 15:fb0f6cbc0ed5 86 string low, high;
mariob 15:fb0f6cbc0ed5 87 wait(1);
mariob 15:fb0f6cbc0ed5 88 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 89 return false;
mariob 15:fb0f6cbc0ed5 90 wait(1);
mariob 15:fb0f6cbc0ed5 91 sprintf(s, "ATDH%s \r", addr.getHighAddr().c_str());
mariob 15:fb0f6cbc0ed5 92 //printf("%s\n\r", addr.getHighAddr().c_str());
mariob 15:fb0f6cbc0ed5 93 if (!executeWithOk(s))
mariob 15:fb0f6cbc0ed5 94 return false;
mariob 15:fb0f6cbc0ed5 95
mariob 15:fb0f6cbc0ed5 96 sprintf(s, "ATDL%s \r", addr.getLowAddr().c_str());
mariob 15:fb0f6cbc0ed5 97 //printf("%s\n\r", addr.getLowAddr().c_str());
mariob 15:fb0f6cbc0ed5 98 if (!executeWithOk(s))
mariob 15:fb0f6cbc0ed5 99 return false;
mariob 15:fb0f6cbc0ed5 100
mariob 15:fb0f6cbc0ed5 101 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 102 return false;
mariob 15:fb0f6cbc0ed5 103
mariob 15:fb0f6cbc0ed5 104 return true;
mariob 15:fb0f6cbc0ed5 105 }
mariob 15:fb0f6cbc0ed5 106
mariob 15:fb0f6cbc0ed5 107 bool XBeeModule::_getLocalAddr ()
mariob 15:fb0f6cbc0ed5 108 {
mariob 15:fb0f6cbc0ed5 109 char tmp[10];
mariob 15:fb0f6cbc0ed5 110 string high, low;
mariob 15:fb0f6cbc0ed5 111 std::stringstream s1, s2;
mariob 15:fb0f6cbc0ed5 112
mariob 15:fb0f6cbc0ed5 113 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 114 return false;
mariob 15:fb0f6cbc0ed5 115 executeWithRes("ATSH \r", tmp);
mariob 15:fb0f6cbc0ed5 116 s1<<std::hex<<tmp;
mariob 15:fb0f6cbc0ed5 117 s1>>high;
mariob 15:fb0f6cbc0ed5 118 executeWithRes("ATSL \r", tmp);
mariob 15:fb0f6cbc0ed5 119 s2<<std::hex<<tmp;
mariob 15:fb0f6cbc0ed5 120 s2>>low;
mariob 15:fb0f6cbc0ed5 121 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 122 return false;
mariob 15:fb0f6cbc0ed5 123 local = XBeeAddress(low, high);
mariob 15:fb0f6cbc0ed5 124 return true;
mariob 15:fb0f6cbc0ed5 125 }
mariob 15:fb0f6cbc0ed5 126
mariob 15:fb0f6cbc0ed5 127
mariob 15:fb0f6cbc0ed5 128 bool XBeeModule::_setChannel (int channel)
mariob 15:fb0f6cbc0ed5 129 {
mariob 15:fb0f6cbc0ed5 130 char s[10];
mariob 15:fb0f6cbc0ed5 131
mariob 15:fb0f6cbc0ed5 132 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 133 return false;
mariob 15:fb0f6cbc0ed5 134 wait(1);
mariob 15:fb0f6cbc0ed5 135 sprintf(s, "ATCH%d \r", channel);
mariob 15:fb0f6cbc0ed5 136 if (!executeWithOk(s))
mariob 15:fb0f6cbc0ed5 137 return false;
mariob 15:fb0f6cbc0ed5 138 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 139 return false;
mariob 15:fb0f6cbc0ed5 140 return true;
mariob 15:fb0f6cbc0ed5 141 }
mariob 15:fb0f6cbc0ed5 142
mariob 15:fb0f6cbc0ed5 143 int XBeeModule::getChannel ()
mariob 15:fb0f6cbc0ed5 144 {
mariob 15:fb0f6cbc0ed5 145 int channel;
mariob 15:fb0f6cbc0ed5 146 char s[10];
mariob 15:fb0f6cbc0ed5 147
mariob 15:fb0f6cbc0ed5 148 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 149 return -1;
mariob 15:fb0f6cbc0ed5 150 wait(1);
mariob 15:fb0f6cbc0ed5 151 executeWithRes("ATCH \r", s);
mariob 15:fb0f6cbc0ed5 152 channel = atoi(s);
mariob 15:fb0f6cbc0ed5 153 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 154 return -1;
mariob 15:fb0f6cbc0ed5 155 wait(1);
mariob 15:fb0f6cbc0ed5 156 return channel;
mariob 15:fb0f6cbc0ed5 157 }
mariob 15:fb0f6cbc0ed5 158
mariob 15:fb0f6cbc0ed5 159
mariob 15:fb0f6cbc0ed5 160 bool XBeeModule::_setPanID (int panID)
mariob 15:fb0f6cbc0ed5 161 {
mariob 15:fb0f6cbc0ed5 162 char s[10];
mariob 15:fb0f6cbc0ed5 163 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 164 return false;
mariob 15:fb0f6cbc0ed5 165 sprintf(s, "ATID%d \r", panID);
mariob 15:fb0f6cbc0ed5 166 if (!executeWithOk(s))
mariob 15:fb0f6cbc0ed5 167 return false;
mariob 15:fb0f6cbc0ed5 168 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 169 return false;
mariob 15:fb0f6cbc0ed5 170 return true;
mariob 15:fb0f6cbc0ed5 171 }
mariob 15:fb0f6cbc0ed5 172
mariob 15:fb0f6cbc0ed5 173 int XBeeModule::getPanID ()
mariob 15:fb0f6cbc0ed5 174 {
mariob 15:fb0f6cbc0ed5 175 int id;
mariob 15:fb0f6cbc0ed5 176 char s[10];
mariob 15:fb0f6cbc0ed5 177
mariob 15:fb0f6cbc0ed5 178 if (!executeWithOk("+++"))
mariob 15:fb0f6cbc0ed5 179 return -1;
mariob 15:fb0f6cbc0ed5 180 executeWithRes("ATID \r", s);
mariob 15:fb0f6cbc0ed5 181 id = atoi(s);
mariob 15:fb0f6cbc0ed5 182 if (!executeWithOk("ATCN \r"))
mariob 15:fb0f6cbc0ed5 183 return -1;
mariob 15:fb0f6cbc0ed5 184 wait(1);
mariob 15:fb0f6cbc0ed5 185 return id;
mariob 15:fb0f6cbc0ed5 186 }
mariob 15:fb0f6cbc0ed5 187
mariob 15:fb0f6cbc0ed5 188 int XBeeModule::read (char* msg)
mariob 15:fb0f6cbc0ed5 189 {
mariob 15:fb0f6cbc0ed5 190 int i = 0;
mariob 15:fb0f6cbc0ed5 191 while (xbee.readable())
mariob 15:fb0f6cbc0ed5 192 msg[i++] = xbee.getc();
mariob 15:fb0f6cbc0ed5 193 return i;
mariob 15:fb0f6cbc0ed5 194 }
mariob 15:fb0f6cbc0ed5 195
mariob 15:fb0f6cbc0ed5 196 void XBeeModule::write (const char* msg, int n)
mariob 15:fb0f6cbc0ed5 197 {
mariob 15:fb0f6cbc0ed5 198 for (int i=0; i<n; i++) {
mariob 15:fb0f6cbc0ed5 199 while(!xbee.writeable());
mariob 15:fb0f6cbc0ed5 200 xbee.putc(msg[i]);
mariob 15:fb0f6cbc0ed5 201 }
mariob 15:fb0f6cbc0ed5 202 }