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:
Thu Sep 06 10:37:03 2012 +0000
Revision:
0:cc7218c5e5f7
Child:
4:dbbf82c966c2
ssWi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mariob 0:cc7218c5e5f7 1 /*
mariob 0:cc7218c5e5f7 2 //#include "ssWi.hpp"
mariob 0:cc7218c5e5f7 3 #include "ssWiSocket.hpp"
mariob 0:cc7218c5e5f7 4 #include "ssWiPort.hpp"
mariob 0:cc7218c5e5f7 5
mariob 0:cc7218c5e5f7 6
mariob 0:cc7218c5e5f7 7 ssWiChannel* ssWiSocket::channel = NULL;
mariob 0:cc7218c5e5f7 8 Mutex ssWiSocket::chMutex = Mutex();
mariob 0:cc7218c5e5f7 9
mariob 0:cc7218c5e5f7 10 static Thread* ssWiSocket::sender = NULL;
mariob 0:cc7218c5e5f7 11 static Thread* ssWiSocket::receiver = NULL;
mariob 0:cc7218c5e5f7 12
mariob 0:cc7218c5e5f7 13
mariob 0:cc7218c5e5f7 14 static bool ssWiSocket::setChannel (ssWiChannel* c)
mariob 0:cc7218c5e5f7 15 {
mariob 0:cc7218c5e5f7 16 if (sender!=NULL)
mariob 0:cc7218c5e5f7 17 delete sender;
mariob 0:cc7218c5e5f7 18 if (receiver!=NULL)
mariob 0:cc7218c5e5f7 19 delete receiver;
mariob 0:cc7218c5e5f7 20 chMutex.lock();
mariob 0:cc7218c5e5f7 21 channel = c;
mariob 0:cc7218c5e5f7 22 sender = new Thread(threadSender);
mariob 0:cc7218c5e5f7 23 receiver = new Thread(threadReceiver);
mariob 0:cc7218c5e5f7 24 chMutex.unlock();
mariob 0:cc7218c5e5f7 25 }
mariob 0:cc7218c5e5f7 26
mariob 0:cc7218c5e5f7 27 ssWiSocket::ssWiSocket(PortID port)
mariob 0:cc7218c5e5f7 28 {
mariob 0:cc7218c5e5f7 29 this->port = port;
mariob 0:cc7218c5e5f7 30 setPort (port);
mariob 0:cc7218c5e5f7 31 }
mariob 0:cc7218c5e5f7 32
mariob 0:cc7218c5e5f7 33 bool ssWiSocket::valid ()
mariob 0:cc7218c5e5f7 34 {
mariob 0:cc7218c5e5f7 35 return isActive(port);
mariob 0:cc7218c5e5f7 36 }
mariob 0:cc7218c5e5f7 37
mariob 0:cc7218c5e5f7 38 bool ssWiSocket::close()
mariob 0:cc7218c5e5f7 39 {
mariob 0:cc7218c5e5f7 40 return unsetPort(port);
mariob 0:cc7218c5e5f7 41 }
mariob 0:cc7218c5e5f7 42
mariob 0:cc7218c5e5f7 43 bool ssWiSocket::read (PortValue &value)
mariob 0:cc7218c5e5f7 44 {
mariob 0:cc7218c5e5f7 45 return readPort (port, value);
mariob 0:cc7218c5e5f7 46 }
mariob 0:cc7218c5e5f7 47
mariob 0:cc7218c5e5f7 48 bool ssWiSocket::write (PortValue value)
mariob 0:cc7218c5e5f7 49 {
mariob 0:cc7218c5e5f7 50 return writePort (port, value);
mariob 0:cc7218c5e5f7 51 }
mariob 0:cc7218c5e5f7 52
mariob 0:cc7218c5e5f7 53
mariob 0:cc7218c5e5f7 54 #include "ssWi.hpp"
mariob 0:cc7218c5e5f7 55
mariob 0:cc7218c5e5f7 56
mariob 0:cc7218c5e5f7 57
mariob 0:cc7218c5e5f7 58
mariob 0:cc7218c5e5f7 59 #include "mbed.h"
mariob 0:cc7218c5e5f7 60 #include "rtos.h"
mariob 0:cc7218c5e5f7 61
mariob 0:cc7218c5e5f7 62
mariob 0:cc7218c5e5f7 63
mariob 0:cc7218c5e5f7 64
mariob 0:cc7218c5e5f7 65 bool setPort (PortID port)
mariob 0:cc7218c5e5f7 66 {
mariob 0:cc7218c5e5f7 67 if (ports.find(port)!=ports.end())
mariob 0:cc7218c5e5f7 68 return false;
mariob 0:cc7218c5e5f7 69 ports[port];
mariob 0:cc7218c5e5f7 70 return true;
mariob 0:cc7218c5e5f7 71 }
mariob 0:cc7218c5e5f7 72
mariob 0:cc7218c5e5f7 73 bool isActive (PortID port)
mariob 0:cc7218c5e5f7 74 {
mariob 0:cc7218c5e5f7 75 return ports.find(port)!=ports.end();
mariob 0:cc7218c5e5f7 76 }
mariob 0:cc7218c5e5f7 77
mariob 0:cc7218c5e5f7 78 bool unsetPort (PortID port)
mariob 0:cc7218c5e5f7 79 {
mariob 0:cc7218c5e5f7 80 if (ports.find(port)==ports.end())
mariob 0:cc7218c5e5f7 81 return false;
mariob 0:cc7218c5e5f7 82 ports.erase(port);
mariob 0:cc7218c5e5f7 83 return true;
mariob 0:cc7218c5e5f7 84 }
mariob 0:cc7218c5e5f7 85
mariob 0:cc7218c5e5f7 86 bool readPort (PortID port, PortValue &value)
mariob 0:cc7218c5e5f7 87 {
mariob 0:cc7218c5e5f7 88 if (ports.find(port)==ports.end())
mariob 0:cc7218c5e5f7 89 return false;
mariob 0:cc7218c5e5f7 90 value = ports[port].getRXValue();
mariob 0:cc7218c5e5f7 91 return true;
mariob 0:cc7218c5e5f7 92 }
mariob 0:cc7218c5e5f7 93
mariob 0:cc7218c5e5f7 94 bool writePort (PortID port, PortValue value)
mariob 0:cc7218c5e5f7 95 {
mariob 0:cc7218c5e5f7 96 if (ports.find(port)==ports.end())
mariob 0:cc7218c5e5f7 97 return false;
mariob 0:cc7218c5e5f7 98 ports[port].setTXValue(value);
mariob 0:cc7218c5e5f7 99 return true;
mariob 0:cc7218c5e5f7 100 }
mariob 0:cc7218c5e5f7 101
mariob 0:cc7218c5e5f7 102
mariob 0:cc7218c5e5f7 103 #define INTERNAL_BUFFER_SIZE 100
mariob 0:cc7218c5e5f7 104
mariob 0:cc7218c5e5f7 105 void threadSender (void const* arg)
mariob 0:cc7218c5e5f7 106 {
mariob 0:cc7218c5e5f7 107 char buffer[INTERNAL_BUFFER_SIZE];
mariob 0:cc7218c5e5f7 108 while(true) {
mariob 0:cc7218c5e5f7 109 int n = 0;
mariob 0:cc7218c5e5f7 110 std::map<int, ssWiPort>::iterator it = ports.begin();
mariob 0:cc7218c5e5f7 111
mariob 0:cc7218c5e5f7 112 buffer[n++] = 255;
mariob 0:cc7218c5e5f7 113 // && n<(INTERNAL_BUFFER_SIZE-sizeof(PortID)-sizeof(PortValue)-1)
mariob 0:cc7218c5e5f7 114 for (; it!=ports.end(); it++) {
mariob 0:cc7218c5e5f7 115 if ((*it).second.isModified()) {
mariob 0:cc7218c5e5f7 116 buffer[n++] = (*it).first;
mariob 0:cc7218c5e5f7 117 PortValue tmp = (*it).second.getTXValue();
mariob 0:cc7218c5e5f7 118 for (int i=0; i<sizeof(PortValue); i++) {
mariob 0:cc7218c5e5f7 119 buffer[n++] = tmp & 0x00ff;
mariob 0:cc7218c5e5f7 120 tmp = tmp>>8;
mariob 0:cc7218c5e5f7 121 }
mariob 0:cc7218c5e5f7 122 }
mariob 0:cc7218c5e5f7 123 }
mariob 0:cc7218c5e5f7 124 //buffer[n++] = '\r';
mariob 0:cc7218c5e5f7 125 if (n>1) {
mariob 0:cc7218c5e5f7 126 mutexChannel.lock();
mariob 0:cc7218c5e5f7 127 channel->write(buffer, n);
mariob 0:cc7218c5e5f7 128 mutexChannel.unlock();
mariob 0:cc7218c5e5f7 129 }
mariob 0:cc7218c5e5f7 130 //printf("Totale byte: %d\n\r", n);
mariob 0:cc7218c5e5f7 131 //for (int i=0; i<n; i++)
mariob 0:cc7218c5e5f7 132 // printf("%d ", buffer[i]);
mariob 0:cc7218c5e5f7 133 //printf("\n\r");
mariob 0:cc7218c5e5f7 134 Thread::wait(200);
mariob 0:cc7218c5e5f7 135 }
mariob 0:cc7218c5e5f7 136 }
mariob 0:cc7218c5e5f7 137
mariob 0:cc7218c5e5f7 138 void threadReceiver (void const* arg)
mariob 0:cc7218c5e5f7 139 {
mariob 0:cc7218c5e5f7 140 char buffer[INTERNAL_BUFFER_SIZE];
mariob 0:cc7218c5e5f7 141 while(true) {
mariob 0:cc7218c5e5f7 142 mutexChannel.lock();
mariob 0:cc7218c5e5f7 143 int n = channel->read(buffer);
mariob 0:cc7218c5e5f7 144 //printf("Byte letti: %d\n\r", n);
mariob 0:cc7218c5e5f7 145 //for (int i=0; i<n; i++)
mariob 0:cc7218c5e5f7 146 // printf("%d ", buffer[i]);
mariob 0:cc7218c5e5f7 147 //printf("\n\r");
mariob 0:cc7218c5e5f7 148 mutexChannel.unlock();
mariob 0:cc7218c5e5f7 149
mariob 0:cc7218c5e5f7 150 int i = 0;
mariob 0:cc7218c5e5f7 151 for (; buffer[i]!=255 && i<n; i++);
mariob 0:cc7218c5e5f7 152 i++;
mariob 0:cc7218c5e5f7 153
mariob 0:cc7218c5e5f7 154 for (; i<n;) {
mariob 0:cc7218c5e5f7 155 PortID port = buffer[i++];
mariob 0:cc7218c5e5f7 156 PortValue value = 0;
mariob 0:cc7218c5e5f7 157 for (int j=sizeof(PortValue)-1; j>=0; j--) {
mariob 0:cc7218c5e5f7 158 value = value<<8;
mariob 0:cc7218c5e5f7 159 value += buffer[i+j];
mariob 0:cc7218c5e5f7 160 }
mariob 0:cc7218c5e5f7 161 i += sizeof(PortValue);
mariob 0:cc7218c5e5f7 162 if (ports.find(port)!=ports.end())
mariob 0:cc7218c5e5f7 163 ports[port].setRXValue(value);
mariob 0:cc7218c5e5f7 164 }
mariob 0:cc7218c5e5f7 165 Thread::wait(100);
mariob 0:cc7218c5e5f7 166 }
mariob 0:cc7218c5e5f7 167 }
mariob 0:cc7218c5e5f7 168 */