BERG Cloud / BERGCloud

Dependents:   LittleCounter-Example

Committer:
nickludlam
Date:
Tue Nov 12 19:19:03 2013 +0000
Revision:
3:02b6b91ae6de
Parent:
0:b4ccb530b9eb
Child:
4:5a04c00b5b6f
Fixed issue with initialisation of std::string when unpacking raw data

Who changed what in which revision?

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