firstTest

Dependencies:   mbed lib_sx9500 SX127x lib_mpl3115a2 lib_mma8451q lib_gps libscpi

Committer:
bongkwan
Date:
Tue Apr 14 02:55:34 2020 +0000
Revision:
1:96123698b488
Parent:
0:1aa6d4a96bf1
first change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bongkwan 0:1aa6d4a96bf1 1 #include <stdio.h>
bongkwan 0:1aa6d4a96bf1 2 #include <stdlib.h>
bongkwan 0:1aa6d4a96bf1 3 #include <string.h>
bongkwan 0:1aa6d4a96bf1 4 #include "scpi/scpi.h"
bongkwan 0:1aa6d4a96bf1 5 #include "scpi-def.h"
bongkwan 0:1aa6d4a96bf1 6
bongkwan 0:1aa6d4a96bf1 7 //#include "sx12xx.h"
bongkwan 0:1aa6d4a96bf1 8 #include "sx127x_lora.h"
bongkwan 0:1aa6d4a96bf1 9 #include "sx127x_fsk.h"
bongkwan 0:1aa6d4a96bf1 10
bongkwan 0:1aa6d4a96bf1 11 /******************************************************************************/
bongkwan 0:1aa6d4a96bf1 12 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 13 #include "gps.h"
bongkwan 0:1aa6d4a96bf1 14 #include "mma8451q.h"
bongkwan 0:1aa6d4a96bf1 15 #include "mpl3115a2.h"
bongkwan 0:1aa6d4a96bf1 16 #include "sx9500.h"
bongkwan 0:1aa6d4a96bf1 17
bongkwan 0:1aa6d4a96bf1 18 #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1
bongkwan 0:1aa6d4a96bf1 19 #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2
bongkwan 0:1aa6d4a96bf1 20 #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx
bongkwan 0:1aa6d4a96bf1 21 #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi
bongkwan 0:1aa6d4a96bf1 22 #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso
bongkwan 0:1aa6d4a96bf1 23 #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk
bongkwan 0:1aa6d4a96bf1 24 #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss
bongkwan 0:1aa6d4a96bf1 25 #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0
bongkwan 0:1aa6d4a96bf1 26 #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1
bongkwan 0:1aa6d4a96bf1 27 #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2
bongkwan 0:1aa6d4a96bf1 28 #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3
bongkwan 0:1aa6d4a96bf1 29 #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4
bongkwan 0:1aa6d4a96bf1 30 #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5
bongkwan 0:1aa6d4a96bf1 31
bongkwan 0:1aa6d4a96bf1 32 SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK);
bongkwan 0:1aa6d4a96bf1 33 // dio0, dio1, nss, spi, rst
bongkwan 0:1aa6d4a96bf1 34 SX127x radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET);
bongkwan 0:1aa6d4a96bf1 35
bongkwan 0:1aa6d4a96bf1 36 DigitalOut rfsw1(RFSW1);
bongkwan 0:1aa6d4a96bf1 37 DigitalOut rfsw2(RFSW2);
bongkwan 0:1aa6d4a96bf1 38
bongkwan 0:1aa6d4a96bf1 39 void rfsw_callback()
bongkwan 0:1aa6d4a96bf1 40 {
bongkwan 0:1aa6d4a96bf1 41 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission
bongkwan 0:1aa6d4a96bf1 42 //if (radio.HF)
bongkwan 0:1aa6d4a96bf1 43 if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
bongkwan 0:1aa6d4a96bf1 44 rfsw2 = 0;
bongkwan 0:1aa6d4a96bf1 45 rfsw1 = 1;
bongkwan 0:1aa6d4a96bf1 46 } else { // RFO to power amp
bongkwan 0:1aa6d4a96bf1 47 rfsw2 = 1;
bongkwan 0:1aa6d4a96bf1 48 rfsw1 = 0;
bongkwan 0:1aa6d4a96bf1 49 }
bongkwan 0:1aa6d4a96bf1 50 //hdr_fem_csd = 1; //debug
bongkwan 0:1aa6d4a96bf1 51 } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception
bongkwan 0:1aa6d4a96bf1 52 //if (radio.HF)
bongkwan 0:1aa6d4a96bf1 53 rfsw2 = 1;
bongkwan 0:1aa6d4a96bf1 54 rfsw1 = 1;
bongkwan 0:1aa6d4a96bf1 55 //hdr_fem_csd = 0; //debug
bongkwan 0:1aa6d4a96bf1 56 } else { // RF switch shutdown
bongkwan 0:1aa6d4a96bf1 57 rfsw2 = 0;
bongkwan 0:1aa6d4a96bf1 58 rfsw1 = 0;
bongkwan 0:1aa6d4a96bf1 59 //hdr_fem_csd = 0; //debug
bongkwan 0:1aa6d4a96bf1 60 }
bongkwan 0:1aa6d4a96bf1 61 }
bongkwan 0:1aa6d4a96bf1 62
bongkwan 1:96123698b488 63
bongkwan 1:96123698b488 64
bongkwan 0:1aa6d4a96bf1 65 DigitalOut pd2(PD_2);
bongkwan 0:1aa6d4a96bf1 66
bongkwan 0:1aa6d4a96bf1 67 DigitalIn dio2_pin(RADIO_DIO_2);
bongkwan 0:1aa6d4a96bf1 68 DigitalIn dio3_pin(RADIO_DIO_3);
bongkwan 0:1aa6d4a96bf1 69 DigitalIn dio4_pin(RADIO_DIO_4);
bongkwan 0:1aa6d4a96bf1 70 DigitalIn dio5_pin(RADIO_DIO_5);
bongkwan 0:1aa6d4a96bf1 71
bongkwan 0:1aa6d4a96bf1 72 AnalogIn *bat;
bongkwan 0:1aa6d4a96bf1 73 #define AIN_VREF 3.3 // stm32 internal refernce
bongkwan 0:1aa6d4a96bf1 74 #define AIN_VBAT_DIV 2 // resistor divider
bongkwan 0:1aa6d4a96bf1 75
bongkwan 0:1aa6d4a96bf1 76 /* gps(tx, rx, en); */
bongkwan 0:1aa6d4a96bf1 77 DigitalOut gps_en(PB_11);
bongkwan 0:1aa6d4a96bf1 78 GPS gps(PB_6, PB_7, PB_11);
bongkwan 0:1aa6d4a96bf1 79 uint32_t gps_coord_cnt;
bongkwan 0:1aa6d4a96bf1 80
bongkwan 0:1aa6d4a96bf1 81 DigitalIn i2c_int_pin(PB_4);
bongkwan 0:1aa6d4a96bf1 82 I2C i2c(I2C_SDA, I2C_SCL);
bongkwan 0:1aa6d4a96bf1 83 MMA8451Q mma8451q(i2c, i2c_int_pin);
bongkwan 0:1aa6d4a96bf1 84 MPL3115A2 mpl3115a2(i2c, i2c_int_pin);
bongkwan 0:1aa6d4a96bf1 85 SX9500 sx9500(i2c, PA_9, PA_10);
bongkwan 0:1aa6d4a96bf1 86
bongkwan 0:1aa6d4a96bf1 87 typedef enum {
bongkwan 0:1aa6d4a96bf1 88 MOTE_NONE = 0,
bongkwan 0:1aa6d4a96bf1 89 MOTE_V2,
bongkwan 0:1aa6d4a96bf1 90 MOTE_V3
bongkwan 0:1aa6d4a96bf1 91 } mote_version_e;
bongkwan 0:1aa6d4a96bf1 92 mote_version_e mote_version = MOTE_NONE;
bongkwan 0:1aa6d4a96bf1 93
bongkwan 0:1aa6d4a96bf1 94 DigitalOut pc_7(PC_7);
bongkwan 0:1aa6d4a96bf1 95 DigitalIn pc_1(PC_1);
bongkwan 0:1aa6d4a96bf1 96 #else // sx1276 shield...
bongkwan 0:1aa6d4a96bf1 97
bongkwan 0:1aa6d4a96bf1 98 SPI spi(D11, D12, D13); // mosi, miso, sclk
bongkwan 0:1aa6d4a96bf1 99 // dio0, dio1, nss, spi, rst
bongkwan 0:1aa6d4a96bf1 100 SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield
bongkwan 0:1aa6d4a96bf1 101
bongkwan 0:1aa6d4a96bf1 102 #ifdef TARGET_LPC11U6X
bongkwan 0:1aa6d4a96bf1 103 DigitalOut rfsw(P0_23);
bongkwan 0:1aa6d4a96bf1 104 #else
bongkwan 0:1aa6d4a96bf1 105 DigitalOut rfsw(A4); // for SX1276 arduino shield
bongkwan 0:1aa6d4a96bf1 106 #endif
bongkwan 0:1aa6d4a96bf1 107
bongkwan 0:1aa6d4a96bf1 108 void rfsw_callback()
bongkwan 0:1aa6d4a96bf1 109 {
bongkwan 0:1aa6d4a96bf1 110 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
bongkwan 0:1aa6d4a96bf1 111 rfsw = 1;
bongkwan 0:1aa6d4a96bf1 112 else
bongkwan 0:1aa6d4a96bf1 113 rfsw = 0;
bongkwan 0:1aa6d4a96bf1 114 }
bongkwan 0:1aa6d4a96bf1 115
bongkwan 0:1aa6d4a96bf1 116 DigitalIn dio2_pin(D4);
bongkwan 0:1aa6d4a96bf1 117 DigitalIn dio3_pin(D5);
bongkwan 0:1aa6d4a96bf1 118 DigitalIn dio4_pin(A3);
bongkwan 0:1aa6d4a96bf1 119 DigitalIn dio5_pin(D9);
bongkwan 0:1aa6d4a96bf1 120
bongkwan 0:1aa6d4a96bf1 121 #endif /* !TARGET_MOTE_L152RC */
bongkwan 0:1aa6d4a96bf1 122
bongkwan 0:1aa6d4a96bf1 123 SX127x_fsk fsk(radio);
bongkwan 0:1aa6d4a96bf1 124 SX127x_lora lora(radio);
bongkwan 0:1aa6d4a96bf1 125
bongkwan 0:1aa6d4a96bf1 126 volatile bool tx_busy = false;
bongkwan 0:1aa6d4a96bf1 127
bongkwan 0:1aa6d4a96bf1 128 bool is_lora()
bongkwan 0:1aa6d4a96bf1 129 {
bongkwan 0:1aa6d4a96bf1 130 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
bongkwan 0:1aa6d4a96bf1 131 return radio.RegOpMode.bits.LongRangeMode;
bongkwan 0:1aa6d4a96bf1 132 }
bongkwan 0:1aa6d4a96bf1 133
bongkwan 0:1aa6d4a96bf1 134 void
bongkwan 0:1aa6d4a96bf1 135 service_radio()
bongkwan 0:1aa6d4a96bf1 136 {
bongkwan 0:1aa6d4a96bf1 137 service_action_e act;
bongkwan 0:1aa6d4a96bf1 138
bongkwan 0:1aa6d4a96bf1 139 if (radio.RegOpMode.bits.LongRangeMode) {
bongkwan 0:1aa6d4a96bf1 140 act = lora.service();
bongkwan 0:1aa6d4a96bf1 141 switch (act) {
bongkwan 0:1aa6d4a96bf1 142 case SERVICE_READ_FIFO:
bongkwan 0:1aa6d4a96bf1 143 //printf("lora SERVICE_READ_FIFO\r\n");
bongkwan 0:1aa6d4a96bf1 144 SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200); // bit 9 for packet received
bongkwan 0:1aa6d4a96bf1 145 break;
bongkwan 0:1aa6d4a96bf1 146 case SERVICE_TX_DONE:
bongkwan 0:1aa6d4a96bf1 147 tx_busy = false;
bongkwan 0:1aa6d4a96bf1 148 break;
bongkwan 0:1aa6d4a96bf1 149 case SERVICE_ERROR:
bongkwan 0:1aa6d4a96bf1 150 case SERVICE_NONE:
bongkwan 0:1aa6d4a96bf1 151 break;
bongkwan 0:1aa6d4a96bf1 152 } // ...switch (act)
bongkwan 0:1aa6d4a96bf1 153 } else {
bongkwan 0:1aa6d4a96bf1 154 /* FSK: */
bongkwan 0:1aa6d4a96bf1 155 act = fsk.service();
bongkwan 0:1aa6d4a96bf1 156 switch (act) {
bongkwan 0:1aa6d4a96bf1 157 case SERVICE_READ_FIFO:
bongkwan 0:1aa6d4a96bf1 158 SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200); // bit 9 for packet received
bongkwan 0:1aa6d4a96bf1 159 break;
bongkwan 0:1aa6d4a96bf1 160 case SERVICE_TX_DONE:
bongkwan 0:1aa6d4a96bf1 161 tx_busy = false;
bongkwan 0:1aa6d4a96bf1 162 break;
bongkwan 0:1aa6d4a96bf1 163 case SERVICE_ERROR:
bongkwan 0:1aa6d4a96bf1 164 case SERVICE_NONE:
bongkwan 0:1aa6d4a96bf1 165 break;
bongkwan 0:1aa6d4a96bf1 166 } // ...switch (act)
bongkwan 0:1aa6d4a96bf1 167 }
bongkwan 0:1aa6d4a96bf1 168
bongkwan 0:1aa6d4a96bf1 169 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 170 gps.service();
bongkwan 0:1aa6d4a96bf1 171 if (gps.LatitudeBinary != 0) {
bongkwan 0:1aa6d4a96bf1 172 gps.LatitudeBinary = 0;
bongkwan 0:1aa6d4a96bf1 173 //printf("gps long:%f, lat:%f Vbat:%.2fV\r\n", gps.Longitude, gps.Latitude, ain_bat->read()*AIN_VREF*AIN_VBAT_DIV);
bongkwan 0:1aa6d4a96bf1 174 gps_coord_cnt++;
bongkwan 0:1aa6d4a96bf1 175 }
bongkwan 0:1aa6d4a96bf1 176 #endif /* TARGET_MOTE_L152RC */
bongkwan 0:1aa6d4a96bf1 177 }
bongkwan 0:1aa6d4a96bf1 178
bongkwan 0:1aa6d4a96bf1 179 scpi_result_t tx_busyQ(scpi_t * context)
bongkwan 0:1aa6d4a96bf1 180 {
bongkwan 0:1aa6d4a96bf1 181 SCPI_ResultBool(context, tx_busy);
bongkwan 0:1aa6d4a96bf1 182 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 183 }
bongkwan 0:1aa6d4a96bf1 184
bongkwan 0:1aa6d4a96bf1 185 scpi_result_t SCPI_Reset(scpi_t * context)
bongkwan 0:1aa6d4a96bf1 186 {
bongkwan 0:1aa6d4a96bf1 187 radio.hw_reset();
bongkwan 0:1aa6d4a96bf1 188 printf("**Reset\r\n");
bongkwan 0:1aa6d4a96bf1 189 tx_busy = false;
bongkwan 0:1aa6d4a96bf1 190 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 191 }
bongkwan 0:1aa6d4a96bf1 192
bongkwan 0:1aa6d4a96bf1 193 const scpi_choice_def_t pa_selects[] = {
bongkwan 0:1aa6d4a96bf1 194 { "RFO", 0 },
bongkwan 0:1aa6d4a96bf1 195 { "PA_BOOST", 1 },
bongkwan 0:1aa6d4a96bf1 196 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 197 };
bongkwan 0:1aa6d4a96bf1 198
bongkwan 0:1aa6d4a96bf1 199 scpi_result_t radio_PASelect(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 200 {
bongkwan 0:1aa6d4a96bf1 201 int32_t value;
bongkwan 0:1aa6d4a96bf1 202
bongkwan 0:1aa6d4a96bf1 203 if (!SCPI_ParamChoice(context, pa_selects, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 204 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 205
bongkwan 0:1aa6d4a96bf1 206 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
bongkwan 0:1aa6d4a96bf1 207 radio.RegPaConfig.bits.PaSelect = value;
bongkwan 0:1aa6d4a96bf1 208 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
bongkwan 0:1aa6d4a96bf1 209
bongkwan 0:1aa6d4a96bf1 210 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
bongkwan 0:1aa6d4a96bf1 211 rfsw_callback();
bongkwan 0:1aa6d4a96bf1 212
bongkwan 0:1aa6d4a96bf1 213 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 214 }
bongkwan 0:1aa6d4a96bf1 215
bongkwan 0:1aa6d4a96bf1 216 scpi_result_t radio_PASelectQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 217 {
bongkwan 0:1aa6d4a96bf1 218 int idx;
bongkwan 0:1aa6d4a96bf1 219
bongkwan 0:1aa6d4a96bf1 220 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
bongkwan 0:1aa6d4a96bf1 221 idx = radio.RegPaConfig.bits.PaSelect;
bongkwan 0:1aa6d4a96bf1 222
bongkwan 0:1aa6d4a96bf1 223 SCPI_ResultText(context, pa_selects[idx].name);
bongkwan 0:1aa6d4a96bf1 224 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 225 }
bongkwan 0:1aa6d4a96bf1 226
bongkwan 0:1aa6d4a96bf1 227 const scpi_choice_def_t modulations[] = {
bongkwan 0:1aa6d4a96bf1 228 { "FSK", 1 },
bongkwan 0:1aa6d4a96bf1 229 { "OOK", 2 },
bongkwan 0:1aa6d4a96bf1 230 { "LORa", 3 },
bongkwan 0:1aa6d4a96bf1 231 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 232 };
bongkwan 0:1aa6d4a96bf1 233
bongkwan 0:1aa6d4a96bf1 234 scpi_result_t radio_modulation(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 235 {
bongkwan 0:1aa6d4a96bf1 236 int32_t value;
bongkwan 0:1aa6d4a96bf1 237
bongkwan 0:1aa6d4a96bf1 238 /* scpi_bool_t SCPI_ParamChoice(scpi_t * context, const scpi_choice_def_t * options, int32_t * value, scpi_bool_t mandatory); */
bongkwan 0:1aa6d4a96bf1 239 if (!SCPI_ParamChoice(context, modulations, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 240 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 241
bongkwan 0:1aa6d4a96bf1 242 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
bongkwan 0:1aa6d4a96bf1 243 if (value == 3) {
bongkwan 0:1aa6d4a96bf1 244 if (!radio.RegOpMode.bits.LongRangeMode)
bongkwan 0:1aa6d4a96bf1 245 lora.enable();
bongkwan 0:1aa6d4a96bf1 246 } else {
bongkwan 0:1aa6d4a96bf1 247 if (radio.RegOpMode.bits.LongRangeMode)
bongkwan 0:1aa6d4a96bf1 248 fsk.enable(false);
bongkwan 0:1aa6d4a96bf1 249 if (radio.RegOpMode.bits.ModulationType) { // radio is OOK
bongkwan 0:1aa6d4a96bf1 250 if (value == 1) { // change to FSK
bongkwan 0:1aa6d4a96bf1 251 radio.RegOpMode.bits.ModulationType = 0;
bongkwan 0:1aa6d4a96bf1 252 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
bongkwan 0:1aa6d4a96bf1 253 }
bongkwan 0:1aa6d4a96bf1 254 } else { // radio is FSK
bongkwan 0:1aa6d4a96bf1 255 if (value == 2) { // change to OOK
bongkwan 0:1aa6d4a96bf1 256 radio.RegOpMode.bits.ModulationType = 1;
bongkwan 0:1aa6d4a96bf1 257 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
bongkwan 0:1aa6d4a96bf1 258 }
bongkwan 0:1aa6d4a96bf1 259 }
bongkwan 0:1aa6d4a96bf1 260 }
bongkwan 0:1aa6d4a96bf1 261
bongkwan 0:1aa6d4a96bf1 262 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 263 }
bongkwan 0:1aa6d4a96bf1 264
bongkwan 0:1aa6d4a96bf1 265 scpi_result_t radio_modulationQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 266 {
bongkwan 0:1aa6d4a96bf1 267 int idx;
bongkwan 0:1aa6d4a96bf1 268
bongkwan 0:1aa6d4a96bf1 269 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 270 idx = 2; // lora
bongkwan 0:1aa6d4a96bf1 271 } else {
bongkwan 0:1aa6d4a96bf1 272 if (radio.RegOpMode.bits.ModulationType)
bongkwan 0:1aa6d4a96bf1 273 idx = 1; // ook
bongkwan 0:1aa6d4a96bf1 274 else
bongkwan 0:1aa6d4a96bf1 275 idx = 0; // fsk
bongkwan 0:1aa6d4a96bf1 276 }
bongkwan 0:1aa6d4a96bf1 277
bongkwan 0:1aa6d4a96bf1 278 SCPI_ResultText(context, modulations[idx].name);
bongkwan 0:1aa6d4a96bf1 279 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 280 }
bongkwan 0:1aa6d4a96bf1 281
bongkwan 0:1aa6d4a96bf1 282 scpi_result_t fsk_fdev(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 283 {
bongkwan 0:1aa6d4a96bf1 284 int32_t i;
bongkwan 0:1aa6d4a96bf1 285
bongkwan 0:1aa6d4a96bf1 286 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 287 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 288
bongkwan 0:1aa6d4a96bf1 289 if (is_lora())
bongkwan 0:1aa6d4a96bf1 290 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 291
bongkwan 0:1aa6d4a96bf1 292 fsk.set_tx_fdev_hz(i);
bongkwan 0:1aa6d4a96bf1 293 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 294 }
bongkwan 0:1aa6d4a96bf1 295
bongkwan 0:1aa6d4a96bf1 296 scpi_result_t fsk_fdevQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 297 {
bongkwan 0:1aa6d4a96bf1 298 if (is_lora())
bongkwan 0:1aa6d4a96bf1 299 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 300
bongkwan 0:1aa6d4a96bf1 301 SCPI_ResultInt(context, fsk.get_tx_fdev_hz());
bongkwan 0:1aa6d4a96bf1 302 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 303 }
bongkwan 0:1aa6d4a96bf1 304
bongkwan 0:1aa6d4a96bf1 305 const scpi_choice_def_t rxtrigs[] = {
bongkwan 0:1aa6d4a96bf1 306 { "OFF", 0 },
bongkwan 0:1aa6d4a96bf1 307 { "RSSI", 1 },
bongkwan 0:1aa6d4a96bf1 308 { "PRE", 6 },
bongkwan 0:1aa6d4a96bf1 309 { "BOTH", 7 },
bongkwan 0:1aa6d4a96bf1 310 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 311 };
bongkwan 0:1aa6d4a96bf1 312
bongkwan 0:1aa6d4a96bf1 313 scpi_result_t fsk_rxtrig(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 314 {
bongkwan 0:1aa6d4a96bf1 315 int32_t value;
bongkwan 0:1aa6d4a96bf1 316
bongkwan 0:1aa6d4a96bf1 317 if (is_lora())
bongkwan 0:1aa6d4a96bf1 318 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 319
bongkwan 0:1aa6d4a96bf1 320 if (!SCPI_ParamChoice(context, rxtrigs, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 321 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 322
bongkwan 0:1aa6d4a96bf1 323 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
bongkwan 0:1aa6d4a96bf1 324 fsk.RegRxConfig.bits.RxTrigger = value;
bongkwan 0:1aa6d4a96bf1 325 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
bongkwan 0:1aa6d4a96bf1 326 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 327 }
bongkwan 0:1aa6d4a96bf1 328
bongkwan 0:1aa6d4a96bf1 329 scpi_result_t fsk_rxtrigQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 330 {
bongkwan 0:1aa6d4a96bf1 331 int idx;
bongkwan 0:1aa6d4a96bf1 332
bongkwan 0:1aa6d4a96bf1 333 if (is_lora())
bongkwan 0:1aa6d4a96bf1 334 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 335
bongkwan 0:1aa6d4a96bf1 336 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
bongkwan 0:1aa6d4a96bf1 337 idx = fsk.RegRxConfig.bits.RxTrigger;
bongkwan 0:1aa6d4a96bf1 338 SCPI_ResultText(context, rxtrigs[idx].name);
bongkwan 0:1aa6d4a96bf1 339 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 340 }
bongkwan 0:1aa6d4a96bf1 341
bongkwan 0:1aa6d4a96bf1 342 scpi_result_t fsk_bt(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 343 {
bongkwan 0:1aa6d4a96bf1 344 double bt;
bongkwan 0:1aa6d4a96bf1 345
bongkwan 0:1aa6d4a96bf1 346 if (is_lora())
bongkwan 0:1aa6d4a96bf1 347 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 348
bongkwan 0:1aa6d4a96bf1 349 if (!SCPI_ParamDouble(context, &bt, TRUE))
bongkwan 0:1aa6d4a96bf1 350 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 351
bongkwan 0:1aa6d4a96bf1 352 if (bt < 0.2)
bongkwan 0:1aa6d4a96bf1 353 radio.RegOpMode.bits.ModulationShaping = 0; // no shaping
bongkwan 0:1aa6d4a96bf1 354 else if (bt < 0.4)
bongkwan 0:1aa6d4a96bf1 355 radio.RegOpMode.bits.ModulationShaping = 3; // BT0.3 (most shaping)
bongkwan 0:1aa6d4a96bf1 356 else if (bt < 0.9)
bongkwan 0:1aa6d4a96bf1 357 radio.RegOpMode.bits.ModulationShaping = 2; // BT0.5
bongkwan 0:1aa6d4a96bf1 358 else
bongkwan 0:1aa6d4a96bf1 359 radio.RegOpMode.bits.ModulationShaping = 1; // BT1.0
bongkwan 0:1aa6d4a96bf1 360
bongkwan 0:1aa6d4a96bf1 361 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
bongkwan 0:1aa6d4a96bf1 362 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 363 }
bongkwan 0:1aa6d4a96bf1 364
bongkwan 0:1aa6d4a96bf1 365 scpi_result_t fsk_btQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 366 {
bongkwan 0:1aa6d4a96bf1 367 double bt;
bongkwan 0:1aa6d4a96bf1 368
bongkwan 0:1aa6d4a96bf1 369 if (is_lora())
bongkwan 0:1aa6d4a96bf1 370 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 371
bongkwan 0:1aa6d4a96bf1 372 switch (radio.RegOpMode.bits.ModulationShaping) {
bongkwan 0:1aa6d4a96bf1 373 case 0: bt = 0.0; break;
bongkwan 0:1aa6d4a96bf1 374 case 1: bt = 1.0; break;
bongkwan 0:1aa6d4a96bf1 375 case 2: bt = 0.5; break;
bongkwan 0:1aa6d4a96bf1 376 case 3: bt = 0.3; break;
bongkwan 0:1aa6d4a96bf1 377 }
bongkwan 0:1aa6d4a96bf1 378
bongkwan 0:1aa6d4a96bf1 379 SCPI_ResultDouble(context, bt);
bongkwan 0:1aa6d4a96bf1 380 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 381 }
bongkwan 0:1aa6d4a96bf1 382
bongkwan 0:1aa6d4a96bf1 383 const scpi_choice_def_t datamodes[] = {
bongkwan 0:1aa6d4a96bf1 384 { "CONT", 0 },
bongkwan 0:1aa6d4a96bf1 385 { "PKT", 1 },
bongkwan 0:1aa6d4a96bf1 386 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 387 };
bongkwan 0:1aa6d4a96bf1 388
bongkwan 0:1aa6d4a96bf1 389 scpi_result_t fsk_datamode(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 390 {
bongkwan 0:1aa6d4a96bf1 391 int32_t value;
bongkwan 0:1aa6d4a96bf1 392
bongkwan 0:1aa6d4a96bf1 393 if (!SCPI_ParamChoice(context, datamodes, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 394 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 395
bongkwan 0:1aa6d4a96bf1 396 if (is_lora())
bongkwan 0:1aa6d4a96bf1 397 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 398
bongkwan 0:1aa6d4a96bf1 399 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
bongkwan 0:1aa6d4a96bf1 400 fsk.RegPktConfig2.bits.DataModePacket = value;
bongkwan 0:1aa6d4a96bf1 401 radio.write_u16(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word);
bongkwan 0:1aa6d4a96bf1 402 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 403 }
bongkwan 0:1aa6d4a96bf1 404
bongkwan 0:1aa6d4a96bf1 405 scpi_result_t fsk_datamodeQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 406 {
bongkwan 0:1aa6d4a96bf1 407 int idx;
bongkwan 0:1aa6d4a96bf1 408
bongkwan 0:1aa6d4a96bf1 409 if (is_lora())
bongkwan 0:1aa6d4a96bf1 410 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 411
bongkwan 0:1aa6d4a96bf1 412 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
bongkwan 0:1aa6d4a96bf1 413 idx = fsk.RegPktConfig2.bits.DataModePacket;
bongkwan 0:1aa6d4a96bf1 414 SCPI_ResultText(context, datamodes[idx].name);
bongkwan 0:1aa6d4a96bf1 415 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 416 }
bongkwan 0:1aa6d4a96bf1 417
bongkwan 0:1aa6d4a96bf1 418 const scpi_choice_def_t dcfrees[] = {
bongkwan 0:1aa6d4a96bf1 419 { "OFF", 0 },
bongkwan 0:1aa6d4a96bf1 420 { "MAN", 1 },
bongkwan 0:1aa6d4a96bf1 421 { "WHIT", 2 },
bongkwan 0:1aa6d4a96bf1 422 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 423 };
bongkwan 0:1aa6d4a96bf1 424
bongkwan 0:1aa6d4a96bf1 425 scpi_result_t fsk_dcfree(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 426 {
bongkwan 0:1aa6d4a96bf1 427 int32_t value;
bongkwan 0:1aa6d4a96bf1 428
bongkwan 0:1aa6d4a96bf1 429 if (is_lora())
bongkwan 0:1aa6d4a96bf1 430 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 431
bongkwan 0:1aa6d4a96bf1 432 if (!SCPI_ParamChoice(context, dcfrees, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 433 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 434
bongkwan 0:1aa6d4a96bf1 435 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
bongkwan 0:1aa6d4a96bf1 436 fsk.RegPktConfig1.bits.DcFree = value;
bongkwan 0:1aa6d4a96bf1 437 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
bongkwan 0:1aa6d4a96bf1 438 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 439 }
bongkwan 0:1aa6d4a96bf1 440
bongkwan 0:1aa6d4a96bf1 441 scpi_result_t fsk_dcfreeQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 442 {
bongkwan 0:1aa6d4a96bf1 443 int idx;
bongkwan 0:1aa6d4a96bf1 444
bongkwan 0:1aa6d4a96bf1 445 if (is_lora())
bongkwan 0:1aa6d4a96bf1 446 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 447
bongkwan 0:1aa6d4a96bf1 448 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
bongkwan 0:1aa6d4a96bf1 449 idx = fsk.RegPktConfig1.bits.DcFree ;
bongkwan 0:1aa6d4a96bf1 450 SCPI_ResultText(context, dcfrees[idx].name);
bongkwan 0:1aa6d4a96bf1 451 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 452 }
bongkwan 0:1aa6d4a96bf1 453
bongkwan 0:1aa6d4a96bf1 454 scpi_result_t fsk_rxbw(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 455 {
bongkwan 0:1aa6d4a96bf1 456 int32_t i;
bongkwan 0:1aa6d4a96bf1 457
bongkwan 0:1aa6d4a96bf1 458 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 459 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 460
bongkwan 0:1aa6d4a96bf1 461 if (is_lora())
bongkwan 0:1aa6d4a96bf1 462 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 463
bongkwan 0:1aa6d4a96bf1 464 fsk.set_rx_dcc_bw_hz(i, 0);
bongkwan 0:1aa6d4a96bf1 465 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 466 }
bongkwan 0:1aa6d4a96bf1 467
bongkwan 0:1aa6d4a96bf1 468 scpi_result_t fsk_rxbwQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 469 {
bongkwan 0:1aa6d4a96bf1 470 if (is_lora())
bongkwan 0:1aa6d4a96bf1 471 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 472
bongkwan 0:1aa6d4a96bf1 473 SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_RXBW));
bongkwan 0:1aa6d4a96bf1 474 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 475 }
bongkwan 0:1aa6d4a96bf1 476
bongkwan 0:1aa6d4a96bf1 477 scpi_result_t fsk_afcbw(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 478 {
bongkwan 0:1aa6d4a96bf1 479 int32_t i;
bongkwan 0:1aa6d4a96bf1 480
bongkwan 0:1aa6d4a96bf1 481 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 482 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 483
bongkwan 0:1aa6d4a96bf1 484 if (is_lora())
bongkwan 0:1aa6d4a96bf1 485 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 486
bongkwan 0:1aa6d4a96bf1 487 fsk.set_rx_dcc_bw_hz(i, 1);
bongkwan 0:1aa6d4a96bf1 488 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 489 }
bongkwan 0:1aa6d4a96bf1 490
bongkwan 0:1aa6d4a96bf1 491 scpi_result_t fsk_afcbwQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 492 {
bongkwan 0:1aa6d4a96bf1 493 if (is_lora())
bongkwan 0:1aa6d4a96bf1 494 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 495
bongkwan 0:1aa6d4a96bf1 496 SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_AFCBW));
bongkwan 0:1aa6d4a96bf1 497 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 498 }
bongkwan 0:1aa6d4a96bf1 499
bongkwan 0:1aa6d4a96bf1 500 scpi_result_t fsk_bitrate(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 501 {
bongkwan 0:1aa6d4a96bf1 502 int32_t i;
bongkwan 0:1aa6d4a96bf1 503
bongkwan 0:1aa6d4a96bf1 504 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 505 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 506
bongkwan 0:1aa6d4a96bf1 507 if (is_lora())
bongkwan 0:1aa6d4a96bf1 508 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 509
bongkwan 0:1aa6d4a96bf1 510 fsk.set_bitrate(i);
bongkwan 0:1aa6d4a96bf1 511 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 512 }
bongkwan 0:1aa6d4a96bf1 513
bongkwan 0:1aa6d4a96bf1 514 scpi_result_t fsk_bitrateQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 515 {
bongkwan 0:1aa6d4a96bf1 516 if (is_lora())
bongkwan 0:1aa6d4a96bf1 517 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 518
bongkwan 0:1aa6d4a96bf1 519 SCPI_ResultInt(context, fsk.get_bitrate());
bongkwan 0:1aa6d4a96bf1 520 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 521 }
bongkwan 0:1aa6d4a96bf1 522
bongkwan 0:1aa6d4a96bf1 523 scpi_result_t fsk_prelen(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 524 {
bongkwan 0:1aa6d4a96bf1 525 int32_t i;
bongkwan 0:1aa6d4a96bf1 526
bongkwan 0:1aa6d4a96bf1 527 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 528 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 529
bongkwan 0:1aa6d4a96bf1 530 if (is_lora())
bongkwan 0:1aa6d4a96bf1 531 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 532
bongkwan 0:1aa6d4a96bf1 533 radio.write_u16(REG_FSK_PREAMBLEMSB, i);
bongkwan 0:1aa6d4a96bf1 534 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 535 }
bongkwan 0:1aa6d4a96bf1 536
bongkwan 0:1aa6d4a96bf1 537 scpi_result_t fsk_prelenQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 538 {
bongkwan 0:1aa6d4a96bf1 539 if (is_lora())
bongkwan 0:1aa6d4a96bf1 540 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 541
bongkwan 0:1aa6d4a96bf1 542 SCPI_ResultInt(context, radio.read_u16(REG_FSK_PREAMBLEMSB) );
bongkwan 0:1aa6d4a96bf1 543 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 544 }
bongkwan 0:1aa6d4a96bf1 545
bongkwan 0:1aa6d4a96bf1 546 scpi_result_t fsk_sync(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 547 {
bongkwan 0:1aa6d4a96bf1 548 char buffer[100];
bongkwan 0:1aa6d4a96bf1 549 size_t _copy_len, _len, i;
bongkwan 0:1aa6d4a96bf1 550 uint8_t addr;
bongkwan 0:1aa6d4a96bf1 551 uint8_t sync_size;
bongkwan 0:1aa6d4a96bf1 552
bongkwan 0:1aa6d4a96bf1 553 if (is_lora())
bongkwan 0:1aa6d4a96bf1 554 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 555
bongkwan 0:1aa6d4a96bf1 556 memset(buffer, 0, sizeof(buffer));
bongkwan 0:1aa6d4a96bf1 557 SCPI_ParamCopyText(context, buffer, 100, &_copy_len, false);
bongkwan 0:1aa6d4a96bf1 558 for (_len = 0; buffer[_len] != 0; _len++)
bongkwan 0:1aa6d4a96bf1 559 ;
bongkwan 0:1aa6d4a96bf1 560
bongkwan 0:1aa6d4a96bf1 561 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
bongkwan 0:1aa6d4a96bf1 562 sync_size = 0;
bongkwan 0:1aa6d4a96bf1 563 addr = REG_FSK_SYNCVALUE1;
bongkwan 0:1aa6d4a96bf1 564 for (i = 0; i < _len; i+=2) {
bongkwan 0:1aa6d4a96bf1 565 int o;
bongkwan 0:1aa6d4a96bf1 566 sscanf(buffer+i, "%02x", &o);
bongkwan 0:1aa6d4a96bf1 567 radio.write_reg(addr++, o);
bongkwan 0:1aa6d4a96bf1 568 sync_size++;
bongkwan 0:1aa6d4a96bf1 569 }
bongkwan 0:1aa6d4a96bf1 570 if (sync_size > 0)
bongkwan 0:1aa6d4a96bf1 571 fsk.RegSyncConfig.bits.SyncSize = sync_size - 1;
bongkwan 0:1aa6d4a96bf1 572
bongkwan 0:1aa6d4a96bf1 573 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
bongkwan 0:1aa6d4a96bf1 574
bongkwan 0:1aa6d4a96bf1 575 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 576 }
bongkwan 0:1aa6d4a96bf1 577
bongkwan 0:1aa6d4a96bf1 578 scpi_result_t fsk_syncQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 579 {
bongkwan 0:1aa6d4a96bf1 580 int i;
bongkwan 0:1aa6d4a96bf1 581 char txt[64];
bongkwan 0:1aa6d4a96bf1 582 char *ptr = txt;
bongkwan 0:1aa6d4a96bf1 583
bongkwan 0:1aa6d4a96bf1 584 if (is_lora())
bongkwan 0:1aa6d4a96bf1 585 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 586
bongkwan 0:1aa6d4a96bf1 587 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
bongkwan 0:1aa6d4a96bf1 588 for (i = 0; i <= fsk.RegSyncConfig.bits.SyncSize; i++) {
bongkwan 0:1aa6d4a96bf1 589 uint8_t o = radio.read_reg(i + REG_FSK_SYNCVALUE1);
bongkwan 0:1aa6d4a96bf1 590 sprintf(ptr, "%02x", o);
bongkwan 0:1aa6d4a96bf1 591 ptr += 2;
bongkwan 0:1aa6d4a96bf1 592 }
bongkwan 0:1aa6d4a96bf1 593
bongkwan 0:1aa6d4a96bf1 594 SCPI_ResultText(context, txt);
bongkwan 0:1aa6d4a96bf1 595 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 596 }
bongkwan 0:1aa6d4a96bf1 597
bongkwan 0:1aa6d4a96bf1 598 scpi_result_t radio_rssiQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 599 {
bongkwan 0:1aa6d4a96bf1 600 int reg_val;
bongkwan 0:1aa6d4a96bf1 601
bongkwan 0:1aa6d4a96bf1 602 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
bongkwan 0:1aa6d4a96bf1 603 if (radio.RegOpMode.bits.Mode != RF_OPMODE_RECEIVER)
bongkwan 0:1aa6d4a96bf1 604 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 605
bongkwan 0:1aa6d4a96bf1 606 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 607 reg_val = radio.read_reg(REG_LR_RSSIVALUE); // 0x1b: dbm = -125 + regvalue
bongkwan 0:1aa6d4a96bf1 608 SCPI_ResultDouble(context, -125 + reg_val);
bongkwan 0:1aa6d4a96bf1 609 } else {
bongkwan 0:1aa6d4a96bf1 610 reg_val = radio.read_reg(REG_FSK_RSSIVALUE); // 0x11: dBm = -regvalue/2
bongkwan 0:1aa6d4a96bf1 611 SCPI_ResultDouble(context, -reg_val/2.0);
bongkwan 0:1aa6d4a96bf1 612 }
bongkwan 0:1aa6d4a96bf1 613
bongkwan 0:1aa6d4a96bf1 614 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 615 }
bongkwan 0:1aa6d4a96bf1 616
bongkwan 0:1aa6d4a96bf1 617 scpi_result_t radio_binFifo(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 618 {
bongkwan 0:1aa6d4a96bf1 619 size_t len;
bongkwan 0:1aa6d4a96bf1 620 const char* buf = (const char *)radio.tx_buf;
bongkwan 0:1aa6d4a96bf1 621
bongkwan 0:1aa6d4a96bf1 622 /*scpi_bool_t SCPI_ParamArbitraryBlock(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory);*/
bongkwan 0:1aa6d4a96bf1 623 if (!SCPI_ParamArbitraryBlock(context, &buf, &len, TRUE))
bongkwan 0:1aa6d4a96bf1 624 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 625
bongkwan 0:1aa6d4a96bf1 626 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); // pull PaSelect
bongkwan 0:1aa6d4a96bf1 627 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 628 lora.RegPayloadLength = len;
bongkwan 0:1aa6d4a96bf1 629 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
bongkwan 0:1aa6d4a96bf1 630 lora.start_tx(lora.RegPayloadLength);
bongkwan 0:1aa6d4a96bf1 631 } else {
bongkwan 0:1aa6d4a96bf1 632 fsk.start_tx(len);
bongkwan 0:1aa6d4a96bf1 633 }
bongkwan 0:1aa6d4a96bf1 634
bongkwan 0:1aa6d4a96bf1 635 tx_busy = true;
bongkwan 0:1aa6d4a96bf1 636
bongkwan 0:1aa6d4a96bf1 637 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 638 }
bongkwan 0:1aa6d4a96bf1 639
bongkwan 0:1aa6d4a96bf1 640 scpi_result_t radio_binFifoQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 641 {
bongkwan 0:1aa6d4a96bf1 642 size_t len;
bongkwan 0:1aa6d4a96bf1 643 const char* buf = (const char *)radio.rx_buf;
bongkwan 0:1aa6d4a96bf1 644
bongkwan 0:1aa6d4a96bf1 645 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 646 len = lora.RegRxNbBytes;
bongkwan 0:1aa6d4a96bf1 647 } else {
bongkwan 0:1aa6d4a96bf1 648 len = fsk.rx_buf_length;
bongkwan 0:1aa6d4a96bf1 649 }
bongkwan 0:1aa6d4a96bf1 650
bongkwan 0:1aa6d4a96bf1 651 //size_t SCPI_ResultArbitraryBlock(scpi_t * context, const char * data, size_t len);
bongkwan 0:1aa6d4a96bf1 652 if (SCPI_ResultArbitraryBlock(context, buf, len) == len)
bongkwan 0:1aa6d4a96bf1 653 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 654 else
bongkwan 0:1aa6d4a96bf1 655 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 656 }
bongkwan 0:1aa6d4a96bf1 657
bongkwan 0:1aa6d4a96bf1 658 scpi_result_t radio_fifoQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 659 {
bongkwan 0:1aa6d4a96bf1 660 int i;
bongkwan 0:1aa6d4a96bf1 661 char txt[520];
bongkwan 0:1aa6d4a96bf1 662 char *ptr = txt;
bongkwan 0:1aa6d4a96bf1 663
bongkwan 0:1aa6d4a96bf1 664 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 665 for (i = 0; i < lora.RegRxNbBytes; i++) {
bongkwan 0:1aa6d4a96bf1 666 sprintf(ptr, "%02x", radio.rx_buf[i]);
bongkwan 0:1aa6d4a96bf1 667 ptr += 2;
bongkwan 0:1aa6d4a96bf1 668 }
bongkwan 0:1aa6d4a96bf1 669 } else {
bongkwan 0:1aa6d4a96bf1 670 for (i = 0; i < fsk.rx_buf_length; i++) {
bongkwan 0:1aa6d4a96bf1 671 sprintf(ptr, "%02x", radio.rx_buf[i]);
bongkwan 0:1aa6d4a96bf1 672 ptr += 2;
bongkwan 0:1aa6d4a96bf1 673 }
bongkwan 0:1aa6d4a96bf1 674 }
bongkwan 0:1aa6d4a96bf1 675
bongkwan 0:1aa6d4a96bf1 676 SCPI_ResultText(context, txt);
bongkwan 0:1aa6d4a96bf1 677 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 678 }
bongkwan 0:1aa6d4a96bf1 679
bongkwan 0:1aa6d4a96bf1 680 scpi_result_t radio_fifo(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 681 {
bongkwan 0:1aa6d4a96bf1 682 char buffer[100];
bongkwan 0:1aa6d4a96bf1 683 size_t copy_len, i, len;
bongkwan 0:1aa6d4a96bf1 684
bongkwan 0:1aa6d4a96bf1 685 if (tx_busy)
bongkwan 0:1aa6d4a96bf1 686 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 687
bongkwan 0:1aa6d4a96bf1 688 memset(buffer, 0, sizeof(buffer));
bongkwan 0:1aa6d4a96bf1 689 SCPI_ParamCopyText(context, buffer, 100, &copy_len, false);
bongkwan 0:1aa6d4a96bf1 690
bongkwan 0:1aa6d4a96bf1 691 for (len = 0; buffer[len] != 0; len++)
bongkwan 0:1aa6d4a96bf1 692 ;
bongkwan 0:1aa6d4a96bf1 693
bongkwan 0:1aa6d4a96bf1 694 for (i = 0; i < len; i++)
bongkwan 0:1aa6d4a96bf1 695 radio.tx_buf[i] = buffer[i];
bongkwan 0:1aa6d4a96bf1 696
bongkwan 0:1aa6d4a96bf1 697 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
bongkwan 0:1aa6d4a96bf1 698 if (is_lora()) {
bongkwan 0:1aa6d4a96bf1 699 lora.RegPayloadLength = len;
bongkwan 0:1aa6d4a96bf1 700 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
bongkwan 0:1aa6d4a96bf1 701 lora.start_tx(lora.RegPayloadLength);
bongkwan 0:1aa6d4a96bf1 702 } else {
bongkwan 0:1aa6d4a96bf1 703 /* fsk todo */
bongkwan 0:1aa6d4a96bf1 704 fsk.start_tx(len);
bongkwan 0:1aa6d4a96bf1 705 }
bongkwan 0:1aa6d4a96bf1 706
bongkwan 0:1aa6d4a96bf1 707 tx_busy = true;
bongkwan 0:1aa6d4a96bf1 708
bongkwan 0:1aa6d4a96bf1 709 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 710 }
bongkwan 0:1aa6d4a96bf1 711
bongkwan 0:1aa6d4a96bf1 712 const scpi_choice_def_t opmodes[] = {
bongkwan 0:1aa6d4a96bf1 713 { "SLE", 0 },
bongkwan 0:1aa6d4a96bf1 714 { "STB", 1 },
bongkwan 0:1aa6d4a96bf1 715 { "FST", 2 },
bongkwan 0:1aa6d4a96bf1 716 { "TX", 3 },
bongkwan 0:1aa6d4a96bf1 717 { "FSR", 4 },
bongkwan 0:1aa6d4a96bf1 718 { "RXC", 5 },
bongkwan 0:1aa6d4a96bf1 719 { "RXS", 6 },
bongkwan 0:1aa6d4a96bf1 720 { "CAD", 7 },
bongkwan 0:1aa6d4a96bf1 721 SCPI_CHOICE_LIST_END
bongkwan 0:1aa6d4a96bf1 722 };
bongkwan 0:1aa6d4a96bf1 723
bongkwan 0:1aa6d4a96bf1 724 scpi_result_t radio_opmode(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 725 {
bongkwan 0:1aa6d4a96bf1 726 int32_t value;
bongkwan 0:1aa6d4a96bf1 727
bongkwan 0:1aa6d4a96bf1 728 if (!SCPI_ParamChoice(context, opmodes, &value, TRUE))
bongkwan 0:1aa6d4a96bf1 729 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 730
bongkwan 0:1aa6d4a96bf1 731 if (value == RF_OPMODE_TRANSMITTER)
bongkwan 0:1aa6d4a96bf1 732 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); // pull PaSelect
bongkwan 0:1aa6d4a96bf1 733 else
bongkwan 0:1aa6d4a96bf1 734 tx_busy = false;
bongkwan 0:1aa6d4a96bf1 735
bongkwan 0:1aa6d4a96bf1 736 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
bongkwan 0:1aa6d4a96bf1 737 radio.set_opmode((chip_mode_e)value);
bongkwan 0:1aa6d4a96bf1 738
bongkwan 0:1aa6d4a96bf1 739 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 740 }
bongkwan 0:1aa6d4a96bf1 741
bongkwan 0:1aa6d4a96bf1 742 scpi_result_t radio_opmodeQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 743 {
bongkwan 0:1aa6d4a96bf1 744 int idx;
bongkwan 0:1aa6d4a96bf1 745
bongkwan 0:1aa6d4a96bf1 746 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
bongkwan 0:1aa6d4a96bf1 747 idx = radio.RegOpMode.bits.Mode;
bongkwan 0:1aa6d4a96bf1 748 SCPI_ResultText(context, opmodes[idx].name);
bongkwan 0:1aa6d4a96bf1 749
bongkwan 0:1aa6d4a96bf1 750 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 751 }
bongkwan 0:1aa6d4a96bf1 752
bongkwan 0:1aa6d4a96bf1 753
bongkwan 0:1aa6d4a96bf1 754 /*scpi_result_t wbr_set_bit9(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 755 {
bongkwan 0:1aa6d4a96bf1 756 SCPI_RegSetBits(context, SCPI_REG_QUES, 0x200);
bongkwan 0:1aa6d4a96bf1 757 printf("set bit9\r\n");
bongkwan 0:1aa6d4a96bf1 758 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 759 }*/
bongkwan 0:1aa6d4a96bf1 760 scpi_result_t radio_ocp(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 761 {
bongkwan 0:1aa6d4a96bf1 762 int32_t i;
bongkwan 0:1aa6d4a96bf1 763
bongkwan 0:1aa6d4a96bf1 764 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 765 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 766
bongkwan 0:1aa6d4a96bf1 767 radio.RegOcp.octet = radio.read_reg(REG_OCP);
bongkwan 0:1aa6d4a96bf1 768 if (i < 130)
bongkwan 0:1aa6d4a96bf1 769 radio.RegOcp.bits.OcpTrim = (i - 45) / 5;
bongkwan 0:1aa6d4a96bf1 770 else
bongkwan 0:1aa6d4a96bf1 771 radio.RegOcp.bits.OcpTrim = (i + 30) / 10;
bongkwan 0:1aa6d4a96bf1 772 radio.write_reg(REG_OCP, radio.RegOcp.octet);
bongkwan 0:1aa6d4a96bf1 773 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 774 }
bongkwan 0:1aa6d4a96bf1 775
bongkwan 0:1aa6d4a96bf1 776 scpi_result_t radio_ocpQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 777 {
bongkwan 0:1aa6d4a96bf1 778 int32_t i;
bongkwan 0:1aa6d4a96bf1 779
bongkwan 0:1aa6d4a96bf1 780 radio.RegOcp.octet = radio.read_reg(REG_OCP);
bongkwan 0:1aa6d4a96bf1 781
bongkwan 0:1aa6d4a96bf1 782 if (radio.RegOcp.bits.OcpTrim < 16)
bongkwan 0:1aa6d4a96bf1 783 i = 45 + (5 * radio.RegOcp.bits.OcpTrim);
bongkwan 0:1aa6d4a96bf1 784 else if (radio.RegOcp.bits.OcpTrim < 28)
bongkwan 0:1aa6d4a96bf1 785 i = (10 * radio.RegOcp.bits.OcpTrim) - 30;
bongkwan 0:1aa6d4a96bf1 786 else
bongkwan 0:1aa6d4a96bf1 787 i = 240;
bongkwan 0:1aa6d4a96bf1 788
bongkwan 0:1aa6d4a96bf1 789 SCPI_ResultInt(context, i);
bongkwan 0:1aa6d4a96bf1 790 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 791 }
bongkwan 0:1aa6d4a96bf1 792
bongkwan 0:1aa6d4a96bf1 793 scpi_result_t radio_bgr(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 794 {
bongkwan 0:1aa6d4a96bf1 795 RegPdsTrim1_t pds_trim;
bongkwan 0:1aa6d4a96bf1 796 int32_t i;
bongkwan 0:1aa6d4a96bf1 797
bongkwan 0:1aa6d4a96bf1 798 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 799 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 800
bongkwan 0:1aa6d4a96bf1 801 if (radio.type == SX1276) {
bongkwan 0:1aa6d4a96bf1 802 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276);
bongkwan 0:1aa6d4a96bf1 803 pds_trim.bits.prog_txdac = i;
bongkwan 0:1aa6d4a96bf1 804 radio.write_reg(REG_PDSTRIM1_SX1276, pds_trim.octet);
bongkwan 0:1aa6d4a96bf1 805 } else if (radio.type == SX1272) {
bongkwan 0:1aa6d4a96bf1 806 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
bongkwan 0:1aa6d4a96bf1 807 pds_trim.bits.prog_txdac = i;
bongkwan 0:1aa6d4a96bf1 808 radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet);
bongkwan 0:1aa6d4a96bf1 809 } else
bongkwan 0:1aa6d4a96bf1 810 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 811
bongkwan 0:1aa6d4a96bf1 812 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 813 }
bongkwan 0:1aa6d4a96bf1 814
bongkwan 0:1aa6d4a96bf1 815 scpi_result_t radio_bgrQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 816 {
bongkwan 0:1aa6d4a96bf1 817 RegPdsTrim1_t pds_trim;
bongkwan 0:1aa6d4a96bf1 818
bongkwan 0:1aa6d4a96bf1 819 if (radio.type == SX1276)
bongkwan 0:1aa6d4a96bf1 820 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276);
bongkwan 0:1aa6d4a96bf1 821 else if (radio.type == SX1272)
bongkwan 0:1aa6d4a96bf1 822 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
bongkwan 0:1aa6d4a96bf1 823 else
bongkwan 0:1aa6d4a96bf1 824 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 825
bongkwan 0:1aa6d4a96bf1 826 SCPI_ResultInt(context, pds_trim.bits.prog_txdac);
bongkwan 0:1aa6d4a96bf1 827 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 828 }
bongkwan 0:1aa6d4a96bf1 829
bongkwan 0:1aa6d4a96bf1 830 scpi_result_t radio_lnaBoost(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 831 {
bongkwan 0:1aa6d4a96bf1 832 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 833
bongkwan 0:1aa6d4a96bf1 834 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 835 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 836
bongkwan 0:1aa6d4a96bf1 837 radio.RegLna.octet = radio.read_reg(REG_LNA);
bongkwan 0:1aa6d4a96bf1 838 if (param1)
bongkwan 0:1aa6d4a96bf1 839 radio.RegLna.bits.LnaBoostHF = 3;
bongkwan 0:1aa6d4a96bf1 840 else
bongkwan 0:1aa6d4a96bf1 841 radio.RegLna.bits.LnaBoostHF = 0;
bongkwan 0:1aa6d4a96bf1 842
bongkwan 0:1aa6d4a96bf1 843 radio.write_reg(REG_LNA, radio.RegLna.octet);
bongkwan 0:1aa6d4a96bf1 844 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 845 }
bongkwan 0:1aa6d4a96bf1 846
bongkwan 0:1aa6d4a96bf1 847 scpi_result_t radio_lnaBoostQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 848 {
bongkwan 0:1aa6d4a96bf1 849 radio.RegLna.octet = radio.read_reg(REG_LNA);
bongkwan 0:1aa6d4a96bf1 850 if (radio.RegLna.bits.LnaBoostHF)
bongkwan 0:1aa6d4a96bf1 851 SCPI_ResultBool(context, 1);
bongkwan 0:1aa6d4a96bf1 852 else
bongkwan 0:1aa6d4a96bf1 853 SCPI_ResultBool(context, 0);
bongkwan 0:1aa6d4a96bf1 854
bongkwan 0:1aa6d4a96bf1 855 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 856 }
bongkwan 0:1aa6d4a96bf1 857
bongkwan 0:1aa6d4a96bf1 858 scpi_result_t radio_power(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 859 {
bongkwan 0:1aa6d4a96bf1 860 int32_t i;
bongkwan 0:1aa6d4a96bf1 861
bongkwan 0:1aa6d4a96bf1 862 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 863 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 864
bongkwan 0:1aa6d4a96bf1 865 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
bongkwan 0:1aa6d4a96bf1 866 radio.RegPaConfig.bits.OutputPower = i;
bongkwan 0:1aa6d4a96bf1 867 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
bongkwan 0:1aa6d4a96bf1 868
bongkwan 0:1aa6d4a96bf1 869 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 870 }
bongkwan 0:1aa6d4a96bf1 871
bongkwan 0:1aa6d4a96bf1 872 scpi_result_t radio_powerQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 873 {
bongkwan 0:1aa6d4a96bf1 874 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
bongkwan 0:1aa6d4a96bf1 875 SCPI_ResultInt(context, radio.RegPaConfig.bits.OutputPower);
bongkwan 0:1aa6d4a96bf1 876 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 877 }
bongkwan 0:1aa6d4a96bf1 878
bongkwan 0:1aa6d4a96bf1 879 scpi_result_t radio_diomap(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 880 {
bongkwan 0:1aa6d4a96bf1 881 int32_t dioN, map_value;
bongkwan 0:1aa6d4a96bf1 882
bongkwan 0:1aa6d4a96bf1 883 if (!SCPI_ParamInt(context, &dioN, TRUE))
bongkwan 0:1aa6d4a96bf1 884 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 885
bongkwan 0:1aa6d4a96bf1 886 if (!SCPI_ParamInt(context, &map_value, TRUE))
bongkwan 0:1aa6d4a96bf1 887 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 888
bongkwan 0:1aa6d4a96bf1 889 if (dioN < 4) {
bongkwan 0:1aa6d4a96bf1 890 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
bongkwan 0:1aa6d4a96bf1 891 switch (dioN) {
bongkwan 0:1aa6d4a96bf1 892 case 0: radio.RegDioMapping1.bits.Dio0Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 893 case 1: radio.RegDioMapping1.bits.Dio1Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 894 case 2: radio.RegDioMapping1.bits.Dio2Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 895 case 3: radio.RegDioMapping1.bits.Dio3Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 896 } // ...switch (dioN)
bongkwan 0:1aa6d4a96bf1 897 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
bongkwan 0:1aa6d4a96bf1 898 } else {
bongkwan 0:1aa6d4a96bf1 899 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
bongkwan 0:1aa6d4a96bf1 900 switch (dioN) {
bongkwan 0:1aa6d4a96bf1 901 case 4: radio.RegDioMapping2.bits.Dio4Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 902 case 5: radio.RegDioMapping2.bits.Dio5Mapping = map_value; break;
bongkwan 0:1aa6d4a96bf1 903 } // ...switch (dioN)
bongkwan 0:1aa6d4a96bf1 904 radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
bongkwan 0:1aa6d4a96bf1 905 }
bongkwan 0:1aa6d4a96bf1 906
bongkwan 0:1aa6d4a96bf1 907 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 908 }
bongkwan 0:1aa6d4a96bf1 909
bongkwan 0:1aa6d4a96bf1 910 scpi_result_t radio_diomapQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 911 {
bongkwan 0:1aa6d4a96bf1 912 int32_t dioN, map_value = -1;
bongkwan 0:1aa6d4a96bf1 913
bongkwan 0:1aa6d4a96bf1 914 if (!SCPI_ParamInt(context, &dioN, TRUE))
bongkwan 0:1aa6d4a96bf1 915 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 916
bongkwan 0:1aa6d4a96bf1 917 if (dioN < 4) {
bongkwan 0:1aa6d4a96bf1 918 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
bongkwan 0:1aa6d4a96bf1 919 switch (dioN) {
bongkwan 0:1aa6d4a96bf1 920 case 0: map_value = radio.RegDioMapping1.bits.Dio0Mapping; break;
bongkwan 0:1aa6d4a96bf1 921 case 1: map_value = radio.RegDioMapping1.bits.Dio1Mapping; break;
bongkwan 0:1aa6d4a96bf1 922 case 2: map_value = radio.RegDioMapping1.bits.Dio2Mapping; break;
bongkwan 0:1aa6d4a96bf1 923 case 3: map_value = radio.RegDioMapping1.bits.Dio3Mapping; break;
bongkwan 0:1aa6d4a96bf1 924 } // ...switch (dioN)
bongkwan 0:1aa6d4a96bf1 925 } else {
bongkwan 0:1aa6d4a96bf1 926 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
bongkwan 0:1aa6d4a96bf1 927 switch (dioN) {
bongkwan 0:1aa6d4a96bf1 928 case 4: map_value = radio.RegDioMapping2.bits.Dio4Mapping; break;
bongkwan 0:1aa6d4a96bf1 929 case 5: map_value = radio.RegDioMapping2.bits.Dio5Mapping; break;
bongkwan 0:1aa6d4a96bf1 930 } // ...switch (dioN)
bongkwan 0:1aa6d4a96bf1 931 }
bongkwan 0:1aa6d4a96bf1 932
bongkwan 0:1aa6d4a96bf1 933 SCPI_ResultInt(context, map_value);
bongkwan 0:1aa6d4a96bf1 934 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 935 }
bongkwan 0:1aa6d4a96bf1 936
bongkwan 0:1aa6d4a96bf1 937 scpi_result_t radio_reg(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 938 {
bongkwan 0:1aa6d4a96bf1 939 int32_t addr, data;
bongkwan 0:1aa6d4a96bf1 940
bongkwan 0:1aa6d4a96bf1 941 if (!SCPI_ParamInt(context, &addr, TRUE))
bongkwan 0:1aa6d4a96bf1 942 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 943
bongkwan 0:1aa6d4a96bf1 944 if (!SCPI_ParamInt(context, &data, TRUE))
bongkwan 0:1aa6d4a96bf1 945 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 946
bongkwan 0:1aa6d4a96bf1 947 radio.write_reg(addr, data);
bongkwan 0:1aa6d4a96bf1 948
bongkwan 0:1aa6d4a96bf1 949 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 950 }
bongkwan 0:1aa6d4a96bf1 951
bongkwan 0:1aa6d4a96bf1 952 scpi_result_t radio_regQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 953 {
bongkwan 0:1aa6d4a96bf1 954 int32_t addr;
bongkwan 0:1aa6d4a96bf1 955
bongkwan 0:1aa6d4a96bf1 956 if (!SCPI_ParamInt(context, &addr, TRUE))
bongkwan 0:1aa6d4a96bf1 957 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 958
bongkwan 0:1aa6d4a96bf1 959 SCPI_ResultIntBase(context, radio.read_reg(addr), 16);
bongkwan 0:1aa6d4a96bf1 960 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 961 }
bongkwan 0:1aa6d4a96bf1 962
bongkwan 0:1aa6d4a96bf1 963
bongkwan 0:1aa6d4a96bf1 964 scpi_result_t radio_dioQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 965 {
bongkwan 0:1aa6d4a96bf1 966 int32_t dioN, value = -1;
bongkwan 0:1aa6d4a96bf1 967
bongkwan 0:1aa6d4a96bf1 968 if (!SCPI_ParamInt(context, &dioN, TRUE))
bongkwan 0:1aa6d4a96bf1 969 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 970
bongkwan 0:1aa6d4a96bf1 971 switch (dioN) {
bongkwan 0:1aa6d4a96bf1 972 case 0: value = radio.dio0.read(); break;
bongkwan 0:1aa6d4a96bf1 973 case 1: value = radio.dio1.read(); break;
bongkwan 0:1aa6d4a96bf1 974 case 2: value = dio2_pin.read(); break;
bongkwan 0:1aa6d4a96bf1 975 case 3: value = dio3_pin.read(); break;
bongkwan 0:1aa6d4a96bf1 976 case 4: value = dio4_pin.read(); break;
bongkwan 0:1aa6d4a96bf1 977 case 5: value = dio5_pin.read(); break;
bongkwan 0:1aa6d4a96bf1 978 default:
bongkwan 0:1aa6d4a96bf1 979 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 980 } // ..switch (dioN)
bongkwan 0:1aa6d4a96bf1 981
bongkwan 0:1aa6d4a96bf1 982 SCPI_ResultInt(context, value);
bongkwan 0:1aa6d4a96bf1 983 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 984 }
bongkwan 0:1aa6d4a96bf1 985
bongkwan 0:1aa6d4a96bf1 986 scpi_result_t radio_freq(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 987 {
bongkwan 0:1aa6d4a96bf1 988 double MHz;
bongkwan 0:1aa6d4a96bf1 989
bongkwan 0:1aa6d4a96bf1 990 if (!SCPI_ParamDouble(context, &MHz, TRUE))
bongkwan 0:1aa6d4a96bf1 991 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 992
bongkwan 0:1aa6d4a96bf1 993 radio.set_frf_MHz(MHz);
bongkwan 0:1aa6d4a96bf1 994
bongkwan 0:1aa6d4a96bf1 995 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 996 }
bongkwan 0:1aa6d4a96bf1 997
bongkwan 0:1aa6d4a96bf1 998 scpi_result_t radio_freqQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 999 {
bongkwan 0:1aa6d4a96bf1 1000 SCPI_ResultDouble(context, radio.get_frf_MHz());
bongkwan 0:1aa6d4a96bf1 1001 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1002 }
bongkwan 0:1aa6d4a96bf1 1003
bongkwan 0:1aa6d4a96bf1 1004 scpi_result_t lora_cr(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1005 {
bongkwan 0:1aa6d4a96bf1 1006 int32_t i;
bongkwan 0:1aa6d4a96bf1 1007
bongkwan 0:1aa6d4a96bf1 1008 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 1009 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1010
bongkwan 0:1aa6d4a96bf1 1011 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1012 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1013
bongkwan 0:1aa6d4a96bf1 1014 lora.setCodingRate(i);
bongkwan 0:1aa6d4a96bf1 1015 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1016 }
bongkwan 0:1aa6d4a96bf1 1017
bongkwan 0:1aa6d4a96bf1 1018 scpi_result_t lora_crQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1019 {
bongkwan 0:1aa6d4a96bf1 1020 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1021 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1022
bongkwan 0:1aa6d4a96bf1 1023 SCPI_ResultInt(context, lora.getCodingRate(false));
bongkwan 0:1aa6d4a96bf1 1024 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1025 }
bongkwan 0:1aa6d4a96bf1 1026
bongkwan 0:1aa6d4a96bf1 1027 scpi_result_t lora_invrx(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1028 {
bongkwan 0:1aa6d4a96bf1 1029 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1030
bongkwan 0:1aa6d4a96bf1 1031 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1032 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1033
bongkwan 0:1aa6d4a96bf1 1034 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1035 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1036
bongkwan 0:1aa6d4a96bf1 1037 lora.invert_rx(param1);
bongkwan 0:1aa6d4a96bf1 1038 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1039 }
bongkwan 0:1aa6d4a96bf1 1040
bongkwan 0:1aa6d4a96bf1 1041 scpi_result_t lora_invrxQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1042 {
bongkwan 0:1aa6d4a96bf1 1043 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1044 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1045
bongkwan 0:1aa6d4a96bf1 1046 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33);
bongkwan 0:1aa6d4a96bf1 1047 SCPI_ResultBool(context, lora.RegTest33.bits.invert_i_q );
bongkwan 0:1aa6d4a96bf1 1048 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1049 }
bongkwan 0:1aa6d4a96bf1 1050
bongkwan 0:1aa6d4a96bf1 1051 scpi_result_t lora_invtx(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1052 {
bongkwan 0:1aa6d4a96bf1 1053 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1054
bongkwan 0:1aa6d4a96bf1 1055 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1056 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1057
bongkwan 0:1aa6d4a96bf1 1058 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1059 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1060
bongkwan 0:1aa6d4a96bf1 1061 lora.invert_tx(param1);
bongkwan 0:1aa6d4a96bf1 1062 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1063 }
bongkwan 0:1aa6d4a96bf1 1064
bongkwan 0:1aa6d4a96bf1 1065 scpi_result_t lora_invtxQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1066 {
bongkwan 0:1aa6d4a96bf1 1067 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1068 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1069
bongkwan 0:1aa6d4a96bf1 1070 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33);
bongkwan 0:1aa6d4a96bf1 1071 SCPI_ResultBool(context, !lora.RegTest33.bits.chirp_invert_tx);
bongkwan 0:1aa6d4a96bf1 1072 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1073 }
bongkwan 0:1aa6d4a96bf1 1074
bongkwan 0:1aa6d4a96bf1 1075 scpi_result_t lora_crc(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1076 {
bongkwan 0:1aa6d4a96bf1 1077 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1078
bongkwan 0:1aa6d4a96bf1 1079 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1080 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1081
bongkwan 0:1aa6d4a96bf1 1082 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1083 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1084
bongkwan 0:1aa6d4a96bf1 1085 lora.setRxPayloadCrcOn(param1);
bongkwan 0:1aa6d4a96bf1 1086 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1087 }
bongkwan 0:1aa6d4a96bf1 1088
bongkwan 0:1aa6d4a96bf1 1089 scpi_result_t lora_crcQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1090 {
bongkwan 0:1aa6d4a96bf1 1091 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1092 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1093
bongkwan 0:1aa6d4a96bf1 1094 SCPI_ResultBool(context, lora.getRxPayloadCrcOn());
bongkwan 0:1aa6d4a96bf1 1095 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1096 }
bongkwan 0:1aa6d4a96bf1 1097
bongkwan 0:1aa6d4a96bf1 1098 scpi_result_t lora_ih(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1099 {
bongkwan 0:1aa6d4a96bf1 1100 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1101
bongkwan 0:1aa6d4a96bf1 1102 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1103 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1104
bongkwan 0:1aa6d4a96bf1 1105 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1106 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1107
bongkwan 0:1aa6d4a96bf1 1108 lora.setHeaderMode(param1);
bongkwan 0:1aa6d4a96bf1 1109 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1110 }
bongkwan 0:1aa6d4a96bf1 1111
bongkwan 0:1aa6d4a96bf1 1112 scpi_result_t lora_ihQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1113 {
bongkwan 0:1aa6d4a96bf1 1114 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1115 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1116
bongkwan 0:1aa6d4a96bf1 1117 SCPI_ResultBool(context, lora.getHeaderMode());
bongkwan 0:1aa6d4a96bf1 1118 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1119 }
bongkwan 0:1aa6d4a96bf1 1120
bongkwan 0:1aa6d4a96bf1 1121 scpi_result_t lora_ldro(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1122 {
bongkwan 0:1aa6d4a96bf1 1123 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1124
bongkwan 0:1aa6d4a96bf1 1125 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1126 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1127
bongkwan 0:1aa6d4a96bf1 1128 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1129 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1130
bongkwan 0:1aa6d4a96bf1 1131 if (radio.type == SX1272) {
bongkwan 0:1aa6d4a96bf1 1132 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
bongkwan 0:1aa6d4a96bf1 1133 lora.RegModemConfig.sx1272bits.LowDataRateOptimize = param1;
bongkwan 0:1aa6d4a96bf1 1134 radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
bongkwan 0:1aa6d4a96bf1 1135 } else if (radio.type == SX1276) {
bongkwan 0:1aa6d4a96bf1 1136 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
bongkwan 0:1aa6d4a96bf1 1137 lora.RegModemConfig3.sx1276bits.LowDataRateOptimize = param1;
bongkwan 0:1aa6d4a96bf1 1138 radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
bongkwan 0:1aa6d4a96bf1 1139 } else
bongkwan 0:1aa6d4a96bf1 1140 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1141
bongkwan 0:1aa6d4a96bf1 1142 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1143 }
bongkwan 0:1aa6d4a96bf1 1144
bongkwan 0:1aa6d4a96bf1 1145 scpi_result_t lora_ldroQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1146 {
bongkwan 0:1aa6d4a96bf1 1147 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1148
bongkwan 0:1aa6d4a96bf1 1149 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1150 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1151
bongkwan 0:1aa6d4a96bf1 1152 if (radio.type == SX1272) {
bongkwan 0:1aa6d4a96bf1 1153 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
bongkwan 0:1aa6d4a96bf1 1154 param1 = lora.RegModemConfig.sx1272bits.LowDataRateOptimize;
bongkwan 0:1aa6d4a96bf1 1155 } else if (radio.type == SX1276) {
bongkwan 0:1aa6d4a96bf1 1156 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
bongkwan 0:1aa6d4a96bf1 1157 param1 = lora.RegModemConfig3.sx1276bits.LowDataRateOptimize;
bongkwan 0:1aa6d4a96bf1 1158 } else
bongkwan 0:1aa6d4a96bf1 1159 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1160
bongkwan 0:1aa6d4a96bf1 1161 SCPI_ResultBool(context, param1);
bongkwan 0:1aa6d4a96bf1 1162 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1163 }
bongkwan 0:1aa6d4a96bf1 1164
bongkwan 0:1aa6d4a96bf1 1165 scpi_result_t lora_bw(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1166 {
bongkwan 0:1aa6d4a96bf1 1167 double KHz;
bongkwan 0:1aa6d4a96bf1 1168
bongkwan 0:1aa6d4a96bf1 1169 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1170 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1171
bongkwan 0:1aa6d4a96bf1 1172 if (!SCPI_ParamDouble(context, &KHz, TRUE))
bongkwan 0:1aa6d4a96bf1 1173 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1174
bongkwan 0:1aa6d4a96bf1 1175 lora.setBw_KHz(KHz);
bongkwan 0:1aa6d4a96bf1 1176 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1177 }
bongkwan 0:1aa6d4a96bf1 1178
bongkwan 0:1aa6d4a96bf1 1179 scpi_result_t lora_bwQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1180 {
bongkwan 0:1aa6d4a96bf1 1181 int bw;
bongkwan 0:1aa6d4a96bf1 1182 double khz;
bongkwan 0:1aa6d4a96bf1 1183
bongkwan 0:1aa6d4a96bf1 1184 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1185 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1186
bongkwan 0:1aa6d4a96bf1 1187 bw = lora.getBw();
bongkwan 0:1aa6d4a96bf1 1188
bongkwan 0:1aa6d4a96bf1 1189 if (radio.type == SX1272) {
bongkwan 0:1aa6d4a96bf1 1190 switch (bw) {
bongkwan 0:1aa6d4a96bf1 1191 case 0: khz = 125; break;
bongkwan 0:1aa6d4a96bf1 1192 case 1: khz = 250; break;
bongkwan 0:1aa6d4a96bf1 1193 case 2: khz = 500; break;
bongkwan 0:1aa6d4a96bf1 1194 default: return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1195 }
bongkwan 0:1aa6d4a96bf1 1196 } else if (radio.type == SX1276) {
bongkwan 0:1aa6d4a96bf1 1197 switch (bw) {
bongkwan 0:1aa6d4a96bf1 1198 case 0: khz = 7.8; break;
bongkwan 0:1aa6d4a96bf1 1199 case 1: khz = 10.4; break;
bongkwan 0:1aa6d4a96bf1 1200 case 2: khz = 15.6; break;
bongkwan 0:1aa6d4a96bf1 1201 case 3: khz = 20.8; break;
bongkwan 0:1aa6d4a96bf1 1202 case 4: khz = 31.25; break;
bongkwan 0:1aa6d4a96bf1 1203 case 5: khz = 41.7; break;
bongkwan 0:1aa6d4a96bf1 1204 case 6: khz = 62.5; break;
bongkwan 0:1aa6d4a96bf1 1205 case 7: khz = 125; break;
bongkwan 0:1aa6d4a96bf1 1206 case 8: khz = 250; break;
bongkwan 0:1aa6d4a96bf1 1207 case 9: khz = 500; break;
bongkwan 0:1aa6d4a96bf1 1208 default: return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1209 }
bongkwan 0:1aa6d4a96bf1 1210 } else
bongkwan 0:1aa6d4a96bf1 1211 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1212
bongkwan 0:1aa6d4a96bf1 1213 SCPI_ResultDouble(context, khz);
bongkwan 0:1aa6d4a96bf1 1214 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1215 }
bongkwan 0:1aa6d4a96bf1 1216
bongkwan 0:1aa6d4a96bf1 1217 scpi_result_t lora_sf(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1218 {
bongkwan 0:1aa6d4a96bf1 1219 int32_t i;
bongkwan 0:1aa6d4a96bf1 1220
bongkwan 0:1aa6d4a96bf1 1221 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1222 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1223
bongkwan 0:1aa6d4a96bf1 1224 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 1225 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1226
bongkwan 0:1aa6d4a96bf1 1227 lora.setSf(i);
bongkwan 0:1aa6d4a96bf1 1228 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1229 }
bongkwan 0:1aa6d4a96bf1 1230
bongkwan 0:1aa6d4a96bf1 1231 scpi_result_t lora_sfQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1232 {
bongkwan 0:1aa6d4a96bf1 1233 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1234 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1235
bongkwan 0:1aa6d4a96bf1 1236 SCPI_ResultInt(context, lora.getSf());
bongkwan 0:1aa6d4a96bf1 1237 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1238 }
bongkwan 0:1aa6d4a96bf1 1239
bongkwan 0:1aa6d4a96bf1 1240 scpi_result_t lora_feiQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1241 {
bongkwan 0:1aa6d4a96bf1 1242 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1243 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1244
bongkwan 0:1aa6d4a96bf1 1245 SCPI_ResultInt(context, lora.get_freq_error_Hz());
bongkwan 0:1aa6d4a96bf1 1246 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1247 }
bongkwan 0:1aa6d4a96bf1 1248
bongkwan 0:1aa6d4a96bf1 1249 scpi_result_t lora_pktsnrQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1250 {
bongkwan 0:1aa6d4a96bf1 1251 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1252 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1253
bongkwan 0:1aa6d4a96bf1 1254 SCPI_ResultDouble(context, lora.RegPktSnrValue / 4.0);
bongkwan 0:1aa6d4a96bf1 1255 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1256 }
bongkwan 0:1aa6d4a96bf1 1257
bongkwan 0:1aa6d4a96bf1 1258 scpi_result_t lora_pktrssiQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1259 {
bongkwan 0:1aa6d4a96bf1 1260 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1261 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1262
bongkwan 0:1aa6d4a96bf1 1263 SCPI_ResultDouble(context, lora.get_pkt_rssi());
bongkwan 0:1aa6d4a96bf1 1264 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1265 }
bongkwan 0:1aa6d4a96bf1 1266
bongkwan 0:1aa6d4a96bf1 1267
bongkwan 0:1aa6d4a96bf1 1268 scpi_result_t lora_prelen(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1269 {
bongkwan 0:1aa6d4a96bf1 1270 int32_t i;
bongkwan 0:1aa6d4a96bf1 1271
bongkwan 0:1aa6d4a96bf1 1272 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1273 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1274
bongkwan 0:1aa6d4a96bf1 1275 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 1276 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1277
bongkwan 0:1aa6d4a96bf1 1278 lora.RegPreamble = i;
bongkwan 0:1aa6d4a96bf1 1279 radio.write_u16(REG_LR_PREAMBLEMSB, lora.RegPreamble);
bongkwan 0:1aa6d4a96bf1 1280 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1281 }
bongkwan 0:1aa6d4a96bf1 1282
bongkwan 0:1aa6d4a96bf1 1283 scpi_result_t lora_prelenQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1284 {
bongkwan 0:1aa6d4a96bf1 1285 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1286 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1287
bongkwan 0:1aa6d4a96bf1 1288 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
bongkwan 0:1aa6d4a96bf1 1289 SCPI_ResultInt(context, lora.RegPreamble);
bongkwan 0:1aa6d4a96bf1 1290 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1291 }
bongkwan 0:1aa6d4a96bf1 1292
bongkwan 0:1aa6d4a96bf1 1293 scpi_result_t lora_txc(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1294 {
bongkwan 0:1aa6d4a96bf1 1295 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1296
bongkwan 0:1aa6d4a96bf1 1297 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1298 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1299
bongkwan 0:1aa6d4a96bf1 1300 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1301 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1302
bongkwan 0:1aa6d4a96bf1 1303 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
bongkwan 0:1aa6d4a96bf1 1304 lora.RegModemConfig2.sx1276bits.TxContinuousMode = param1;
bongkwan 0:1aa6d4a96bf1 1305 radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet);
bongkwan 0:1aa6d4a96bf1 1306
bongkwan 0:1aa6d4a96bf1 1307 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1308 }
bongkwan 0:1aa6d4a96bf1 1309
bongkwan 0:1aa6d4a96bf1 1310 scpi_result_t lora_txcQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1311 {
bongkwan 0:1aa6d4a96bf1 1312 if (!is_lora())
bongkwan 0:1aa6d4a96bf1 1313 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1314
bongkwan 0:1aa6d4a96bf1 1315 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
bongkwan 0:1aa6d4a96bf1 1316 SCPI_ResultBool(context, lora.RegModemConfig2.sx1276bits.TxContinuousMode);
bongkwan 0:1aa6d4a96bf1 1317
bongkwan 0:1aa6d4a96bf1 1318 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1319 }
bongkwan 0:1aa6d4a96bf1 1320
bongkwan 0:1aa6d4a96bf1 1321
bongkwan 0:1aa6d4a96bf1 1322 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 1323 scpi_result_t pd2_set(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1324 {
bongkwan 0:1aa6d4a96bf1 1325 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1326
bongkwan 0:1aa6d4a96bf1 1327 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1328 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1329
bongkwan 0:1aa6d4a96bf1 1330 pd2 = param1;
bongkwan 0:1aa6d4a96bf1 1331 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1332 }
bongkwan 0:1aa6d4a96bf1 1333
bongkwan 0:1aa6d4a96bf1 1334 scpi_result_t pd2_get(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1335 {
bongkwan 0:1aa6d4a96bf1 1336 SCPI_ResultBool(context, pd2.read());
bongkwan 0:1aa6d4a96bf1 1337 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1338 }
bongkwan 0:1aa6d4a96bf1 1339
bongkwan 0:1aa6d4a96bf1 1340 scpi_result_t rfswQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1341 {
bongkwan 0:1aa6d4a96bf1 1342 SCPI_ResultBool(context, rfsw1.read());
bongkwan 0:1aa6d4a96bf1 1343 SCPI_ResultBool(context, rfsw2.read());
bongkwan 0:1aa6d4a96bf1 1344 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1345 }
bongkwan 0:1aa6d4a96bf1 1346
bongkwan 0:1aa6d4a96bf1 1347 scpi_result_t vbatQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1348 {
bongkwan 0:1aa6d4a96bf1 1349 bool bat_flag = false;
bongkwan 0:1aa6d4a96bf1 1350 bool BatOffState;
bongkwan 0:1aa6d4a96bf1 1351
bongkwan 0:1aa6d4a96bf1 1352 if(gps.en_invert == true)
bongkwan 0:1aa6d4a96bf1 1353 BatOffState = true;
bongkwan 0:1aa6d4a96bf1 1354 else
bongkwan 0:1aa6d4a96bf1 1355 BatOffState = false;
bongkwan 0:1aa6d4a96bf1 1356
bongkwan 0:1aa6d4a96bf1 1357 if(gps_en == BatOffState)
bongkwan 0:1aa6d4a96bf1 1358 {
bongkwan 0:1aa6d4a96bf1 1359 bat_flag = true;
bongkwan 0:1aa6d4a96bf1 1360 gps.enable(1);
bongkwan 0:1aa6d4a96bf1 1361 }
bongkwan 0:1aa6d4a96bf1 1362
bongkwan 0:1aa6d4a96bf1 1363 SCPI_ResultDouble(context, bat->read()*AIN_VREF*AIN_VBAT_DIV);
bongkwan 0:1aa6d4a96bf1 1364
bongkwan 0:1aa6d4a96bf1 1365 if(bat_flag)
bongkwan 0:1aa6d4a96bf1 1366 gps.enable(0);
bongkwan 0:1aa6d4a96bf1 1367
bongkwan 0:1aa6d4a96bf1 1368 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1369 }
bongkwan 0:1aa6d4a96bf1 1370
bongkwan 0:1aa6d4a96bf1 1371 scpi_result_t gps_enable(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1372 {
bongkwan 0:1aa6d4a96bf1 1373 scpi_bool_t param1;
bongkwan 0:1aa6d4a96bf1 1374
bongkwan 0:1aa6d4a96bf1 1375 if (!SCPI_ParamBool(context, &param1, TRUE))
bongkwan 0:1aa6d4a96bf1 1376 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1377
bongkwan 0:1aa6d4a96bf1 1378 gps.enable(param1);
bongkwan 0:1aa6d4a96bf1 1379 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1380 }
bongkwan 0:1aa6d4a96bf1 1381
bongkwan 0:1aa6d4a96bf1 1382 scpi_result_t gps_enableQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1383 {
bongkwan 0:1aa6d4a96bf1 1384 SCPI_ResultBool(context, gps.enabled());
bongkwan 0:1aa6d4a96bf1 1385
bongkwan 0:1aa6d4a96bf1 1386 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1387 }
bongkwan 0:1aa6d4a96bf1 1388
bongkwan 0:1aa6d4a96bf1 1389 scpi_result_t gps_numCords(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1390 {
bongkwan 0:1aa6d4a96bf1 1391 int32_t i;
bongkwan 0:1aa6d4a96bf1 1392
bongkwan 0:1aa6d4a96bf1 1393 if (!SCPI_ParamInt(context, &i, TRUE))
bongkwan 0:1aa6d4a96bf1 1394 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1395
bongkwan 0:1aa6d4a96bf1 1396 gps_coord_cnt = i;
bongkwan 0:1aa6d4a96bf1 1397 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1398 }
bongkwan 0:1aa6d4a96bf1 1399
bongkwan 0:1aa6d4a96bf1 1400 scpi_result_t gps_numCordsQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1401 {
bongkwan 0:1aa6d4a96bf1 1402 SCPI_ResultInt(context, gps_coord_cnt);
bongkwan 0:1aa6d4a96bf1 1403 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1404 }
bongkwan 0:1aa6d4a96bf1 1405
bongkwan 0:1aa6d4a96bf1 1406 scpi_result_t gps_longitude(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1407 {
bongkwan 0:1aa6d4a96bf1 1408 if (!SCPI_ParamDouble(context, &gps.Longitude, TRUE))
bongkwan 0:1aa6d4a96bf1 1409 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1410
bongkwan 0:1aa6d4a96bf1 1411 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1412 }
bongkwan 0:1aa6d4a96bf1 1413
bongkwan 0:1aa6d4a96bf1 1414 scpi_result_t gps_longitudeQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1415 {
bongkwan 0:1aa6d4a96bf1 1416 SCPI_ResultDouble(context, gps.Longitude);
bongkwan 0:1aa6d4a96bf1 1417 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1418 }
bongkwan 0:1aa6d4a96bf1 1419
bongkwan 0:1aa6d4a96bf1 1420 scpi_result_t gps_latitude(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1421 {
bongkwan 0:1aa6d4a96bf1 1422 if (!SCPI_ParamDouble(context, &gps.Latitude, TRUE))
bongkwan 0:1aa6d4a96bf1 1423 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1424
bongkwan 0:1aa6d4a96bf1 1425 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1426 }
bongkwan 0:1aa6d4a96bf1 1427
bongkwan 0:1aa6d4a96bf1 1428 scpi_result_t gps_latitudeQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1429 {
bongkwan 0:1aa6d4a96bf1 1430 SCPI_ResultDouble(context, gps.Latitude);
bongkwan 0:1aa6d4a96bf1 1431 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1432 }
bongkwan 0:1aa6d4a96bf1 1433
bongkwan 0:1aa6d4a96bf1 1434 scpi_result_t mma_idQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1435 {
bongkwan 0:1aa6d4a96bf1 1436 SCPI_ResultIntBase(context, mma8451q.read_single(MMA8451_ID), 16);
bongkwan 0:1aa6d4a96bf1 1437 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1438 }
bongkwan 0:1aa6d4a96bf1 1439
bongkwan 0:1aa6d4a96bf1 1440 scpi_result_t mpl_idQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1441 {
bongkwan 0:1aa6d4a96bf1 1442 SCPI_ResultIntBase(context, mpl3115a2.read(MPL3115_ID), 16);
bongkwan 0:1aa6d4a96bf1 1443 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1444 }
bongkwan 0:1aa6d4a96bf1 1445
bongkwan 0:1aa6d4a96bf1 1446 scpi_result_t sx9500_reset(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1447 {
bongkwan 0:1aa6d4a96bf1 1448 sx9500.reset();
bongkwan 0:1aa6d4a96bf1 1449 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1450 }
bongkwan 0:1aa6d4a96bf1 1451
bongkwan 0:1aa6d4a96bf1 1452 scpi_result_t sx9500_reg(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1453 {
bongkwan 0:1aa6d4a96bf1 1454 int32_t addr, data;
bongkwan 0:1aa6d4a96bf1 1455
bongkwan 0:1aa6d4a96bf1 1456 if (!SCPI_ParamInt(context, &addr, TRUE))
bongkwan 0:1aa6d4a96bf1 1457 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1458
bongkwan 0:1aa6d4a96bf1 1459 if (!SCPI_ParamInt(context, &data, TRUE))
bongkwan 0:1aa6d4a96bf1 1460 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1461
bongkwan 0:1aa6d4a96bf1 1462 sx9500.write(addr, data);
bongkwan 0:1aa6d4a96bf1 1463
bongkwan 0:1aa6d4a96bf1 1464 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1465 }
bongkwan 0:1aa6d4a96bf1 1466
bongkwan 0:1aa6d4a96bf1 1467 scpi_result_t sx9500_regQ(scpi_t* context)
bongkwan 0:1aa6d4a96bf1 1468 {
bongkwan 0:1aa6d4a96bf1 1469 int32_t addr;
bongkwan 0:1aa6d4a96bf1 1470
bongkwan 0:1aa6d4a96bf1 1471 if (!SCPI_ParamInt(context, &addr, TRUE))
bongkwan 0:1aa6d4a96bf1 1472 return SCPI_RES_ERR;
bongkwan 0:1aa6d4a96bf1 1473
bongkwan 0:1aa6d4a96bf1 1474 SCPI_ResultIntBase(context, sx9500.read_single(addr), 16);
bongkwan 0:1aa6d4a96bf1 1475 return SCPI_RES_OK;
bongkwan 0:1aa6d4a96bf1 1476 }
bongkwan 0:1aa6d4a96bf1 1477
bongkwan 0:1aa6d4a96bf1 1478 #endif /* TARGET_MOTE_L152RC */
bongkwan 0:1aa6d4a96bf1 1479
bongkwan 0:1aa6d4a96bf1 1480 static const scpi_command_t scpi_commands[] = {
bongkwan 0:1aa6d4a96bf1 1481 // http://na.support.keysight.com/pna/help/latest/Programming/GP-IB_Command_Finder/Common_Commands.htm
bongkwan 0:1aa6d4a96bf1 1482 /* IEEE Mandated Commands (SCPI std V1999.0 4.1.1) */
bongkwan 0:1aa6d4a96bf1 1483 { .pattern = "*CLS", .callback = SCPI_CoreCls,}, // clear status
bongkwan 0:1aa6d4a96bf1 1484 { .pattern = "*ESE", .callback = SCPI_CoreEse,}, // standard event status enable
bongkwan 0:1aa6d4a96bf1 1485 { .pattern = "*ESE?", .callback = SCPI_CoreEseQ,},
bongkwan 0:1aa6d4a96bf1 1486 { .pattern = "*ESR?", .callback = SCPI_CoreEsrQ,}, // event status query
bongkwan 0:1aa6d4a96bf1 1487 { .pattern = "*IDN?", .callback = SCPI_CoreIdnQ,}, // identification query
bongkwan 0:1aa6d4a96bf1 1488 { .pattern = "*OPC", .callback = SCPI_CoreOpc,}, // operation complete command
bongkwan 0:1aa6d4a96bf1 1489 { .pattern = "*OPC?", .callback = SCPI_CoreOpcQ,}, // operation complete query
bongkwan 0:1aa6d4a96bf1 1490 { .pattern = "*RST", .callback = SCPI_CoreRst,}, // reset command
bongkwan 0:1aa6d4a96bf1 1491 { .pattern = "*SRE", .callback = SCPI_CoreSre,}, // service request enable command
bongkwan 0:1aa6d4a96bf1 1492 { .pattern = "*SRE?", .callback = SCPI_CoreSreQ,}, // service request enable query
bongkwan 0:1aa6d4a96bf1 1493 { .pattern = "*STB?", .callback = SCPI_CoreStbQ,}, // status byte register query
bongkwan 0:1aa6d4a96bf1 1494 { .pattern = "*TST?", .callback = SCPI_CoreTstQ,}, // self-test query
bongkwan 0:1aa6d4a96bf1 1495 { .pattern = "*WAI", .callback = SCPI_CoreWai,}, // wait to continue
bongkwan 0:1aa6d4a96bf1 1496
bongkwan 0:1aa6d4a96bf1 1497 /* Required SCPI commands (SCPI std V1999.0 4.2.1) */
bongkwan 0:1aa6d4a96bf1 1498 {.pattern = "SYSTem:ERRor[:NEXT]?", .callback = SCPI_SystemErrorNextQ,},
bongkwan 0:1aa6d4a96bf1 1499 {.pattern = "SYSTem:ERRor:COUNt?", .callback = SCPI_SystemErrorCountQ,},
bongkwan 0:1aa6d4a96bf1 1500 {.pattern = "SYSTem:VERSion?", .callback = SCPI_SystemVersionQ,},
bongkwan 0:1aa6d4a96bf1 1501
bongkwan 0:1aa6d4a96bf1 1502 //{.pattern = "STATus:OPERation?", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1503 //{.pattern = "STATus:OPERation:EVENt?", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1504 //{.pattern = "STATus:OPERation:CONDition?", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1505 //{.pattern = "STATus:OPERation:ENABle", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1506 //{.pattern = "STATus:OPERation:ENABle?", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1507
bongkwan 0:1aa6d4a96bf1 1508 {.pattern = "STATus:QUEStionable[:EVENt]?", .callback = SCPI_StatusQuestionableEventQ,},
bongkwan 0:1aa6d4a96bf1 1509 //{.pattern = "STATus:QUEStionable:CONDition?", .callback = scpi_stub_callback,},
bongkwan 0:1aa6d4a96bf1 1510 {.pattern = "STATus:QUEStionable:ENABle", .callback = SCPI_StatusQuestionableEnable,},
bongkwan 0:1aa6d4a96bf1 1511 {.pattern = "STATus:QUEStionable:ENABle?", .callback = SCPI_StatusQuestionableEnableQ,},
bongkwan 0:1aa6d4a96bf1 1512
bongkwan 0:1aa6d4a96bf1 1513 {.pattern = "STATus:PRESet", .callback = SCPI_StatusPreset,},
bongkwan 0:1aa6d4a96bf1 1514
bongkwan 0:1aa6d4a96bf1 1515 /* DMM */
bongkwan 0:1aa6d4a96bf1 1516 /*
bongkwan 0:1aa6d4a96bf1 1517 {.pattern = "SYSTem:COMMunication:TCPIP:CONTROL?", .callback = SCPI_SystemCommTcpipControlQ,},
bongkwan 0:1aa6d4a96bf1 1518
bongkwan 0:1aa6d4a96bf1 1519 {.pattern = "TEST:BOOL", .callback = TEST_Bool,},
bongkwan 0:1aa6d4a96bf1 1520 {.pattern = "TEST#:NUMbers#", .callback = TEST_Numbers,},*/
bongkwan 0:1aa6d4a96bf1 1521
bongkwan 0:1aa6d4a96bf1 1522 /*{.pattern = "TEST:CHOice?", .callback = TEST_ChoiceQ,},*/
bongkwan 0:1aa6d4a96bf1 1523
bongkwan 0:1aa6d4a96bf1 1524 {.pattern = "BUSY?", .callback = tx_busyQ,},
bongkwan 0:1aa6d4a96bf1 1525
bongkwan 0:1aa6d4a96bf1 1526 {.pattern = "RAdio:FIfo", .callback = radio_fifo,},
bongkwan 0:1aa6d4a96bf1 1527 {.pattern = "RAdio:FIfo?", .callback = radio_fifoQ,},
bongkwan 0:1aa6d4a96bf1 1528 {.pattern = "RAdio:BINFIfo", .callback = radio_binFifo,},
bongkwan 0:1aa6d4a96bf1 1529 {.pattern = "RAdio:BINFIfo?", .callback = radio_binFifoQ,},
bongkwan 0:1aa6d4a96bf1 1530 {.pattern = "RAdio:MODulation", .callback = radio_modulation,},
bongkwan 0:1aa6d4a96bf1 1531 {.pattern = "RAdio:MODulation?", .callback = radio_modulationQ,},
bongkwan 0:1aa6d4a96bf1 1532 {.pattern = "RAdio:RSSI?", .callback = radio_rssiQ,},
bongkwan 0:1aa6d4a96bf1 1533 {.pattern = "RAdio:OPmode", .callback = radio_opmode,},
bongkwan 0:1aa6d4a96bf1 1534 {.pattern = "RAdio:OPmode?", .callback = radio_opmodeQ,},
bongkwan 0:1aa6d4a96bf1 1535 {.pattern = "RAdio:PASelect", .callback = radio_PASelect,},
bongkwan 0:1aa6d4a96bf1 1536 {.pattern = "RAdio:PASelect?", .callback = radio_PASelectQ,},
bongkwan 0:1aa6d4a96bf1 1537 {.pattern = "RAdio:OCP", .callback = radio_ocp,},
bongkwan 0:1aa6d4a96bf1 1538 {.pattern = "RAdio:OCP?", .callback = radio_ocpQ,},
bongkwan 0:1aa6d4a96bf1 1539 {.pattern = "RAdio:POWer", .callback = radio_power,},
bongkwan 0:1aa6d4a96bf1 1540 {.pattern = "RAdio:POWer?", .callback = radio_powerQ,},
bongkwan 0:1aa6d4a96bf1 1541 {.pattern = "RAdio:BGR", .callback = radio_bgr,},
bongkwan 0:1aa6d4a96bf1 1542 {.pattern = "RAdio:BGR?", .callback = radio_bgrQ,},
bongkwan 0:1aa6d4a96bf1 1543 {.pattern = "RAdio:LNABoost", .callback = radio_lnaBoost,},
bongkwan 0:1aa6d4a96bf1 1544 {.pattern = "RAdio:LNABoost?", .callback = radio_lnaBoostQ,},
bongkwan 0:1aa6d4a96bf1 1545 {.pattern = "RAdio:FREQuency", .callback = radio_freq,},
bongkwan 0:1aa6d4a96bf1 1546 {.pattern = "RAdio:FREQuency?", .callback = radio_freqQ,},
bongkwan 0:1aa6d4a96bf1 1547 {.pattern = "RAdio:DIOMap", .callback = radio_diomap,},
bongkwan 0:1aa6d4a96bf1 1548 {.pattern = "RAdio:DIOMap?", .callback = radio_diomapQ,},
bongkwan 0:1aa6d4a96bf1 1549 {.pattern = "RAdio:DIO?", .callback = radio_dioQ,},
bongkwan 0:1aa6d4a96bf1 1550 {.pattern = "RAdio:REGister", .callback = radio_reg,},
bongkwan 0:1aa6d4a96bf1 1551 {.pattern = "RAdio:REGister?", .callback = radio_regQ,},
bongkwan 0:1aa6d4a96bf1 1552
bongkwan 0:1aa6d4a96bf1 1553 {.pattern = "RAdio:FSK:SYNC", .callback = fsk_sync,},
bongkwan 0:1aa6d4a96bf1 1554 {.pattern = "RAdio:FSK:SYNC?", .callback = fsk_syncQ,},
bongkwan 0:1aa6d4a96bf1 1555 {.pattern = "RAdio:FSK:FDev", .callback = fsk_fdev,},
bongkwan 0:1aa6d4a96bf1 1556 {.pattern = "RAdio:FSK:FDev?", .callback = fsk_fdevQ,},
bongkwan 0:1aa6d4a96bf1 1557 {.pattern = "RAdio:FSK:BITRate", .callback = fsk_bitrate,},
bongkwan 0:1aa6d4a96bf1 1558 {.pattern = "RAdio:FSK:BITRate?", .callback = fsk_bitrateQ,},
bongkwan 0:1aa6d4a96bf1 1559 {.pattern = "RAdio:FSK:PRELen", .callback = fsk_prelen,},
bongkwan 0:1aa6d4a96bf1 1560 {.pattern = "RAdio:FSK:PRELen?", .callback = fsk_prelenQ,},
bongkwan 0:1aa6d4a96bf1 1561 {.pattern = "RAdio:FSK:RXBW", .callback = fsk_rxbw,},
bongkwan 0:1aa6d4a96bf1 1562 {.pattern = "RAdio:FSK:RXBW?", .callback = fsk_rxbwQ,},
bongkwan 0:1aa6d4a96bf1 1563 {.pattern = "RAdio:FSK:AFCBW", .callback = fsk_afcbw,},
bongkwan 0:1aa6d4a96bf1 1564 {.pattern = "RAdio:FSK:AFCBW?", .callback = fsk_afcbwQ,},
bongkwan 0:1aa6d4a96bf1 1565 {.pattern = "RAdio:FSK:DCFree", .callback = fsk_dcfree,},
bongkwan 0:1aa6d4a96bf1 1566 {.pattern = "RAdio:FSK:DCFree?", .callback = fsk_dcfreeQ,},
bongkwan 0:1aa6d4a96bf1 1567 {.pattern = "RAdio:FSK:RXTrigger", .callback = fsk_rxtrig,},
bongkwan 0:1aa6d4a96bf1 1568 {.pattern = "RAdio:FSK:RXTrigger?", .callback = fsk_rxtrigQ,},
bongkwan 0:1aa6d4a96bf1 1569 {.pattern = "RAdio:FSK:DATAMode", .callback = fsk_datamode,},
bongkwan 0:1aa6d4a96bf1 1570 {.pattern = "RAdio:FSK:DATAMode?", .callback = fsk_datamodeQ,},
bongkwan 0:1aa6d4a96bf1 1571 {.pattern = "RAdio:FSK:BT", .callback = fsk_bt,},
bongkwan 0:1aa6d4a96bf1 1572 {.pattern = "RAdio:FSK:BT?", .callback = fsk_btQ,},
bongkwan 0:1aa6d4a96bf1 1573
bongkwan 0:1aa6d4a96bf1 1574 {.pattern = "RAdio:LORa:BW", .callback = lora_bw,},
bongkwan 0:1aa6d4a96bf1 1575 {.pattern = "RAdio:LORa:BW?", .callback = lora_bwQ,},
bongkwan 0:1aa6d4a96bf1 1576 {.pattern = "RAdio:LORa:SF", .callback = lora_sf,},
bongkwan 0:1aa6d4a96bf1 1577 {.pattern = "RAdio:LORa:SF?", .callback = lora_sfQ,},
bongkwan 0:1aa6d4a96bf1 1578 {.pattern = "RAdio:LORa:TXContinuous", .callback = lora_txc,},
bongkwan 0:1aa6d4a96bf1 1579 {.pattern = "RAdio:LORa:TXContinuous?", .callback = lora_txcQ,},
bongkwan 0:1aa6d4a96bf1 1580 {.pattern = "RAdio:LORa:PRELen", .callback = lora_prelen,},
bongkwan 0:1aa6d4a96bf1 1581 {.pattern = "RAdio:LORa:PRELen?", .callback = lora_prelenQ,},
bongkwan 0:1aa6d4a96bf1 1582 {.pattern = "RAdio:LORa:CR", .callback = lora_cr,},
bongkwan 0:1aa6d4a96bf1 1583 {.pattern = "RAdio:LORa:CR?", .callback = lora_crQ,},
bongkwan 0:1aa6d4a96bf1 1584 {.pattern = "RAdio:LORa:LDRO", .callback = lora_ldro,},
bongkwan 0:1aa6d4a96bf1 1585 {.pattern = "RAdio:LORa:LDRO?", .callback = lora_ldroQ,},
bongkwan 0:1aa6d4a96bf1 1586 {.pattern = "RAdio:LORa:FEI?", .callback = lora_feiQ,},
bongkwan 0:1aa6d4a96bf1 1587 {.pattern = "RAdio:LORa:PKTSnr?", .callback = lora_pktsnrQ,},
bongkwan 0:1aa6d4a96bf1 1588 {.pattern = "RAdio:LORa:PKTRssi?", .callback = lora_pktrssiQ,},
bongkwan 0:1aa6d4a96bf1 1589 {.pattern = "RAdio:LORa:Ih", .callback = lora_ih,},
bongkwan 0:1aa6d4a96bf1 1590 {.pattern = "RAdio:LORa:Ih?", .callback = lora_ihQ,},
bongkwan 0:1aa6d4a96bf1 1591 {.pattern = "RAdio:LORa:CRC", .callback = lora_crc,},
bongkwan 0:1aa6d4a96bf1 1592 {.pattern = "RAdio:LORa:CRC?", .callback = lora_crcQ,},
bongkwan 0:1aa6d4a96bf1 1593 {.pattern = "RAdio:LORa:INVRx", .callback = lora_invrx,},
bongkwan 0:1aa6d4a96bf1 1594 {.pattern = "RAdio:LORa:INVRx?", .callback = lora_invrxQ,},
bongkwan 0:1aa6d4a96bf1 1595 {.pattern = "RAdio:LORa:INVTx", .callback = lora_invtx,},
bongkwan 0:1aa6d4a96bf1 1596 {.pattern = "RAdio:LORa:INVTx?", .callback = lora_invtxQ,},
bongkwan 0:1aa6d4a96bf1 1597
bongkwan 0:1aa6d4a96bf1 1598 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 1599 {.pattern = "PD2", .callback = pd2_set,},
bongkwan 0:1aa6d4a96bf1 1600 {.pattern = "PD2?", .callback = pd2_get,},
bongkwan 0:1aa6d4a96bf1 1601 {.pattern = "RFSW?", .callback = rfswQ,},
bongkwan 0:1aa6d4a96bf1 1602 {.pattern = "VBAT?", .callback = vbatQ,},
bongkwan 0:1aa6d4a96bf1 1603
bongkwan 0:1aa6d4a96bf1 1604 {.pattern = "GPS:ENable", .callback = gps_enable,},
bongkwan 0:1aa6d4a96bf1 1605 {.pattern = "GPS:ENable?", .callback = gps_enableQ,},
bongkwan 0:1aa6d4a96bf1 1606 {.pattern = "GPS:NUMCoords", .callback = gps_numCords,},
bongkwan 0:1aa6d4a96bf1 1607 {.pattern = "GPS:NUMCoords?", .callback = gps_numCordsQ,},
bongkwan 0:1aa6d4a96bf1 1608 {.pattern = "GPS:LOngitude", .callback = gps_longitude,},
bongkwan 0:1aa6d4a96bf1 1609 {.pattern = "GPS:LOngitude?", .callback = gps_longitudeQ,},
bongkwan 0:1aa6d4a96bf1 1610 {.pattern = "GPS:LAtitude", .callback = gps_latitude,},
bongkwan 0:1aa6d4a96bf1 1611 {.pattern = "GPS:LAtitude?", .callback = gps_latitudeQ,},
bongkwan 0:1aa6d4a96bf1 1612
bongkwan 0:1aa6d4a96bf1 1613 {.pattern = "MMA:ID?", .callback = mma_idQ,},
bongkwan 0:1aa6d4a96bf1 1614
bongkwan 0:1aa6d4a96bf1 1615 {.pattern = "MPL:ID?", .callback = mpl_idQ,},
bongkwan 0:1aa6d4a96bf1 1616
bongkwan 0:1aa6d4a96bf1 1617 {.pattern = "SX9500:RST", .callback = sx9500_reset,},
bongkwan 0:1aa6d4a96bf1 1618 {.pattern = "SX9500:REGister", .callback = sx9500_reg,},
bongkwan 0:1aa6d4a96bf1 1619 {.pattern = "SX9500:REGister?", .callback = sx9500_regQ,},
bongkwan 0:1aa6d4a96bf1 1620
bongkwan 0:1aa6d4a96bf1 1621 #endif /* TARGET_MOTE_L152RC */
bongkwan 0:1aa6d4a96bf1 1622
bongkwan 0:1aa6d4a96bf1 1623 SCPI_CMD_LIST_END
bongkwan 0:1aa6d4a96bf1 1624 };
bongkwan 0:1aa6d4a96bf1 1625
bongkwan 0:1aa6d4a96bf1 1626 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 1627 void get_mote_version()
bongkwan 0:1aa6d4a96bf1 1628 {
bongkwan 0:1aa6d4a96bf1 1629 char first;
bongkwan 0:1aa6d4a96bf1 1630
bongkwan 0:1aa6d4a96bf1 1631 pc_7 = 1;
bongkwan 0:1aa6d4a96bf1 1632 first = pc_1;
bongkwan 0:1aa6d4a96bf1 1633 pc_7 = 0;
bongkwan 0:1aa6d4a96bf1 1634 if (first && !pc_1) {
bongkwan 0:1aa6d4a96bf1 1635 mote_version = MOTE_V2;
bongkwan 0:1aa6d4a96bf1 1636 bat = new AnalogIn(PA_0);
bongkwan 0:1aa6d4a96bf1 1637 } else {
bongkwan 0:1aa6d4a96bf1 1638 mote_version = MOTE_V3;
bongkwan 0:1aa6d4a96bf1 1639 bat = new AnalogIn(PA_1);
bongkwan 0:1aa6d4a96bf1 1640 }
bongkwan 0:1aa6d4a96bf1 1641 }
bongkwan 0:1aa6d4a96bf1 1642 #endif
bongkwan 0:1aa6d4a96bf1 1643
bongkwan 0:1aa6d4a96bf1 1644 static scpi_interface_t scpi_interface = {
bongkwan 0:1aa6d4a96bf1 1645 .error = SCPI_Error,
bongkwan 0:1aa6d4a96bf1 1646 .write = SCPI_Write,
bongkwan 0:1aa6d4a96bf1 1647 .control = SCPI_Control,
bongkwan 0:1aa6d4a96bf1 1648 .flush = SCPI_Flush,
bongkwan 0:1aa6d4a96bf1 1649 .reset = SCPI_Reset,
bongkwan 0:1aa6d4a96bf1 1650 };
bongkwan 0:1aa6d4a96bf1 1651
bongkwan 0:1aa6d4a96bf1 1652 #define SCPI_INPUT_BUFFER_LENGTH 256
bongkwan 0:1aa6d4a96bf1 1653 static char scpi_input_buffer[SCPI_INPUT_BUFFER_LENGTH];
bongkwan 0:1aa6d4a96bf1 1654 static scpi_reg_val_t scpi_regs[SCPI_REG_COUNT];
bongkwan 0:1aa6d4a96bf1 1655
bongkwan 0:1aa6d4a96bf1 1656 scpi_t scpi_context = {
bongkwan 0:1aa6d4a96bf1 1657 cmdlist : scpi_commands,
bongkwan 0:1aa6d4a96bf1 1658 buffer : {
bongkwan 0:1aa6d4a96bf1 1659 length : SCPI_INPUT_BUFFER_LENGTH,
bongkwan 0:1aa6d4a96bf1 1660 position : 0,
bongkwan 0:1aa6d4a96bf1 1661 data : scpi_input_buffer
bongkwan 0:1aa6d4a96bf1 1662 },
bongkwan 0:1aa6d4a96bf1 1663 param_list : { 0 },
bongkwan 0:1aa6d4a96bf1 1664 interface : &scpi_interface,
bongkwan 0:1aa6d4a96bf1 1665 output_count : 0,
bongkwan 0:1aa6d4a96bf1 1666 input_count : 0,
bongkwan 0:1aa6d4a96bf1 1667 cmd_error : false,
bongkwan 0:1aa6d4a96bf1 1668 error_queue : NULL,
bongkwan 0:1aa6d4a96bf1 1669 registers : scpi_regs,
bongkwan 0:1aa6d4a96bf1 1670 units : scpi_units_def,
bongkwan 0:1aa6d4a96bf1 1671 user_context : NULL,
bongkwan 0:1aa6d4a96bf1 1672 parser_state : {
bongkwan 0:1aa6d4a96bf1 1673 programHeader : { SCPI_TOKEN_UNKNOWN, NULL, 0 },
bongkwan 0:1aa6d4a96bf1 1674 programData : { SCPI_TOKEN_UNKNOWN, NULL, 0 },
bongkwan 0:1aa6d4a96bf1 1675 numberOfParameters : 0,
bongkwan 0:1aa6d4a96bf1 1676 termination : SCPI_MESSAGE_TERMINATION_NONE
bongkwan 0:1aa6d4a96bf1 1677 },
bongkwan 0:1aa6d4a96bf1 1678 idn : {"semtech", "na-mote", NULL, "01-02"}
bongkwan 0:1aa6d4a96bf1 1679 };
bongkwan 0:1aa6d4a96bf1 1680
bongkwan 0:1aa6d4a96bf1 1681 void scpi_def_init()
bongkwan 0:1aa6d4a96bf1 1682 {
bongkwan 0:1aa6d4a96bf1 1683 radio.rf_switch = rfsw_callback;
bongkwan 0:1aa6d4a96bf1 1684 radio.get_frf_MHz(); // get HF bit
bongkwan 0:1aa6d4a96bf1 1685
bongkwan 0:1aa6d4a96bf1 1686 #ifdef TARGET_MOTE_L152RC
bongkwan 0:1aa6d4a96bf1 1687
bongkwan 0:1aa6d4a96bf1 1688 get_mote_version();
bongkwan 0:1aa6d4a96bf1 1689 if (mote_version == MOTE_V3) {
bongkwan 0:1aa6d4a96bf1 1690 gps.en_invert = false;
bongkwan 0:1aa6d4a96bf1 1691 scpi_context.idn[3] = "3";
bongkwan 0:1aa6d4a96bf1 1692 } else {
bongkwan 0:1aa6d4a96bf1 1693 gps.en_invert = true;
bongkwan 0:1aa6d4a96bf1 1694 scpi_context.idn[3] = "2";
bongkwan 0:1aa6d4a96bf1 1695 }
bongkwan 0:1aa6d4a96bf1 1696
bongkwan 0:1aa6d4a96bf1 1697 gps.init();
bongkwan 0:1aa6d4a96bf1 1698
bongkwan 0:1aa6d4a96bf1 1699 #endif /* TARGET_MOTE_L152RC */
bongkwan 0:1aa6d4a96bf1 1700 }