SAKURA Internet IoT Alpha Communication Module Library for mbed

Dependents:   SakuraAlpha_SPI SakuraAlpha_I2C

Committer:
sakurafan
Date:
Fri Jun 03 09:15:25 2016 +0000
Revision:
1:b31d9bb6e65f
Parent:
0:38f4d6047886
bug fix: i2c receive

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakurafan 0:38f4d6047886 1 /* SAKURA Internet IoT Alpha Communication Module Library for mbed
sakurafan 0:38f4d6047886 2 *
sakurafan 0:38f4d6047886 3 * Copyright (c) SAKURA Internet Inc.
sakurafan 0:38f4d6047886 4 * The MIT License (MIT)
sakurafan 0:38f4d6047886 5 * https://github.com/sakura-internet/SakuraAlphaArduino
sakurafan 0:38f4d6047886 6 *
sakurafan 0:38f4d6047886 7 * https://iot.sakura.ad.jp/
sakurafan 0:38f4d6047886 8 *
sakurafan 0:38f4d6047886 9 * Porting to mbed by sakurafan. 2016
sakurafan 0:38f4d6047886 10 */
sakurafan 0:38f4d6047886 11
sakurafan 0:38f4d6047886 12 #include "mbed.h"
sakurafan 0:38f4d6047886 13 #include "SakuraAlpha.h"
sakurafan 0:38f4d6047886 14
sakurafan 0:38f4d6047886 15 void SakuraAlpha::writeChannel(uint8_t ch, int32_t data) {
sakurafan 0:38f4d6047886 16 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 17
sakurafan 0:38f4d6047886 18 begin();
sakurafan 0:38f4d6047886 19
sakurafan 0:38f4d6047886 20 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 21 sendByte(ch);
sakurafan 0:38f4d6047886 22 sendByte(TYPE_INT32);
sakurafan 0:38f4d6047886 23
sakurafan 0:38f4d6047886 24 for ( int i = 0 ; i < 4 ; i++ ) {
sakurafan 0:38f4d6047886 25 sendByte(p[i]);
sakurafan 0:38f4d6047886 26 }
sakurafan 0:38f4d6047886 27
sakurafan 0:38f4d6047886 28 finishSending();
sakurafan 0:38f4d6047886 29 end();
sakurafan 0:38f4d6047886 30 }
sakurafan 0:38f4d6047886 31
sakurafan 0:38f4d6047886 32 void SakuraAlpha::writeChannel(uint8_t ch, uint32_t data) {
sakurafan 0:38f4d6047886 33 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 34
sakurafan 0:38f4d6047886 35 begin();
sakurafan 0:38f4d6047886 36
sakurafan 0:38f4d6047886 37 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 38 sendByte(ch);
sakurafan 0:38f4d6047886 39 sendByte(TYPE_UINT32);
sakurafan 0:38f4d6047886 40
sakurafan 0:38f4d6047886 41 for ( int i = 0 ; i < 4 ; i++ ) {
sakurafan 0:38f4d6047886 42 sendByte(p[i]);
sakurafan 0:38f4d6047886 43 }
sakurafan 0:38f4d6047886 44
sakurafan 0:38f4d6047886 45 finishSending();
sakurafan 0:38f4d6047886 46 end();
sakurafan 0:38f4d6047886 47 }
sakurafan 0:38f4d6047886 48
sakurafan 0:38f4d6047886 49 void SakuraAlpha::writeChannel(uint8_t ch, int64_t data) {
sakurafan 0:38f4d6047886 50 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 51
sakurafan 0:38f4d6047886 52 begin();
sakurafan 0:38f4d6047886 53
sakurafan 0:38f4d6047886 54 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 55 sendByte(ch);
sakurafan 0:38f4d6047886 56 sendByte(TYPE_INT64);
sakurafan 0:38f4d6047886 57
sakurafan 0:38f4d6047886 58 for ( int i = 0 ; i < 8 ; i++ ) {
sakurafan 0:38f4d6047886 59 sendByte(p[i]);
sakurafan 0:38f4d6047886 60 }
sakurafan 0:38f4d6047886 61
sakurafan 0:38f4d6047886 62 finishSending();
sakurafan 0:38f4d6047886 63 end();
sakurafan 0:38f4d6047886 64 }
sakurafan 0:38f4d6047886 65
sakurafan 0:38f4d6047886 66 void SakuraAlpha::writeChannel(uint8_t ch, uint64_t data) {
sakurafan 0:38f4d6047886 67 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 68
sakurafan 0:38f4d6047886 69 begin();
sakurafan 0:38f4d6047886 70
sakurafan 0:38f4d6047886 71 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 72 sendByte(ch);
sakurafan 0:38f4d6047886 73 sendByte(TYPE_UINT64);
sakurafan 0:38f4d6047886 74
sakurafan 0:38f4d6047886 75 for ( int i = 0 ; i < 8 ; i++ ) {
sakurafan 0:38f4d6047886 76 sendByte(p[i]);
sakurafan 0:38f4d6047886 77 }
sakurafan 0:38f4d6047886 78
sakurafan 0:38f4d6047886 79 finishSending();
sakurafan 0:38f4d6047886 80 end();
sakurafan 0:38f4d6047886 81 }
sakurafan 0:38f4d6047886 82
sakurafan 0:38f4d6047886 83 void SakuraAlpha::writeChannel(uint8_t ch, float data) {
sakurafan 0:38f4d6047886 84 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 85
sakurafan 0:38f4d6047886 86 begin();
sakurafan 0:38f4d6047886 87
sakurafan 0:38f4d6047886 88 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 89 sendByte(ch);
sakurafan 0:38f4d6047886 90 sendByte(TYPE_FLOAT);
sakurafan 0:38f4d6047886 91
sakurafan 0:38f4d6047886 92 for ( int i = 0 ; i < 4 ; i++ ) {
sakurafan 0:38f4d6047886 93 sendByte(p[i]);
sakurafan 0:38f4d6047886 94 }
sakurafan 0:38f4d6047886 95
sakurafan 0:38f4d6047886 96 finishSending();
sakurafan 0:38f4d6047886 97 end();
sakurafan 0:38f4d6047886 98 }
sakurafan 0:38f4d6047886 99
sakurafan 0:38f4d6047886 100 void SakuraAlpha::writeChannel(uint8_t ch, double data) {
sakurafan 0:38f4d6047886 101 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 102
sakurafan 0:38f4d6047886 103 begin();
sakurafan 0:38f4d6047886 104
sakurafan 0:38f4d6047886 105 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 106 sendByte(ch);
sakurafan 0:38f4d6047886 107 sendByte(TYPE_DOUBLE);
sakurafan 0:38f4d6047886 108
sakurafan 0:38f4d6047886 109 for ( int i = 0 ; i < 8 ; i++ ) {
sakurafan 0:38f4d6047886 110 sendByte(p[i]);
sakurafan 0:38f4d6047886 111 }
sakurafan 0:38f4d6047886 112
sakurafan 0:38f4d6047886 113 finishSending();
sakurafan 0:38f4d6047886 114 end();
sakurafan 0:38f4d6047886 115 }
sakurafan 0:38f4d6047886 116
sakurafan 0:38f4d6047886 117 void SakuraAlpha::writeChannel(uint8_t ch, uint8_t *data) {
sakurafan 0:38f4d6047886 118 uint8_t *p = (uint8_t *)data;
sakurafan 0:38f4d6047886 119
sakurafan 0:38f4d6047886 120 begin();
sakurafan 0:38f4d6047886 121
sakurafan 0:38f4d6047886 122 sendByte(CMD_WRITE);
sakurafan 0:38f4d6047886 123 sendByte(ch);
sakurafan 0:38f4d6047886 124 sendByte(TYPE_BYTES);
sakurafan 0:38f4d6047886 125
sakurafan 0:38f4d6047886 126 for ( int i = 0 ; i < 8 ; i++ ) {
sakurafan 0:38f4d6047886 127 sendByte(p[i]);
sakurafan 0:38f4d6047886 128 }
sakurafan 0:38f4d6047886 129
sakurafan 0:38f4d6047886 130 finishSending();
sakurafan 0:38f4d6047886 131 end();
sakurafan 0:38f4d6047886 132 }
sakurafan 0:38f4d6047886 133
sakurafan 0:38f4d6047886 134 void SakuraAlpha::readChannel(uint8_t ch, char *type, uint8_t *data) {
sakurafan 0:38f4d6047886 135 uint8_t *p = (uint8_t *)&data;
sakurafan 0:38f4d6047886 136
sakurafan 0:38f4d6047886 137 begin();
sakurafan 0:38f4d6047886 138
sakurafan 0:38f4d6047886 139 sendByte(CMD_READ);
sakurafan 0:38f4d6047886 140 sendByte(ch);
sakurafan 0:38f4d6047886 141 finishSending();
sakurafan 0:38f4d6047886 142
sakurafan 0:38f4d6047886 143 startReceiving(9);
sakurafan 0:38f4d6047886 144 *(uint8_t *)type = receiveByte();
sakurafan 0:38f4d6047886 145
sakurafan 0:38f4d6047886 146 for ( int i = 0 ; i < 8 ; i++ ) {
sakurafan 0:38f4d6047886 147 data[i] = receiveByte();
sakurafan 0:38f4d6047886 148 }
sakurafan 0:38f4d6047886 149 finishReceiving();
sakurafan 0:38f4d6047886 150
sakurafan 0:38f4d6047886 151 end();
sakurafan 0:38f4d6047886 152
sakurafan 0:38f4d6047886 153 }
sakurafan 0:38f4d6047886 154
sakurafan 0:38f4d6047886 155 void SakuraAlpha::transmit(uint8_t mode){
sakurafan 0:38f4d6047886 156 begin();
sakurafan 0:38f4d6047886 157 sendByte(CMD_TRANSMIT);
sakurafan 0:38f4d6047886 158 sendByte(mode);
sakurafan 0:38f4d6047886 159
sakurafan 0:38f4d6047886 160 finishSending();
sakurafan 0:38f4d6047886 161 end();
sakurafan 0:38f4d6047886 162 }
sakurafan 0:38f4d6047886 163
sakurafan 0:38f4d6047886 164 uint8_t SakuraAlpha::getTxChannelStatus(uint8_t ch){
sakurafan 0:38f4d6047886 165 uint8_t status=0xff;
sakurafan 0:38f4d6047886 166
sakurafan 0:38f4d6047886 167 begin();
sakurafan 0:38f4d6047886 168
sakurafan 0:38f4d6047886 169 sendByte(CMD_TXCH_STATUS);
sakurafan 0:38f4d6047886 170 sendByte(ch);
sakurafan 0:38f4d6047886 171 finishSending();
sakurafan 0:38f4d6047886 172
sakurafan 0:38f4d6047886 173 startReceiving(1);
sakurafan 0:38f4d6047886 174 status = receiveByte();
sakurafan 0:38f4d6047886 175 finishReceiving();
sakurafan 0:38f4d6047886 176
sakurafan 0:38f4d6047886 177 end();
sakurafan 0:38f4d6047886 178 return status;
sakurafan 0:38f4d6047886 179 }
sakurafan 0:38f4d6047886 180
sakurafan 0:38f4d6047886 181 uint8_t SakuraAlpha::getRxChannelStatus(uint8_t ch){
sakurafan 0:38f4d6047886 182 uint8_t status=0xff;
sakurafan 0:38f4d6047886 183
sakurafan 0:38f4d6047886 184 begin();
sakurafan 0:38f4d6047886 185
sakurafan 0:38f4d6047886 186 sendByte(CMD_RXCH_STATUS);
sakurafan 0:38f4d6047886 187 sendByte(ch);
sakurafan 0:38f4d6047886 188 finishSending();
sakurafan 0:38f4d6047886 189
sakurafan 0:38f4d6047886 190 startReceiving(1);
sakurafan 0:38f4d6047886 191 status = receiveByte();
sakurafan 0:38f4d6047886 192 finishReceiving();
sakurafan 0:38f4d6047886 193
sakurafan 0:38f4d6047886 194 end();
sakurafan 0:38f4d6047886 195 return status;
sakurafan 0:38f4d6047886 196 }
sakurafan 0:38f4d6047886 197
sakurafan 0:38f4d6047886 198 int SakuraAlpha::getUpdatedChannels(uint8_t *buff, uint8_t len){
sakurafan 0:38f4d6047886 199 int num = 0;
sakurafan 0:38f4d6047886 200
sakurafan 0:38f4d6047886 201 begin();
sakurafan 0:38f4d6047886 202 sendByte(CMD_UPDATED);
sakurafan 0:38f4d6047886 203 finishSending();
sakurafan 0:38f4d6047886 204
sakurafan 0:38f4d6047886 205 wait_ms(100);
sakurafan 0:38f4d6047886 206
sakurafan 0:38f4d6047886 207 startReceiving(len+1);
sakurafan 0:38f4d6047886 208 num = receiveByte();
sakurafan 0:38f4d6047886 209
sakurafan 0:38f4d6047886 210 for( int i=0; i<min(num,len); i++){
sakurafan 0:38f4d6047886 211 buff[i]=receiveByte();
sakurafan 0:38f4d6047886 212 }
sakurafan 0:38f4d6047886 213
sakurafan 0:38f4d6047886 214 finishReceiving();
sakurafan 0:38f4d6047886 215
sakurafan 0:38f4d6047886 216 end();
sakurafan 0:38f4d6047886 217 return num;
sakurafan 0:38f4d6047886 218 }
sakurafan 0:38f4d6047886 219
sakurafan 0:38f4d6047886 220 int SakuraAlpha::getUntransmittedChannels(uint8_t *buff, uint8_t len){
sakurafan 0:38f4d6047886 221 int num = 0;
sakurafan 0:38f4d6047886 222
sakurafan 0:38f4d6047886 223 begin();
sakurafan 0:38f4d6047886 224 sendByte(CMD_UNTRANSMITTED);
sakurafan 0:38f4d6047886 225 finishSending();
sakurafan 0:38f4d6047886 226
sakurafan 0:38f4d6047886 227 wait_ms(100);
sakurafan 0:38f4d6047886 228
sakurafan 0:38f4d6047886 229 startReceiving(len+1);
sakurafan 0:38f4d6047886 230 num = receiveByte();
sakurafan 0:38f4d6047886 231
sakurafan 0:38f4d6047886 232 for( int i=0; i<min(num,len); i++){
sakurafan 0:38f4d6047886 233 buff[i]=receiveByte();
sakurafan 0:38f4d6047886 234 }
sakurafan 0:38f4d6047886 235
sakurafan 0:38f4d6047886 236 finishReceiving();
sakurafan 0:38f4d6047886 237
sakurafan 0:38f4d6047886 238 end();
sakurafan 0:38f4d6047886 239 return num;
sakurafan 0:38f4d6047886 240 }
sakurafan 0:38f4d6047886 241
sakurafan 0:38f4d6047886 242 uint8_t SakuraAlpha::getNetworkStatus(){
sakurafan 0:38f4d6047886 243 uint8_t status=0x00;
sakurafan 0:38f4d6047886 244
sakurafan 0:38f4d6047886 245 begin();
sakurafan 0:38f4d6047886 246
sakurafan 0:38f4d6047886 247 sendByte(CMD_NETWORKSTATUS);
sakurafan 0:38f4d6047886 248 finishSending();
sakurafan 0:38f4d6047886 249
sakurafan 0:38f4d6047886 250 startReceiving(1);
sakurafan 0:38f4d6047886 251 status = receiveByte();
sakurafan 0:38f4d6047886 252 finishReceiving();
sakurafan 0:38f4d6047886 253
sakurafan 0:38f4d6047886 254 end();
sakurafan 0:38f4d6047886 255 return status;
sakurafan 0:38f4d6047886 256 }
sakurafan 0:38f4d6047886 257
sakurafan 0:38f4d6047886 258
sakurafan 0:38f4d6047886 259 void SakuraAlphaI2C::begin(){
sakurafan 0:38f4d6047886 260 _i2c.start();
sakurafan 0:38f4d6047886 261 _i2c.write(SAKURACC_SLAVE_ADDR);
sakurafan 0:38f4d6047886 262 }
sakurafan 0:38f4d6047886 263 void SakuraAlphaI2C::end(){
sakurafan 0:38f4d6047886 264
sakurafan 0:38f4d6047886 265 }
sakurafan 0:38f4d6047886 266
sakurafan 0:38f4d6047886 267 void SakuraAlphaI2C::sendByte(uint8_t data){
sakurafan 0:38f4d6047886 268 _i2c.write(data);
sakurafan 0:38f4d6047886 269 }
sakurafan 0:38f4d6047886 270 void SakuraAlphaI2C::finishSending(){
sakurafan 0:38f4d6047886 271 _i2c.stop();
sakurafan 0:38f4d6047886 272 }
sakurafan 0:38f4d6047886 273
sakurafan 0:38f4d6047886 274 void SakuraAlphaI2C::startReceiving(uint16_t num_recieve){
sakurafan 1:b31d9bb6e65f 275 _num_recieve = num_recieve;
sakurafan 0:38f4d6047886 276 _i2c.start();
sakurafan 0:38f4d6047886 277 _i2c.write(SAKURACC_SLAVE_ADDR | 1);
sakurafan 0:38f4d6047886 278 }
sakurafan 0:38f4d6047886 279 uint8_t SakuraAlphaI2C::receiveByte(){
sakurafan 1:b31d9bb6e65f 280 if (_num_recieve <= 0) return 0;
sakurafan 1:b31d9bb6e65f 281 _num_recieve --;
sakurafan 1:b31d9bb6e65f 282 return _i2c.read(_num_recieve > 0 ? 1 : 0);
sakurafan 0:38f4d6047886 283 }
sakurafan 0:38f4d6047886 284 void SakuraAlphaI2C::finishReceiving(){
sakurafan 1:b31d9bb6e65f 285 while (_num_recieve > 0) {
sakurafan 1:b31d9bb6e65f 286 _num_recieve --;
sakurafan 1:b31d9bb6e65f 287 _i2c.read(_num_recieve > 0 ? 1 : 0);
sakurafan 1:b31d9bb6e65f 288 }
sakurafan 0:38f4d6047886 289 _i2c.stop();
sakurafan 0:38f4d6047886 290 }
sakurafan 0:38f4d6047886 291
sakurafan 0:38f4d6047886 292 SakuraAlphaI2C::SakuraAlphaI2C (I2C &i2c) : _i2c(i2c) {
sakurafan 0:38f4d6047886 293 }
sakurafan 0:38f4d6047886 294 SakuraAlphaI2C::SakuraAlphaI2C (PinName sda, PinName scl) : _i2c(sda, scl) {
sakurafan 0:38f4d6047886 295 }
sakurafan 0:38f4d6047886 296
sakurafan 0:38f4d6047886 297
sakurafan 0:38f4d6047886 298 void SakuraAlphaSPI::begin(){
sakurafan 0:38f4d6047886 299 _cs = 0;
sakurafan 0:38f4d6047886 300 }
sakurafan 0:38f4d6047886 301 void SakuraAlphaSPI::end(){
sakurafan 0:38f4d6047886 302 _cs = 1;
sakurafan 0:38f4d6047886 303 wait_ms(10);
sakurafan 0:38f4d6047886 304 }
sakurafan 0:38f4d6047886 305
sakurafan 0:38f4d6047886 306 void SakuraAlphaSPI::sendByte(uint8_t data){
sakurafan 0:38f4d6047886 307 wait_ms(10);
sakurafan 0:38f4d6047886 308 _spi.write(data);
sakurafan 0:38f4d6047886 309 }
sakurafan 0:38f4d6047886 310 void SakuraAlphaSPI::finishSending(){
sakurafan 0:38f4d6047886 311 }
sakurafan 0:38f4d6047886 312
sakurafan 0:38f4d6047886 313 void SakuraAlphaSPI::startReceiving(uint16_t num_recieve){
sakurafan 0:38f4d6047886 314 }
sakurafan 0:38f4d6047886 315 uint8_t SakuraAlphaSPI::receiveByte(){
sakurafan 0:38f4d6047886 316 wait_ms(10);
sakurafan 0:38f4d6047886 317 return _spi.write(0);
sakurafan 0:38f4d6047886 318 }
sakurafan 0:38f4d6047886 319 void SakuraAlphaSPI::finishReceiving(){
sakurafan 0:38f4d6047886 320 }
sakurafan 0:38f4d6047886 321
sakurafan 0:38f4d6047886 322 SakuraAlphaSPI::SakuraAlphaSPI(SPI &spi, PinName cs) : _spi(spi), _cs(cs) {
sakurafan 0:38f4d6047886 323 _cs = 1;
sakurafan 0:38f4d6047886 324 }
sakurafan 0:38f4d6047886 325 SakuraAlphaSPI::SakuraAlphaSPI(PinName mosi, PinName miso, PinName sck, PinName cs) : _spi(mosi, miso, sck), _cs(cs) {
sakurafan 0:38f4d6047886 326 _cs = 1;
sakurafan 0:38f4d6047886 327 }