with 36errors

Dependencies:   MTS-Serial libxDot-dev-mbed5-deprecated

Fork of Dot-AT-Firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdTxChannel.cpp Source File

CmdTxChannel.cpp

00001 #include "CmdTxChannel.h"
00002 #include "ChannelPlan.h"
00003 
00004 CmdTxChannel::CmdTxChannel()
00005 : Command("Tx Channels", "AT+TXCH", "List Tx channel frequencies for sub-band", "<INDEX>,<FREQUENCY>,<DR_RANGE>") {
00006     _queryable = true;
00007 }
00008 
00009 uint32_t CmdTxChannel::action(std::vector<std::string> args) {
00010     if (args.size() == 1) {
00011 
00012         std::vector<uint32_t> channels = CommandTerminal::Dot()->getChannels();
00013         std::vector<uint8_t> ranges = CommandTerminal::Dot()->getChannelRanges();
00014         std::vector<uint16_t> mask = CommandTerminal::Dot()->getChannelMask();
00015 
00016         CommandTerminal::Serial()->writef("Index\tFrequency  DR Max Min  On\r\n");
00017 
00018         if (lora::ChannelPlan::IsPlanDynamic(CommandTerminal::Dot()->getFrequencyBand())) {
00019             for (int8_t i = 0; i < 16; i++) {
00020                 if (channels[i] != 0)
00021                     CommandTerminal::Serial()->writef("  %d\t%d      %X   %X    %d\r\n", i, channels[i], ranges[i] >> 4, ranges[i] & 0xF, (mask[0] & (0x1 << i)) ? 1 : 0);
00022                 else
00023                     CommandTerminal::Serial()->writef("  %d\t    %d          %X   %X    0\r\n", i, channels[i], ranges[i] >> 4, ranges[i] & 0xF);
00024             }
00025 
00026             if (channels[16] != 0)
00027                 CommandTerminal::Serial()->writef("  R2\t%d      %X   %X\r\n", channels[16], ranges[16] >> 4, ranges[16] & 0xF);
00028             else
00029                 CommandTerminal::Serial()->writef("  R2\t    %d          %X   %X\r\n", channels[16], ranges[16], ranges[168]);
00030 
00031         } else {
00032             if (CommandTerminal::Dot()->getFrequencySubBand() > 0) {
00033                 uint8_t offset = (CommandTerminal::Dot()->getFrequencySubBand() - 1) * 8;
00034 
00035                 for (int i = 0; i < 8; i++) {
00036                     if ((CommandTerminal::Dot()->getFrequencySubBand() % 2) == 1) {
00037                         CommandTerminal::Serial()->writef("  %d\t%d      %X   %X    %d\r\n", i, channels[i], ranges[i] >> 4, ranges[i] & 0xF, (mask[(offset + i)/16] & (0x0001 << i)) ? 1 : 0);
00038                     } else {
00039                         CommandTerminal::Serial()->writef("  %d\t%d      %X   %X    %d\r\n", i, channels[i], ranges[i] >> 4, ranges[i] & 0xF, (mask[(offset + i)/16] & (0x0001 << (i + 8))) ? 1 : 0);
00040                     }
00041                 }
00042 
00043                 CommandTerminal::Serial()->writef("  U\t%d      %X   %X    %d\r\n", channels[8], ranges[8] >> 4, ranges[8] & 0xF, (mask[4] & (0x0001 << (CommandTerminal::Dot()->getFrequencySubBand() - 1))) ? 1 : 0);
00044                 CommandTerminal::Serial()->writef("  R2\t%d      %X   %X\r\n", channels[9], ranges[9], ranges[9]);
00045             } else {
00046                 for (size_t i = 0; i < channels.size() - 1; i++) {
00047                     CommandTerminal::Serial()->writef("  %d\t%d      %X   %X    %d\r\n", i, channels[i], ranges[i] >> 4, ranges[i] & 0xF, (mask[i/16] & (0x0001 << (i%16))) ? 1 : 0);
00048                 }
00049                 uint8_t last = channels.size() - 1;
00050                 CommandTerminal::Serial()->writef("  R2\t%d      %X   %X\r\n", channels[last], ranges[last], ranges[last]);
00051             }
00052         }
00053     }
00054 
00055     if (args.size() == 4) {
00056         int index;
00057         int frequency;
00058         int datarateRange;
00059 
00060         sscanf(args[1].c_str(), "%d", &index);
00061         sscanf(args[2].c_str(), "%d", &frequency);
00062         sscanf(args[3].c_str(), "%02x", &datarateRange);
00063 
00064         if (CommandTerminal::Dot()->addChannel(index, frequency, datarateRange) != mDot::MDOT_OK) {
00065             CommandTerminal::setErrorMessage("Failed to add channel");
00066             return 1;
00067         }
00068     }
00069 
00070     return 0;
00071 }
00072 
00073 bool CmdTxChannel::verify(std::vector<std::string> args) {
00074     if (args.size() == 1)
00075         return true;
00076 
00077     if (args.size() == 4) {
00078 
00079         int index;
00080         int frequency;
00081         int datarateRange;
00082 
00083         sscanf(args[1].c_str(), "%d", &index);
00084         sscanf(args[2].c_str(), "%d", &frequency);
00085         sscanf(args[3].c_str(), "%02x", &datarateRange);
00086 
00087         if (lora::ChannelPlan::IsPlanDynamic(CommandTerminal::Dot()->getFrequencyBand())) {
00088             if (frequency != 0 && (frequency < int(CommandTerminal::Dot()->getMinFrequency()) || frequency > int(CommandTerminal::Dot()->getMaxFrequency()))) {
00089                 char tmp[256];
00090                 sprintf(tmp, "Invalid frequency, expects (0,%lu-%lu)", CommandTerminal::Dot()->getMinFrequency(), CommandTerminal::Dot()->getMaxFrequency());
00091                 CommandTerminal::setErrorMessage(tmp);
00092                 return false;
00093             }
00094         } else {
00095             CommandTerminal::setErrorMessage("Fixed channel plans cannot be changed, use AT+FSB or AT+CHM to limit");
00096             return false;
00097         }
00098 
00099         return true;
00100     } else {
00101         CommandTerminal::setErrorMessage("Invalid arguments");
00102         return false;
00103     }
00104 
00105 }