Mario Bambagini / ssWi

Dependents:   rover_car rover_pc supervisor watering_unit ... more

Committer:
mariob
Date:
Fri Apr 17 15:19:40 2020 +0000
Revision:
20:36931ee9af85
Parent:
15:fb0f6cbc0ed5
Child:
24:80345e511574
few fixes, moving to new os

Who changed what in which revision?

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