Sigfox Communication library, allowing you to use any kind of UART able Sigfox Transmitter
Dependents: TestVirtualisation
Diff: sigfox.cpp
- Revision:
- 0:996eb84c895e
- Child:
- 1:39a0558a3a3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sigfox.cpp Fri Mar 11 08:24:52 2016 +0000 @@ -0,0 +1,200 @@ +#include "mbed.h" +#include "millis.h" +#include "sigfox.h" + +/* sigfox library + * + * Copyright (c) Adrien Chapelet for IoTech.fr + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + /* + This library allows you to use any kind of Sigfox Transmitter, all you have to do is configure pins and baudrate, and check syntax is conform to your datasheet. + */ + +//---------------------------------------------------------------------------------------------// +//Constructors +Sigfox_::Sigfox_() { + Serial device(PIN_RX, PIN_TX); + _lastSend=-1; +} +/*Sigfox_::Sigfox_(PinMode TX, PinMode RX) { + Serial device(p8, p7); +}*/ + +//Functions +uint8_t Sigfox_::_nextReturn() { + Serial device(PIN_RX, PIN_TX); + char fstChar = device.getc(); + while(device.getc() != ';'); + return fstChar; +} + +void Sigfox_::begin () { + Serial device(PIN_RX, PIN_TX); + device.putc((uint8_t)'\0'); + device.putc((uint8_t)';'); + + //while(device.available() < 3); + + device.getc(); //'K' + device.getc(); //'O' + device.getc(); //';' +} + +bool Sigfox_::isReady() { + Serial device(PIN_RX, PIN_TX); + + unsigned long currentTime = millis(); + if(currentTime >= _lastSend && (currentTime - _lastSend) <= 600000) { + return false; + } + // Time is ok, ask the modem's status + device.putc((uint8_t)'\0'); + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + device.putc('\r'); + //device.putc((uint8_t)';'); + + //return _nextReturn() == OK; + return true; +/* + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + + uint8_t response[8] = {0}; + uint8_t i = 0; + //while(!device.available()); + while(device.peek() != ';') { + response[i] = device.read(); + while(!device.available()); + ++i; + } + response[0]=device.getc(); //'K' + response[1]=device.getc(); //'O' + response[2]=device.getc(); //';' + if ((response[0]=='O') && (response[1]=='K')) + return OK;*/ +} + +bool Sigfox_::send(const void* data, uint8_t len) { + uint8_t* bytes = (uint8_t*)data; + _lastSend = millis(); + + Serial device(PIN_RX, PIN_TX); + device.putc((uint8_t)'\0'); + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + device.putc((uint8_t)'$'); + device.putc((uint8_t)'S'); + device.putc((uint8_t)'F'); + device.putc((uint8_t)'='); + + for(uint8_t i = 0; i < len; ++i) { + device.putc(bytes[i]); + } + device.putc('\r'); + + uint8_t ok = _nextReturn(); + if(ok == OK) { + _nextReturn(); //SENT + return true; + } + return false; +} + +unsigned long Sigfox_::getID() { + unsigned long id = 0; + Serial device(PIN_RX, PIN_TX); + device.putc((uint8_t)'\0'); + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + device.putc((uint8_t)'$'); + device.putc((uint8_t)'I'); + device.putc((uint8_t)'='); + device.putc((uint8_t)'1'); + device.putc((uint8_t)'0'); + device.putc('\r'); + + uint8_t response[8] = {0}; + uint8_t i = 0; + for (i = 0; i<7;++i) { + response[i] = device.getc(); + ++i; + } + /*uint8_t response[8] = {0}; + while(device.getc() != '\0') { + response[i] = device.getc(); + while(!device.readable()); + ++i; + }*/ + device.getc(); //';' + for(uint8_t j = 0; j < i; ++j) { + id += response[j] << ((i-3-j) * 8); + } + return id; +} + +unsigned long Sigfox_::getPAC() { + unsigned long id = 0; + Serial device(PIN_RX, PIN_TX); + device.putc((uint8_t)'\0'); + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + device.putc((uint8_t)'$'); + device.putc((uint8_t)'I'); + device.putc((uint8_t)'='); + device.putc((uint8_t)'1'); + device.putc((uint8_t)'1'); + device.putc('\r'); + + uint8_t response[8] = {0}; + uint8_t i = 0; + for (i = 0; i<7;++i) { + response[i] = device.getc(); + ++i; + } + + for(uint8_t j = 0; j < i; ++j) { + id += response[j] << ((i-3-j) * 16); + } + return true; +} + +bool Sigfox_::setPowerMode(uint8_t power) { + Serial device(PIN_RX, PIN_TX); + device.putc((uint8_t)'\0'); + device.putc((uint8_t)'A'); + device.putc((uint8_t)'T'); + device.putc((uint8_t)'$'); + device.putc((uint8_t)'I'); + device.putc((uint8_t)'='); + device.putc(power); + device.putc('\r'); + + //return _nextReturn() == OK; + return 1; +} + +//------------------------------------------------------------------------------------------------// +//Destructors + +/*sigfox::~sf() { +}*/ \ No newline at end of file