BERG Cloud / BERGCloud

Dependents:   LittleCounter-Example

Committer:
nickludlam
Date:
Wed Apr 16 14:38:12 2014 +0000
Revision:
6:79100379d4b4
Parent:
4:5a04c00b5b6f
Updated to support the Berg V2 API. Please see http://bergcloud.com/devcenter/api/v2/device-v2 for more details.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nickludlam 4:5a04c00b5b6f 1 /*
nickludlam 4:5a04c00b5b6f 2
nickludlam 4:5a04c00b5b6f 3 BERGCloud library for mbed
nickludlam 4:5a04c00b5b6f 4
nickludlam 4:5a04c00b5b6f 5 Copyright (c) 2013 BERG Cloud Ltd. http://bergcloud.com/
nickludlam 4:5a04c00b5b6f 6
nickludlam 4:5a04c00b5b6f 7 Permission is hereby granted, free of charge, to any person obtaining a copy
nickludlam 4:5a04c00b5b6f 8 of this software and associated documentation files (the "Software"), to deal
nickludlam 4:5a04c00b5b6f 9 in the Software without restriction, including without limitation the rights
nickludlam 4:5a04c00b5b6f 10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
nickludlam 4:5a04c00b5b6f 11 copies of the Software, and to permit persons to whom the Software is
nickludlam 4:5a04c00b5b6f 12 furnished to do so, subject to the following conditions:
nickludlam 4:5a04c00b5b6f 13
nickludlam 4:5a04c00b5b6f 14 The above copyright notice and this permission notice shall be included in
nickludlam 4:5a04c00b5b6f 15 all copies or substantial portions of the Software.
nickludlam 4:5a04c00b5b6f 16
nickludlam 4:5a04c00b5b6f 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
nickludlam 4:5a04c00b5b6f 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
nickludlam 4:5a04c00b5b6f 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
nickludlam 4:5a04c00b5b6f 20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
nickludlam 4:5a04c00b5b6f 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
nickludlam 4:5a04c00b5b6f 22 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
nickludlam 4:5a04c00b5b6f 23 THE SOFTWARE.
nickludlam 4:5a04c00b5b6f 24
nickludlam 4:5a04c00b5b6f 25 */
nickludlam 4:5a04c00b5b6f 26
nickludlam 4:5a04c00b5b6f 27 #include <cstdint>
nickludlam 4:5a04c00b5b6f 28 #include <cstddef>
nickludlam 4:5a04c00b5b6f 29 #include <cstdarg>
nickludlam 4:5a04c00b5b6f 30
nickludlam 4:5a04c00b5b6f 31 #include "BERGCloudMbed.h"
nickludlam 4:5a04c00b5b6f 32
nickludlam 4:5a04c00b5b6f 33 uint16_t BERGCloudMbed::SPITransaction(uint8_t *dataOut, uint8_t *dataIn, uint16_t dataSize, bool finalCS)
nickludlam 4:5a04c00b5b6f 34 {
nickludlam 4:5a04c00b5b6f 35 uint16_t i;
nickludlam 4:5a04c00b5b6f 36
nickludlam 4:5a04c00b5b6f 37 if ( (dataOut == NULL) || (dataIn == NULL) || (spi == NULL) )
nickludlam 4:5a04c00b5b6f 38 {
nickludlam 4:5a04c00b5b6f 39 _LOG("Invalid parameter (CBERGCloud::SPITransaction)\r\n");
nickludlam 4:5a04c00b5b6f 40 return 0;
nickludlam 4:5a04c00b5b6f 41 }
nickludlam 4:5a04c00b5b6f 42
nickludlam 4:5a04c00b5b6f 43 nSSELPin->write(0);
nickludlam 4:5a04c00b5b6f 44
nickludlam 4:5a04c00b5b6f 45 for (i = 0; i < dataSize; i++)
nickludlam 4:5a04c00b5b6f 46 {
nickludlam 4:5a04c00b5b6f 47 *dataIn++ = spi->write(*dataOut++);
nickludlam 4:5a04c00b5b6f 48 }
nickludlam 4:5a04c00b5b6f 49
nickludlam 4:5a04c00b5b6f 50 if (finalCS)
nickludlam 4:5a04c00b5b6f 51 {
nickludlam 4:5a04c00b5b6f 52 nSSELPin->write(1);
nickludlam 4:5a04c00b5b6f 53 }
nickludlam 4:5a04c00b5b6f 54
nickludlam 4:5a04c00b5b6f 55 return dataSize;
nickludlam 4:5a04c00b5b6f 56 }
nickludlam 4:5a04c00b5b6f 57
nickludlam 4:5a04c00b5b6f 58 void BERGCloudMbed::timerReset(void)
nickludlam 4:5a04c00b5b6f 59 {
nickludlam 4:5a04c00b5b6f 60 timer->reset();
nickludlam 4:5a04c00b5b6f 61 }
nickludlam 4:5a04c00b5b6f 62
nickludlam 4:5a04c00b5b6f 63 uint32_t BERGCloudMbed::timerRead_mS(void)
nickludlam 4:5a04c00b5b6f 64 {
nickludlam 4:5a04c00b5b6f 65 return timer->read_ms();
nickludlam 4:5a04c00b5b6f 66 }
nickludlam 4:5a04c00b5b6f 67
nickludlam 4:5a04c00b5b6f 68 void BERGCloudMbed::begin(PinName _MOSIPin, PinName _MISOPin, PinName _SCLKPin, PinName _nSSELPin)
nickludlam 4:5a04c00b5b6f 69 {
nickludlam 4:5a04c00b5b6f 70 /* Call base class method */
nickludlam 4:5a04c00b5b6f 71 BERGCloudBase::begin();
nickludlam 4:5a04c00b5b6f 72
nickludlam 4:5a04c00b5b6f 73 /* Configure nSSEL control pin */
nickludlam 4:5a04c00b5b6f 74 nSSELPin = new DigitalOut(_nSSELPin);
nickludlam 4:5a04c00b5b6f 75
nickludlam 4:5a04c00b5b6f 76 if (nSSELPin == NULL)
nickludlam 4:5a04c00b5b6f 77 {
nickludlam 4:5a04c00b5b6f 78 _LOG("nSSELPin is NULL (CBERGCloud::begin)\r\n");
nickludlam 4:5a04c00b5b6f 79 return;
nickludlam 4:5a04c00b5b6f 80 }
nickludlam 4:5a04c00b5b6f 81
nickludlam 4:5a04c00b5b6f 82 nSSELPin->write(1);
nickludlam 4:5a04c00b5b6f 83
nickludlam 4:5a04c00b5b6f 84 /* Configure SPI */
nickludlam 4:5a04c00b5b6f 85 spi = new SPI(_MOSIPin, _MISOPin, _SCLKPin);
nickludlam 4:5a04c00b5b6f 86
nickludlam 4:5a04c00b5b6f 87 if (spi == NULL)
nickludlam 4:5a04c00b5b6f 88 {
nickludlam 4:5a04c00b5b6f 89 _LOG("spi is NULL (CBERGCloud::begin)\r\n");
nickludlam 4:5a04c00b5b6f 90 delete nSSELPin;
nickludlam 4:5a04c00b5b6f 91 return;
nickludlam 4:5a04c00b5b6f 92 }
nickludlam 4:5a04c00b5b6f 93
nickludlam 4:5a04c00b5b6f 94 spi->format(8, 0); /* 8-bits; SPI MODE 0 */
nickludlam 4:5a04c00b5b6f 95 spi->frequency(4000000); /* 4MHz */
nickludlam 4:5a04c00b5b6f 96
nickludlam 4:5a04c00b5b6f 97 /* Configure timer */
nickludlam 4:5a04c00b5b6f 98 timer = new Timer();
nickludlam 4:5a04c00b5b6f 99
nickludlam 4:5a04c00b5b6f 100 if (timer == NULL)
nickludlam 4:5a04c00b5b6f 101 {
nickludlam 4:5a04c00b5b6f 102 _LOG("timer is NULL (CBERGCloud::begin)\r\n");
nickludlam 4:5a04c00b5b6f 103 delete nSSELPin;
nickludlam 4:5a04c00b5b6f 104 delete spi;
nickludlam 4:5a04c00b5b6f 105 return;
nickludlam 4:5a04c00b5b6f 106 }
nickludlam 4:5a04c00b5b6f 107
nickludlam 4:5a04c00b5b6f 108 timer->start();
nickludlam 4:5a04c00b5b6f 109 }
nickludlam 4:5a04c00b5b6f 110
nickludlam 4:5a04c00b5b6f 111 void BERGCloudMbed::end()
nickludlam 4:5a04c00b5b6f 112 {
nickludlam 4:5a04c00b5b6f 113 if (nSSELPin != NULL)
nickludlam 4:5a04c00b5b6f 114 {
nickludlam 4:5a04c00b5b6f 115 delete nSSELPin;
nickludlam 4:5a04c00b5b6f 116 }
nickludlam 4:5a04c00b5b6f 117
nickludlam 4:5a04c00b5b6f 118 if (spi != NULL)
nickludlam 4:5a04c00b5b6f 119 {
nickludlam 4:5a04c00b5b6f 120 delete spi;
nickludlam 4:5a04c00b5b6f 121 }
nickludlam 4:5a04c00b5b6f 122
nickludlam 4:5a04c00b5b6f 123 if (timer != NULL)
nickludlam 4:5a04c00b5b6f 124 {
nickludlam 4:5a04c00b5b6f 125 delete timer;
nickludlam 4:5a04c00b5b6f 126 }
nickludlam 4:5a04c00b5b6f 127
nickludlam 4:5a04c00b5b6f 128 /* Call base class method */
nickludlam 4:5a04c00b5b6f 129 BERGCloudBase::end();
nickludlam 4:5a04c00b5b6f 130 }
nickludlam 4:5a04c00b5b6f 131
nickludlam 4:5a04c00b5b6f 132 bool BERGCloudMbed::display(std::string& s)
nickludlam 4:5a04c00b5b6f 133 {
nickludlam 4:5a04c00b5b6f 134 return display(s.c_str());
nickludlam 4:5a04c00b5b6f 135 }
nickludlam 4:5a04c00b5b6f 136
nickludlam 4:5a04c00b5b6f 137 uint16_t BERGCloudMbed::getHostType(void)
nickludlam 4:5a04c00b5b6f 138 {
nickludlam 4:5a04c00b5b6f 139 return BC_HOST_MBED;
nickludlam 4:5a04c00b5b6f 140 }
nickludlam 4:5a04c00b5b6f 141
nickludlam 4:5a04c00b5b6f 142 #ifdef BERGCLOUD_PACK_UNPACK
nickludlam 4:5a04c00b5b6f 143
nickludlam 4:5a04c00b5b6f 144 bool BERGCloudMessage::pack(std::string& s)
nickludlam 4:5a04c00b5b6f 145 {
nickludlam 4:5a04c00b5b6f 146 return pack(s.c_str());
nickludlam 4:5a04c00b5b6f 147 }
nickludlam 4:5a04c00b5b6f 148
nickludlam 4:5a04c00b5b6f 149 bool BERGCloudMessage::unpack(std::string& s)
nickludlam 4:5a04c00b5b6f 150 {
nickludlam 4:5a04c00b5b6f 151 uint16_t sizeInBytes;
nickludlam 4:5a04c00b5b6f 152
nickludlam 4:5a04c00b5b6f 153 if (!unpack_raw_header(&sizeInBytes))
nickludlam 4:5a04c00b5b6f 154 {
nickludlam 4:5a04c00b5b6f 155 return false;
nickludlam 4:5a04c00b5b6f 156 }
nickludlam 4:5a04c00b5b6f 157
nickludlam 4:5a04c00b5b6f 158 if (!remaining(sizeInBytes))
nickludlam 4:5a04c00b5b6f 159 {
nickludlam 4:5a04c00b5b6f 160 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 4:5a04c00b5b6f 161 return false;
nickludlam 4:5a04c00b5b6f 162 }
nickludlam 4:5a04c00b5b6f 163
nickludlam 4:5a04c00b5b6f 164 s.clear();
nickludlam 4:5a04c00b5b6f 165 s.append((const char *)&buffer[bytesRead], sizeInBytes);
nickludlam 4:5a04c00b5b6f 166 bytesRead += sizeInBytes;
nickludlam 4:5a04c00b5b6f 167
nickludlam 4:5a04c00b5b6f 168 return true;
nickludlam 4:5a04c00b5b6f 169 }
nickludlam 4:5a04c00b5b6f 170
nickludlam 6:79100379d4b4 171 bool BERGCloudMbed::pollForCommand(BERGCloudMessageBuffer& buffer, string &commandName)
nickludlam 6:79100379d4b4 172 {
nickludlam 6:79100379d4b4 173 bool result = false;
nickludlam 6:79100379d4b4 174 char tmp[31 + 1]; /* +1 for null terminator */
nickludlam 6:79100379d4b4 175
nickludlam 6:79100379d4b4 176 commandName = ""; /* Empty string */
nickludlam 6:79100379d4b4 177 result = pollForCommand(buffer, tmp, sizeof(tmp));
nickludlam 6:79100379d4b4 178
nickludlam 6:79100379d4b4 179 if (result)
nickludlam 6:79100379d4b4 180 {
nickludlam 6:79100379d4b4 181 commandName = string(tmp);
nickludlam 6:79100379d4b4 182 }
nickludlam 6:79100379d4b4 183
nickludlam 6:79100379d4b4 184 return result;
nickludlam 6:79100379d4b4 185 }
nickludlam 6:79100379d4b4 186
nickludlam 4:5a04c00b5b6f 187 #endif // #ifdef BERGCLOUD_PACK_UNPACK
nickludlam 0:b4ccb530b9eb 188