LM005A Lora Module test

Dependents:   LoRaTest OnenetTest

LM005A/LM005A.cpp

Committer:
yao6116601
Date:
2018-04-19
Revision:
0:5b5a1b5f1ae4

File content as of revision 0:5b5a1b5f1ae4:

/* 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);
}