AT command firmware for MultiTech Dot devices.

Fork of mDot_AT_firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdNetworkAddress.cpp Source File

CmdNetworkAddress.cpp

00001 #include "CmdNetworkAddress.h"
00002 #include <algorithm>
00003 
00004 CmdNetworkAddress::CmdNetworkAddress() :
00005 #if MTS_CMD_TERM_VERBOSE
00006     Command("Network Address", "AT+NA", "Network address (devAddr in LoraMac) (4 bytes)", "(hex:4) or (1-8),(hex:4)")
00007 #else
00008     Command("AT+NA")
00009 #endif
00010 {
00011     _queryable = true;
00012 }
00013 
00014 uint32_t CmdNetworkAddress::action(const std::vector<std::string>& args)
00015 {
00016     std::vector<uint8_t> addr;
00017     int args_size = args.size();
00018     if (args_size == 1)
00019     {
00020         addr = CommandTerminal::Dot()->getNetworkAddress();
00021         CommandTerminal::Serial()->writef("%02x:%02x:%02x:%02x\r\n", addr[0], addr[1], addr[2], addr[3]);
00022     }
00023     else if (args_size <= 3)
00024     {
00025         int index = 0;
00026         int arg_index = 1;
00027         if (args_size == 3) {
00028             arg_index = 2;
00029             index = args[1][0] - '0';
00030         }
00031 
00032         if ((args_size == 3) && (args[2][0] == '?')) {
00033             uint32_t addr_int = CommandTerminal::Dot()->getMulticastAddress(index-1);
00034             CommandTerminal::Serial()->writef("%02x:%02x:%02x:%02x\r\n", addr_int >> 24, (addr_int >> 16) & 0xff, (addr_int >> 8) & 0xff, (addr_int) & 0xff);
00035         } else {
00036             readByteArray(args[arg_index], addr, 4);
00037 
00038             if (arg_index == 2 && CommandTerminal::Dot()->setMulticastAddress(index-1, addr[0] << 24 | addr[1] << 16 | addr[2] << 8 | addr[3]) == mDot::MDOT_OK) {
00039 
00040 #if MTS_CMD_TERM_VERBOSE
00041                 CommandTerminal::Serial()->writef("Set Multicast Address: ");
00042                 CommandTerminal::Serial()->writef("%02x:%02x:%02x:%02x\r\n", addr[0], addr[1], addr[2], addr[3]);
00043 #endif
00044             } else if (arg_index == 1 && CommandTerminal::Dot()->setNetworkAddress(addr) == mDot::MDOT_OK) {
00045 
00046 #if MTS_CMD_TERM_VERBOSE
00047                 CommandTerminal::Serial()->writef("Set Network Address: ");
00048                 CommandTerminal::Serial()->writef("%02x:%02x:%02x:%02x\r\n", addr[0], addr[1], addr[2], addr[3]);
00049 #endif
00050             } else {
00051                 return 1;
00052             }
00053         }
00054     }
00055 
00056     return 0;
00057 }
00058 
00059 bool CmdNetworkAddress::verify(const std::vector<std::string>& args)
00060 {
00061     if (args.size() == 1) {
00062         return true;
00063     } else if (args.size() == 2) {
00064 
00065         if (!isHexString(args[1], 4))
00066         {
00067 #if MTS_CMD_TERM_VERBOSE
00068             CommandTerminal::setErrorMessage("Invalid address, expects (hex:4)");
00069 #endif
00070             return false;
00071         }
00072 
00073         return true;
00074     } else if (args.size() == 3) {
00075         if (args[1].size() == 1 && (args[1][0] < '1' || args[1][0] > '8')) {
00076 #if MTS_CMD_TERM_VERBOSE
00077             CommandTerminal::setErrorMessage("Invalid index, expects 1-8");
00078 #endif
00079             return false;
00080         } else if (!(args[2].size() == 1 && args[2][0] == '?') && !isHexString(args[2], 4)) {
00081 #if MTS_CMD_TERM_VERBOSE
00082             CommandTerminal::setErrorMessage("Invalid address, expects (hex:4)");
00083 #endif
00084             return false;
00085         }
00086 
00087         return true;
00088     }
00089 
00090 #if MTS_CMD_TERM_VERBOSE
00091     CommandTerminal::setErrorMessage("Invalid arguments");
00092 #endif
00093     return false;
00094 }