Stripped-down version of GDP Node Core

Dependencies:   EthernetInterface MbedJSONValue SDFileSystem mbed-rtos mbed snail

Committer:
Trumple
Date:
Mon May 18 16:16:15 2015 +0000
Revision:
0:bb17d0395fb8
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Trumple 0:bb17d0395fb8 1 #include "sensorinterface.h"
Trumple 0:bb17d0395fb8 2
Trumple 0:bb17d0395fb8 3 sensorinterface::sensorinterface() : i2c(p28,p27), readyLine(p29)
Trumple 0:bb17d0395fb8 4 {
Trumple 0:bb17d0395fb8 5 readyLine.fall(this, &sensorinterface::readySet);
Trumple 0:bb17d0395fb8 6 readyLine.rise(this, &sensorinterface::readyUnset);
Trumple 0:bb17d0395fb8 7
Trumple 0:bb17d0395fb8 8 this->ready = false;
Trumple 0:bb17d0395fb8 9
Trumple 0:bb17d0395fb8 10 char buffer[255];
Trumple 0:bb17d0395fb8 11
Trumple 0:bb17d0395fb8 12 #ifdef DEBUG
Trumple 0:bb17d0395fb8 13 printf("[SIF] Scanning for devices...\r\n");
Trumple 0:bb17d0395fb8 14 #endif
Trumple 0:bb17d0395fb8 15
Trumple 0:bb17d0395fb8 16 for (char i=1; i<=254; i=i+2)
Trumple 0:bb17d0395fb8 17 {
Trumple 0:bb17d0395fb8 18 //last bit determines read/write not actual address
Trumple 0:bb17d0395fb8 19 if (this->i2c.read(i, &buffer[0], 1) ==0)
Trumple 0:bb17d0395fb8 20 {
Trumple 0:bb17d0395fb8 21 //returns 0 if ack i.e. a device is found
Trumple 0:bb17d0395fb8 22 sensor newSensor;
Trumple 0:bb17d0395fb8 23 newSensor = findType(newSensor, i);
Trumple 0:bb17d0395fb8 24 this->sensors[i] = newSensor;
Trumple 0:bb17d0395fb8 25 #ifdef DEBUG
Trumple 0:bb17d0395fb8 26 printf("[SIF] Device found at 0x%.2X, device count: %i\r\n", i, this->sensors.size());
Trumple 0:bb17d0395fb8 27 #endif
Trumple 0:bb17d0395fb8 28 }
Trumple 0:bb17d0395fb8 29 }
Trumple 0:bb17d0395fb8 30 }
Trumple 0:bb17d0395fb8 31
Trumple 0:bb17d0395fb8 32 bool sensorinterface::isDataWaiting()
Trumple 0:bb17d0395fb8 33 {
Trumple 0:bb17d0395fb8 34 return this->ready;
Trumple 0:bb17d0395fb8 35 }
Trumple 0:bb17d0395fb8 36
Trumple 0:bb17d0395fb8 37 void sensorinterface::requestData()
Trumple 0:bb17d0395fb8 38 {
Trumple 0:bb17d0395fb8 39 if (sensors.size() > 0)
Trumple 0:bb17d0395fb8 40 {
Trumple 0:bb17d0395fb8 41 currentSensor = sensors.begin();
Trumple 0:bb17d0395fb8 42
Trumple 0:bb17d0395fb8 43 #ifdef DEBUG
Trumple 0:bb17d0395fb8 44 printf("[SIF] Beginning device query chain from 0x%.2X\r\n", currentSensor->first);
Trumple 0:bb17d0395fb8 45 #endif
Trumple 0:bb17d0395fb8 46
Trumple 0:bb17d0395fb8 47 sendRequest(currentSensor->first);
Trumple 0:bb17d0395fb8 48 }
Trumple 0:bb17d0395fb8 49 else
Trumple 0:bb17d0395fb8 50 {
Trumple 0:bb17d0395fb8 51 #ifdef DEBUG
Trumple 0:bb17d0395fb8 52 printf("[SIF] Data requested, but no devices present\r\n");
Trumple 0:bb17d0395fb8 53 #endif
Trumple 0:bb17d0395fb8 54 }
Trumple 0:bb17d0395fb8 55 }
Trumple 0:bb17d0395fb8 56
Trumple 0:bb17d0395fb8 57 void sensorinterface::readySet()
Trumple 0:bb17d0395fb8 58 {
Trumple 0:bb17d0395fb8 59 this->ready = true;
Trumple 0:bb17d0395fb8 60 }
Trumple 0:bb17d0395fb8 61
Trumple 0:bb17d0395fb8 62 void sensorinterface::readyUnset()
Trumple 0:bb17d0395fb8 63 {
Trumple 0:bb17d0395fb8 64 this->ready = false;
Trumple 0:bb17d0395fb8 65 }
Trumple 0:bb17d0395fb8 66
Trumple 0:bb17d0395fb8 67 #ifdef DEBUG
Trumple 0:bb17d0395fb8 68 void sensorinterface::error(int e_num)
Trumple 0:bb17d0395fb8 69 {
Trumple 0:bb17d0395fb8 70 printf("[SIF] Error %i\r",e_num);
Trumple 0:bb17d0395fb8 71 }
Trumple 0:bb17d0395fb8 72 #endif
Trumple 0:bb17d0395fb8 73
Trumple 0:bb17d0395fb8 74 int sensorinterface::update()
Trumple 0:bb17d0395fb8 75 {
Trumple 0:bb17d0395fb8 76 char buffer[255];
Trumple 0:bb17d0395fb8 77
Trumple 0:bb17d0395fb8 78 for (char i=1; i<=254; i=i+2)
Trumple 0:bb17d0395fb8 79 {
Trumple 0:bb17d0395fb8 80 //last bit determines read/write not actual address
Trumple 0:bb17d0395fb8 81
Trumple 0:bb17d0395fb8 82 bool connected = (this->i2c.read(i, &buffer[0], 1) == 0);
Trumple 0:bb17d0395fb8 83 bool registered = (this->sensors.count(i) > 0);
Trumple 0:bb17d0395fb8 84
Trumple 0:bb17d0395fb8 85 if (connected)
Trumple 0:bb17d0395fb8 86 {
Trumple 0:bb17d0395fb8 87 if (!registered)
Trumple 0:bb17d0395fb8 88 {
Trumple 0:bb17d0395fb8 89 //device added
Trumple 0:bb17d0395fb8 90 #ifdef DEBUG
Trumple 0:bb17d0395fb8 91 printf("[SIF] Device added at %i\r\n", i);
Trumple 0:bb17d0395fb8 92 #endif
Trumple 0:bb17d0395fb8 93 sensor newSensor;
Trumple 0:bb17d0395fb8 94 newSensor = findType(newSensor, i);
Trumple 0:bb17d0395fb8 95 this->sensors[i] = newSensor;
Trumple 0:bb17d0395fb8 96 }
Trumple 0:bb17d0395fb8 97 }
Trumple 0:bb17d0395fb8 98 else if (registered)
Trumple 0:bb17d0395fb8 99 {
Trumple 0:bb17d0395fb8 100 if (!connected)
Trumple 0:bb17d0395fb8 101 {
Trumple 0:bb17d0395fb8 102 //device removed
Trumple 0:bb17d0395fb8 103 #ifdef DEBUG
Trumple 0:bb17d0395fb8 104 printf("[SIF] Device removed at %i\r\n", i);
Trumple 0:bb17d0395fb8 105 #endif
Trumple 0:bb17d0395fb8 106 this->sensors.erase(i);
Trumple 0:bb17d0395fb8 107 }
Trumple 0:bb17d0395fb8 108 }
Trumple 0:bb17d0395fb8 109 }
Trumple 0:bb17d0395fb8 110
Trumple 0:bb17d0395fb8 111 return 1;
Trumple 0:bb17d0395fb8 112 }
Trumple 0:bb17d0395fb8 113
Trumple 0:bb17d0395fb8 114
Trumple 0:bb17d0395fb8 115 sensor& sensorinterface::findType(sensor& s, int address)
Trumple 0:bb17d0395fb8 116 {
Trumple 0:bb17d0395fb8 117 char response[I2C_TYPE_PACKET_SIZE];
Trumple 0:bb17d0395fb8 118 char cmd[1] = {I2C_TYPE_HEADER};
Trumple 0:bb17d0395fb8 119
Trumple 0:bb17d0395fb8 120 this->i2c.write(address, cmd, 1);
Trumple 0:bb17d0395fb8 121 int type_timeout = 10;
Trumple 0:bb17d0395fb8 122 i2c.stop();
Trumple 0:bb17d0395fb8 123 i2c.start();
Trumple 0:bb17d0395fb8 124 while( (this->i2c.read(address, response, I2C_TYPE_PACKET_SIZE)) && (type_timeout) )
Trumple 0:bb17d0395fb8 125 {
Trumple 0:bb17d0395fb8 126 --type_timeout;
Trumple 0:bb17d0395fb8 127 if (type_timeout == 2)
Trumple 0:bb17d0395fb8 128 {
Trumple 0:bb17d0395fb8 129 #ifdef DEBUG
Trumple 0:bb17d0395fb8 130 error(3);
Trumple 0:bb17d0395fb8 131 #endif
Trumple 0:bb17d0395fb8 132 return s;
Trumple 0:bb17d0395fb8 133 }
Trumple 0:bb17d0395fb8 134 }
Trumple 0:bb17d0395fb8 135
Trumple 0:bb17d0395fb8 136 if (response[0] != I2C_TYPE_HEADER)
Trumple 0:bb17d0395fb8 137 {
Trumple 0:bb17d0395fb8 138 #ifdef DEBUG
Trumple 0:bb17d0395fb8 139 error(1);
Trumple 0:bb17d0395fb8 140 #endif
Trumple 0:bb17d0395fb8 141 }
Trumple 0:bb17d0395fb8 142
Trumple 0:bb17d0395fb8 143 s.type = response[1];
Trumple 0:bb17d0395fb8 144 s.packetSize = response[2];
Trumple 0:bb17d0395fb8 145 s.readingSize = response[3];
Trumple 0:bb17d0395fb8 146 return s;
Trumple 0:bb17d0395fb8 147 }
Trumple 0:bb17d0395fb8 148
Trumple 0:bb17d0395fb8 149 int sensorinterface::sendRequest(char address)
Trumple 0:bb17d0395fb8 150 {
Trumple 0:bb17d0395fb8 151 char cmd[1] = {I2C_REQUEST_HEADER};
Trumple 0:bb17d0395fb8 152
Trumple 0:bb17d0395fb8 153 this->i2c.write(address, cmd, 1);
Trumple 0:bb17d0395fb8 154
Trumple 0:bb17d0395fb8 155 return 1;
Trumple 0:bb17d0395fb8 156 }
Trumple 0:bb17d0395fb8 157
Trumple 0:bb17d0395fb8 158 d_reply sensorinterface::readData()
Trumple 0:bb17d0395fb8 159 {
Trumple 0:bb17d0395fb8 160 #ifdef DEBUG
Trumple 0:bb17d0395fb8 161 printf("[SIF] Reading data from current device (0x%.2X)\r\n", currentSensor->first);
Trumple 0:bb17d0395fb8 162 #endif
Trumple 0:bb17d0395fb8 163 char address = currentSensor->first;
Trumple 0:bb17d0395fb8 164 char cmd[1] = {I2C_DATA_HEADER};
Trumple 0:bb17d0395fb8 165 char bufSize = currentSensor->second.packetSize + 2;
Trumple 0:bb17d0395fb8 166 char buffer[bufSize];
Trumple 0:bb17d0395fb8 167 this->i2c.write(address, cmd, 1);
Trumple 0:bb17d0395fb8 168 wait(0.01);
Trumple 0:bb17d0395fb8 169 this->i2c.read(address, buffer, bufSize);
Trumple 0:bb17d0395fb8 170
Trumple 0:bb17d0395fb8 171 d_reply reply;
Trumple 0:bb17d0395fb8 172
Trumple 0:bb17d0395fb8 173 reply.type = currentSensor->second.type;
Trumple 0:bb17d0395fb8 174
Trumple 0:bb17d0395fb8 175 for (int i = 2; i < bufSize; i += currentSensor->second.readingSize)
Trumple 0:bb17d0395fb8 176 {
Trumple 0:bb17d0395fb8 177 int r = 0;
Trumple 0:bb17d0395fb8 178 for (int j = 0; j < currentSensor->second.readingSize; j++)
Trumple 0:bb17d0395fb8 179 {
Trumple 0:bb17d0395fb8 180 r = r << 8;
Trumple 0:bb17d0395fb8 181 r += buffer[i+j];
Trumple 0:bb17d0395fb8 182 }
Trumple 0:bb17d0395fb8 183 reply.readings.push_back(r);
Trumple 0:bb17d0395fb8 184 }
Trumple 0:bb17d0395fb8 185
Trumple 0:bb17d0395fb8 186 if (buffer[0] != I2C_DATA_HEADER)
Trumple 0:bb17d0395fb8 187 {
Trumple 0:bb17d0395fb8 188 //if it doesn't send the correct header bit, something has gone wrong
Trumple 0:bb17d0395fb8 189 #ifdef DEBUG
Trumple 0:bb17d0395fb8 190 error(0);
Trumple 0:bb17d0395fb8 191 #endif
Trumple 0:bb17d0395fb8 192 }
Trumple 0:bb17d0395fb8 193
Trumple 0:bb17d0395fb8 194 if (currentSensor != sensors.end() && sensors.size() > 1 )
Trumple 0:bb17d0395fb8 195 {
Trumple 0:bb17d0395fb8 196 #ifdef DEBUG
Trumple 0:bb17d0395fb8 197 printf("[SIF] Continuing chain of devices, just read from device: 0x%.2X\r\n", currentSensor->first);
Trumple 0:bb17d0395fb8 198 #endif
Trumple 0:bb17d0395fb8 199 currentSensor++;
Trumple 0:bb17d0395fb8 200 sendRequest(currentSensor->first);
Trumple 0:bb17d0395fb8 201 }
Trumple 0:bb17d0395fb8 202 #ifdef DEBUG
Trumple 0:bb17d0395fb8 203 else
Trumple 0:bb17d0395fb8 204 {
Trumple 0:bb17d0395fb8 205 printf("[SIF] All devices have been read from, end of chain\r\n");
Trumple 0:bb17d0395fb8 206 }
Trumple 0:bb17d0395fb8 207 #endif
Trumple 0:bb17d0395fb8 208
Trumple 0:bb17d0395fb8 209 return reply;
Trumple 0:bb17d0395fb8 210 }