LM005A Lora Module test
Dependents: LoRaTest OnenetTest
Diff: LM005A/LM005A.cpp
- Revision:
- 0:5b5a1b5f1ae4
diff -r 000000000000 -r 5b5a1b5f1ae4 LM005A/LM005A.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LM005A/LM005A.cpp Thu Apr 19 13:15:25 2018 +0000 @@ -0,0 +1,237 @@ +/* LM005A Example + * Copyright (c) 2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LM005A.h" +#include <cstring> + +#define LM005A_DEFAULT_BAUD_RATE 115200 + +LM005A::LM005A(PinName tx, PinName rx, bool debug) + : _serial(tx, rx, LM005A_DEFAULT_BAUD_RATE), + _parser(&_serial), + _fail(false) +{ + _serial.set_baud( LM005A_DEFAULT_BAUD_RATE ); + _parser.debug_on(debug); + _parser.set_delimiter("\r\n"); + _parser.oob("+RXDONE:", callback(this, &LM005A::_packet_handler)); + // _parser.oob("+JOIN:", callback(this, &LM005A::_tx_handler)); + +} + +const char * LM005A::get_firmware_version() +{ + if (!(_parser.send("AT+VERSION?") + && _parser.recv("+VERSION:%s\n",buffer) + && _parser.recv("OK"))) { + return NULL; + } + return buffer; + +} +bool LM005A::init(void) +{ + if (!_parser.recv("Bootup Completed!!!")) + return false; + return true; + } +bool LM005A::reset(void) +{ + if (!(_parser.send("AT+RESET") + && _parser.recv("+RESET") + && _parser.recv("OK") + &&_parser.recv("Bootup Completed!!!"))) { + return false; + } + return true; +} + + int LM005A::set_mode(int mode) + { + int res; + if (!(_parser.send("AT+MODE=%d",mode) + && _parser.recv("+MODE:%d", &res) + && _parser.recv("OK"))) { + return -1; + } + + return res; + } +int LM005A::set_class(int class_mode) +{ + int res; + if (!(_parser.send("AT+CLASS=%d",class_mode) + && _parser.recv("+CLASS:%d", &res) + && _parser.recv("OK"))) { + return -1; + } + + return res; + } +int LM005A::set_band(int gap,int band) +{ + int g,f; + if (!(_parser.send("AT+FIXEDBAND=%d,%d",gap,band) + && _parser.recv("+FIXEDBAND:%d,%d\n",&g ,&f) + && _parser.recv("OK"))) { + return 0; + } + + return f; } +int LM005A::set_power(int power) + { + int res; + if (!(_parser.send("AT+POWER=%d",power) + && _parser.recv("+POWER:%d\n", &res) + && _parser.recv("OK"))) { + return 0; + } + + return res; + } + +bool LM005A::join() +{ + + if (!(_parser.send("AT+JOIN") + && _parser.recv("OK"))) { + return false; + } + return true; +} + + const char *LM005A::getEUI(int type) + { + if (type==0) + { if (!(_parser.send("AT+DEVEUI?") + && _parser.recv("+DEVEUI%s\n", buffer) + && _parser.recv("OK"))) { + return NULL; + } + } + else + { + if (!(_parser.send("AT+APPEUI?") + && _parser.recv("+APPEUI%s\n", buffer) + && _parser.recv("OK"))) { + return NULL; + } + } + return buffer; +} +const char *LM005A::getDeviceAddress(void) +{ + + + if (!(_parser.send("AT+DEVADDR?") + && _parser.recv("+DEVADDR:%s\n", buffer) + && _parser.recv("OK"))) { + return NULL; + } + + return buffer; +} + +unsigned char hex_char(char c) +{ + if ('0' <= c && c <= '9') return (unsigned char)(c - '0'); + if ('A' <= c && c <= 'F') return (unsigned char)(c - 'A' + 10); + if ('a' <= c && c <= 'f') return (unsigned char)(c - 'a' + 10); + // printf("Error Val=%d\n",c); + return 0xFF; +} +bool LM005A::send(int port,int ack, const void *data, uint32_t amount) +{ + + if (!(_parser.send("AT+MSG=%d,%d,%d,%.*s",port,ack,amount,amount,data) + && _parser.recv("+MSG:TXDONE") + && _parser.recv("+MSG:RXDONE") + && _parser.recv("OK"))) + return false; + return true; +} +bool LM005A::sendhex(int port,int ack, const void *data, uint32_t amount) +{ + + if (!(_parser.send("AT+MSGHEX=%d,%d,%d,%.*s",port,ack,amount,amount,data) + && _parser.recv("+MSGHEX:TXDONE") + && _parser.recv("OK"))) + return false; + return true; +} + +void LM005A::_packet_handler() +{ uint32_t amount; +char rBuf[128]; +int i,p; +char val; + if (!_parser.recv("%d,",&amount)) { + return; + } + printf("amount=%d\n",amount); + rCounter=rCounter+amount; + _parser.read(rBuf,amount*3-1); + p=0; + for (i=0;i<amount;i++) + { + val=hex_char( rBuf[p++]); + val=(val<<4)+hex_char( rBuf[p++]); + p++; + rBuffer[rIndex++]=val; + } + rBuffer[rIndex++]=0x00; + // printf("Rec=%0.*s",amount,rBuffer); + + } + + +int32_t LM005A::recv(int id, void *data, uint32_t amount) +{ + rIndex=0; +rCounter=0; + + while (true) { + if (rCounter>0) + { + memcpy(data,rBuffer,rCounter); + break; + + } + if (!_parser.process_oob()) { + return -1; + } + } + return rCounter; +} + + +void LM005A::setTimeout(uint32_t timeout_ms) +{ + _parser.set_timeout(timeout_ms); +} + + + +void LM005A::attach(Callback<void()> func) +{ + _serial.sigio(func); +} + + + + + +