Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * Copyright (c) 2018, Arm Limited and affiliates
kadonotakashi 0:8fdf9a60065b 3 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 4 *
kadonotakashi 0:8fdf9a60065b 5 * Licensed under the Apache License, Version 2.0 (the "License");
kadonotakashi 0:8fdf9a60065b 6 * you may not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 7 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 8 *
kadonotakashi 0:8fdf9a60065b 9 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 12 * distributed under the License is distributed on an "AS IS" BASIS,
kadonotakashi 0:8fdf9a60065b 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 14 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 15 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 16 */
kadonotakashi 0:8fdf9a60065b 17
kadonotakashi 0:8fdf9a60065b 18 #include "gtest/gtest.h"
kadonotakashi 0:8fdf9a60065b 19 #include "LoRaPHY.h"
kadonotakashi 0:8fdf9a60065b 20
kadonotakashi 0:8fdf9a60065b 21 #include "LoRaWANTimer_stub.h"
kadonotakashi 0:8fdf9a60065b 22
kadonotakashi 0:8fdf9a60065b 23 class my_LoRaPHY : public LoRaPHY
kadonotakashi 0:8fdf9a60065b 24 {
kadonotakashi 0:8fdf9a60065b 25 public:
kadonotakashi 0:8fdf9a60065b 26 my_LoRaPHY(){phy_params.adr_ack_delay = 1;}
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 virtual ~my_LoRaPHY(){}
kadonotakashi 0:8fdf9a60065b 29
kadonotakashi 0:8fdf9a60065b 30 loraphy_params_t &get_phy_params() {
kadonotakashi 0:8fdf9a60065b 31 return phy_params;
kadonotakashi 0:8fdf9a60065b 32 }
kadonotakashi 0:8fdf9a60065b 33 };
kadonotakashi 0:8fdf9a60065b 34
kadonotakashi 0:8fdf9a60065b 35 class my_radio : public LoRaRadio
kadonotakashi 0:8fdf9a60065b 36 {
kadonotakashi 0:8fdf9a60065b 37 public:
kadonotakashi 0:8fdf9a60065b 38
kadonotakashi 0:8fdf9a60065b 39 virtual void init_radio(radio_events_t *events){};
kadonotakashi 0:8fdf9a60065b 40
kadonotakashi 0:8fdf9a60065b 41 virtual void radio_reset(){};
kadonotakashi 0:8fdf9a60065b 42
kadonotakashi 0:8fdf9a60065b 43 virtual void sleep(void){};
kadonotakashi 0:8fdf9a60065b 44
kadonotakashi 0:8fdf9a60065b 45 virtual void standby(void){};
kadonotakashi 0:8fdf9a60065b 46
kadonotakashi 0:8fdf9a60065b 47 virtual void set_rx_config (radio_modems_t modem, uint32_t bandwidth,
kadonotakashi 0:8fdf9a60065b 48 uint32_t datarate, uint8_t coderate,
kadonotakashi 0:8fdf9a60065b 49 uint32_t bandwidth_afc, uint16_t preamble_len,
kadonotakashi 0:8fdf9a60065b 50 uint16_t symb_timeout, bool fix_len,
kadonotakashi 0:8fdf9a60065b 51 uint8_t payload_len,
kadonotakashi 0:8fdf9a60065b 52 bool crc_on, bool freq_hop_on, uint8_t hop_period,
kadonotakashi 0:8fdf9a60065b 53 bool iq_inverted, bool rx_continuous){};
kadonotakashi 0:8fdf9a60065b 54
kadonotakashi 0:8fdf9a60065b 55 virtual void set_tx_config(radio_modems_t modem, int8_t power, uint32_t fdev,
kadonotakashi 0:8fdf9a60065b 56 uint32_t bandwidth, uint32_t datarate,
kadonotakashi 0:8fdf9a60065b 57 uint8_t coderate, uint16_t preamble_len,
kadonotakashi 0:8fdf9a60065b 58 bool fix_len, bool crc_on, bool freq_hop_on,
kadonotakashi 0:8fdf9a60065b 59 uint8_t hop_period, bool iq_inverted, uint32_t timeout){};
kadonotakashi 0:8fdf9a60065b 60
kadonotakashi 0:8fdf9a60065b 61 virtual void send(uint8_t *buffer, uint8_t size){};
kadonotakashi 0:8fdf9a60065b 62
kadonotakashi 0:8fdf9a60065b 63 virtual void receive(void){};
kadonotakashi 0:8fdf9a60065b 64
kadonotakashi 0:8fdf9a60065b 65 virtual void set_channel(uint32_t freq){};
kadonotakashi 0:8fdf9a60065b 66
kadonotakashi 0:8fdf9a60065b 67 virtual uint32_t random(void){};
kadonotakashi 0:8fdf9a60065b 68
kadonotakashi 0:8fdf9a60065b 69 virtual uint8_t get_status(void){return uint8_value;};
kadonotakashi 0:8fdf9a60065b 70
kadonotakashi 0:8fdf9a60065b 71 virtual void set_max_payload_length(radio_modems_t modem, uint8_t max){};
kadonotakashi 0:8fdf9a60065b 72
kadonotakashi 0:8fdf9a60065b 73 virtual void set_public_network(bool enable){};
kadonotakashi 0:8fdf9a60065b 74
kadonotakashi 0:8fdf9a60065b 75 virtual uint32_t time_on_air(radio_modems_t modem, uint8_t pkt_len){};
kadonotakashi 0:8fdf9a60065b 76
kadonotakashi 0:8fdf9a60065b 77 virtual bool perform_carrier_sense(radio_modems_t modem,
kadonotakashi 0:8fdf9a60065b 78 uint32_t freq,
kadonotakashi 0:8fdf9a60065b 79 int16_t rssi_threshold,
kadonotakashi 0:8fdf9a60065b 80 uint32_t max_carrier_sense_time){ return bool_value;};
kadonotakashi 0:8fdf9a60065b 81
kadonotakashi 0:8fdf9a60065b 82 virtual void start_cad(void){};
kadonotakashi 0:8fdf9a60065b 83
kadonotakashi 0:8fdf9a60065b 84 virtual bool check_rf_frequency(uint32_t frequency){ return bool_value; };
kadonotakashi 0:8fdf9a60065b 85
kadonotakashi 0:8fdf9a60065b 86 virtual void set_tx_continuous_wave(uint32_t freq, int8_t power, uint16_t time){};
kadonotakashi 0:8fdf9a60065b 87
kadonotakashi 0:8fdf9a60065b 88 virtual void lock(void){};
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 virtual void unlock(void){};
kadonotakashi 0:8fdf9a60065b 91
kadonotakashi 0:8fdf9a60065b 92 bool bool_value;
kadonotakashi 0:8fdf9a60065b 93 uint8_t uint8_value;
kadonotakashi 0:8fdf9a60065b 94 };
kadonotakashi 0:8fdf9a60065b 95
kadonotakashi 0:8fdf9a60065b 96 class Test_LoRaPHY : public testing::Test {
kadonotakashi 0:8fdf9a60065b 97 protected:
kadonotakashi 0:8fdf9a60065b 98 my_LoRaPHY *object;
kadonotakashi 0:8fdf9a60065b 99
kadonotakashi 0:8fdf9a60065b 100 virtual void SetUp()
kadonotakashi 0:8fdf9a60065b 101 {
kadonotakashi 0:8fdf9a60065b 102 object = new my_LoRaPHY();
kadonotakashi 0:8fdf9a60065b 103 }
kadonotakashi 0:8fdf9a60065b 104
kadonotakashi 0:8fdf9a60065b 105 virtual void TearDown()
kadonotakashi 0:8fdf9a60065b 106 {
kadonotakashi 0:8fdf9a60065b 107 delete object;
kadonotakashi 0:8fdf9a60065b 108 }
kadonotakashi 0:8fdf9a60065b 109 };
kadonotakashi 0:8fdf9a60065b 110
kadonotakashi 0:8fdf9a60065b 111 TEST_F(Test_LoRaPHY, initialize)
kadonotakashi 0:8fdf9a60065b 112 {
kadonotakashi 0:8fdf9a60065b 113 object->initialize(NULL);
kadonotakashi 0:8fdf9a60065b 114 }
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 TEST_F(Test_LoRaPHY, set_radio_instance)
kadonotakashi 0:8fdf9a60065b 117 {
kadonotakashi 0:8fdf9a60065b 118 my_radio radio;
kadonotakashi 0:8fdf9a60065b 119 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 TEST_F(Test_LoRaPHY, put_radio_to_sleep)
kadonotakashi 0:8fdf9a60065b 123 {
kadonotakashi 0:8fdf9a60065b 124 my_radio radio;
kadonotakashi 0:8fdf9a60065b 125 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 126 object->put_radio_to_sleep();
kadonotakashi 0:8fdf9a60065b 127 }
kadonotakashi 0:8fdf9a60065b 128
kadonotakashi 0:8fdf9a60065b 129 TEST_F(Test_LoRaPHY, put_radio_to_standby)
kadonotakashi 0:8fdf9a60065b 130 {
kadonotakashi 0:8fdf9a60065b 131 my_radio radio;
kadonotakashi 0:8fdf9a60065b 132 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 133 object->put_radio_to_standby();
kadonotakashi 0:8fdf9a60065b 134 }
kadonotakashi 0:8fdf9a60065b 135
kadonotakashi 0:8fdf9a60065b 136 TEST_F(Test_LoRaPHY, handle_receive)
kadonotakashi 0:8fdf9a60065b 137 {
kadonotakashi 0:8fdf9a60065b 138 my_radio radio;
kadonotakashi 0:8fdf9a60065b 139 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 140 object->handle_receive();
kadonotakashi 0:8fdf9a60065b 141 }
kadonotakashi 0:8fdf9a60065b 142
kadonotakashi 0:8fdf9a60065b 143 TEST_F(Test_LoRaPHY, handle_send)
kadonotakashi 0:8fdf9a60065b 144 {
kadonotakashi 0:8fdf9a60065b 145 my_radio radio;
kadonotakashi 0:8fdf9a60065b 146 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 147 object->handle_send(NULL, 0);
kadonotakashi 0:8fdf9a60065b 148 }
kadonotakashi 0:8fdf9a60065b 149
kadonotakashi 0:8fdf9a60065b 150 TEST_F(Test_LoRaPHY, setup_public_network_mode)
kadonotakashi 0:8fdf9a60065b 151 {
kadonotakashi 0:8fdf9a60065b 152 my_radio radio;
kadonotakashi 0:8fdf9a60065b 153 channel_params_t p;
kadonotakashi 0:8fdf9a60065b 154 object->get_phy_params().channels.channel_list = &p;
kadonotakashi 0:8fdf9a60065b 155 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 156 object->setup_public_network_mode(false);
kadonotakashi 0:8fdf9a60065b 157 }
kadonotakashi 0:8fdf9a60065b 158
kadonotakashi 0:8fdf9a60065b 159 TEST_F(Test_LoRaPHY, get_radio_rng)
kadonotakashi 0:8fdf9a60065b 160 {
kadonotakashi 0:8fdf9a60065b 161 my_radio radio;
kadonotakashi 0:8fdf9a60065b 162 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 163 EXPECT_TRUE(0 != object->get_radio_rng());
kadonotakashi 0:8fdf9a60065b 164 }
kadonotakashi 0:8fdf9a60065b 165
kadonotakashi 0:8fdf9a60065b 166 TEST_F(Test_LoRaPHY, calculate_backoff)
kadonotakashi 0:8fdf9a60065b 167 {
kadonotakashi 0:8fdf9a60065b 168 channel_params_t p[1];
kadonotakashi 0:8fdf9a60065b 169 p[0].band = 0;
kadonotakashi 0:8fdf9a60065b 170 object->get_phy_params().channels.channel_list = p;
kadonotakashi 0:8fdf9a60065b 171 band_t b[1];
kadonotakashi 0:8fdf9a60065b 172 object->get_phy_params().bands.table = b;
kadonotakashi 0:8fdf9a60065b 173 object->calculate_backoff(false, false, false, 0, 10, 12);
kadonotakashi 0:8fdf9a60065b 174
kadonotakashi 0:8fdf9a60065b 175 object->calculate_backoff(false, true, false, 0, 3600000 + 10, 12);
kadonotakashi 0:8fdf9a60065b 176
kadonotakashi 0:8fdf9a60065b 177 object->calculate_backoff(false, false, true, 0, 3600000 + 36000000 + 10, 12);
kadonotakashi 0:8fdf9a60065b 178 }
kadonotakashi 0:8fdf9a60065b 179
kadonotakashi 0:8fdf9a60065b 180 TEST_F(Test_LoRaPHY, mask_bit_test)
kadonotakashi 0:8fdf9a60065b 181 {
kadonotakashi 0:8fdf9a60065b 182 uint16_t buf;
kadonotakashi 0:8fdf9a60065b 183 EXPECT_TRUE(!object->mask_bit_test(&buf, 0));
kadonotakashi 0:8fdf9a60065b 184 }
kadonotakashi 0:8fdf9a60065b 185
kadonotakashi 0:8fdf9a60065b 186 TEST_F(Test_LoRaPHY, mask_bit_set)
kadonotakashi 0:8fdf9a60065b 187 {
kadonotakashi 0:8fdf9a60065b 188 uint16_t buf;
kadonotakashi 0:8fdf9a60065b 189 object->mask_bit_set(&buf, 3);
kadonotakashi 0:8fdf9a60065b 190 }
kadonotakashi 0:8fdf9a60065b 191
kadonotakashi 0:8fdf9a60065b 192 TEST_F(Test_LoRaPHY, mask_bit_clear)
kadonotakashi 0:8fdf9a60065b 193 {
kadonotakashi 0:8fdf9a60065b 194 uint16_t buf;
kadonotakashi 0:8fdf9a60065b 195 object->mask_bit_clear(&buf, 0);
kadonotakashi 0:8fdf9a60065b 196 }
kadonotakashi 0:8fdf9a60065b 197
kadonotakashi 0:8fdf9a60065b 198 TEST_F(Test_LoRaPHY, request_new_channel)
kadonotakashi 0:8fdf9a60065b 199 {
kadonotakashi 0:8fdf9a60065b 200 channel_params_t p;
kadonotakashi 0:8fdf9a60065b 201 EXPECT_TRUE(0 == object->request_new_channel(1, &p));
kadonotakashi 0:8fdf9a60065b 202
kadonotakashi 0:8fdf9a60065b 203 p.frequency = 0;
kadonotakashi 0:8fdf9a60065b 204 object->get_phy_params().custom_channelplans_supported = true;
kadonotakashi 0:8fdf9a60065b 205 uint16_t list;
kadonotakashi 0:8fdf9a60065b 206 object->get_phy_params().channels.default_mask = &list;
kadonotakashi 0:8fdf9a60065b 207 channel_params_t pp;
kadonotakashi 0:8fdf9a60065b 208 object->get_phy_params().channels.channel_list = &pp;
kadonotakashi 0:8fdf9a60065b 209 EXPECT_TRUE(0 == object->request_new_channel(1, &p));
kadonotakashi 0:8fdf9a60065b 210
kadonotakashi 0:8fdf9a60065b 211 //Default
kadonotakashi 0:8fdf9a60065b 212 p.frequency = 2;
kadonotakashi 0:8fdf9a60065b 213 EXPECT_TRUE(0 == object->request_new_channel(1, &p));
kadonotakashi 0:8fdf9a60065b 214
kadonotakashi 0:8fdf9a60065b 215 //Freq & DR invalid
kadonotakashi 0:8fdf9a60065b 216 object->get_phy_params().max_channel_cnt = 2;
kadonotakashi 0:8fdf9a60065b 217 EXPECT_TRUE(0 == object->request_new_channel(1, &p));
kadonotakashi 0:8fdf9a60065b 218
kadonotakashi 0:8fdf9a60065b 219 //Freq invalid
kadonotakashi 0:8fdf9a60065b 220 pp.frequency = 0;
kadonotakashi 0:8fdf9a60065b 221 object->get_phy_params().default_max_datarate = 1;
kadonotakashi 0:8fdf9a60065b 222 object->get_phy_params().max_tx_datarate = 8;
kadonotakashi 0:8fdf9a60065b 223 p.dr_range.fields.max = 2;
kadonotakashi 0:8fdf9a60065b 224 p.dr_range.fields.min = 0;
kadonotakashi 0:8fdf9a60065b 225 object->get_phy_params().default_channel_cnt = 3;
kadonotakashi 0:8fdf9a60065b 226 EXPECT_TRUE(2 == object->request_new_channel(0, &p));
kadonotakashi 0:8fdf9a60065b 227
kadonotakashi 0:8fdf9a60065b 228 //DR invalid
kadonotakashi 0:8fdf9a60065b 229 pp.frequency = 2;
kadonotakashi 0:8fdf9a60065b 230 p.band = 0;
kadonotakashi 0:8fdf9a60065b 231 object->get_phy_params().bands.size = 1;
kadonotakashi 0:8fdf9a60065b 232 band_t b;
kadonotakashi 0:8fdf9a60065b 233 object->get_phy_params().bands.table = &b;
kadonotakashi 0:8fdf9a60065b 234 b.higher_band_freq = 5;
kadonotakashi 0:8fdf9a60065b 235 b.lower_band_freq = 1;
kadonotakashi 0:8fdf9a60065b 236 p.dr_range.fields.max = 12;
kadonotakashi 0:8fdf9a60065b 237 p.dr_range.fields.min = 1;
kadonotakashi 0:8fdf9a60065b 238 EXPECT_TRUE(1 == object->request_new_channel(0, &p));
kadonotakashi 0:8fdf9a60065b 239
kadonotakashi 0:8fdf9a60065b 240 //STATUS_OK
kadonotakashi 0:8fdf9a60065b 241 p.dr_range.fields.max = 2;
kadonotakashi 0:8fdf9a60065b 242 uint16_t list2[16];
kadonotakashi 0:8fdf9a60065b 243 p.dr_range.fields.min = 0;
kadonotakashi 0:8fdf9a60065b 244 object->get_phy_params().channels.mask = list2;
kadonotakashi 0:8fdf9a60065b 245 EXPECT_TRUE(3 == object->request_new_channel(0, &p));
kadonotakashi 0:8fdf9a60065b 246 }
kadonotakashi 0:8fdf9a60065b 247
kadonotakashi 0:8fdf9a60065b 248 TEST_F(Test_LoRaPHY, set_last_tx_done)
kadonotakashi 0:8fdf9a60065b 249 {
kadonotakashi 0:8fdf9a60065b 250 channel_params_t p[1];
kadonotakashi 0:8fdf9a60065b 251 p[0].band = 0;
kadonotakashi 0:8fdf9a60065b 252 object->get_phy_params().channels.channel_list = p;
kadonotakashi 0:8fdf9a60065b 253 band_t b[1];
kadonotakashi 0:8fdf9a60065b 254 object->get_phy_params().bands.table = b;
kadonotakashi 0:8fdf9a60065b 255 object->set_last_tx_done(0, false, 0);
kadonotakashi 0:8fdf9a60065b 256
kadonotakashi 0:8fdf9a60065b 257 object->set_last_tx_done(0, true, 0);
kadonotakashi 0:8fdf9a60065b 258 }
kadonotakashi 0:8fdf9a60065b 259
kadonotakashi 0:8fdf9a60065b 260 TEST_F(Test_LoRaPHY, restore_default_channels)
kadonotakashi 0:8fdf9a60065b 261 {
kadonotakashi 0:8fdf9a60065b 262 channel_params_t p[1];
kadonotakashi 0:8fdf9a60065b 263 p[0].band = 0;
kadonotakashi 0:8fdf9a60065b 264 object->get_phy_params().channels.channel_list = p;
kadonotakashi 0:8fdf9a60065b 265 uint16_t m, dm;
kadonotakashi 0:8fdf9a60065b 266 object->get_phy_params().channels.mask_size = 1;
kadonotakashi 0:8fdf9a60065b 267 object->get_phy_params().channels.default_mask = &dm;
kadonotakashi 0:8fdf9a60065b 268 object->get_phy_params().channels.mask = &m;
kadonotakashi 0:8fdf9a60065b 269 object->restore_default_channels();
kadonotakashi 0:8fdf9a60065b 270 }
kadonotakashi 0:8fdf9a60065b 271
kadonotakashi 0:8fdf9a60065b 272 TEST_F(Test_LoRaPHY, apply_cf_list)
kadonotakashi 0:8fdf9a60065b 273 {
kadonotakashi 0:8fdf9a60065b 274 uint8_t list[16];
kadonotakashi 0:8fdf9a60065b 275 object->apply_cf_list(list, 0);
kadonotakashi 0:8fdf9a60065b 276
kadonotakashi 0:8fdf9a60065b 277 object->get_phy_params().cflist_supported = true;
kadonotakashi 0:8fdf9a60065b 278 object->apply_cf_list(list, 0);
kadonotakashi 0:8fdf9a60065b 279
kadonotakashi 0:8fdf9a60065b 280 object->get_phy_params().default_channel_cnt = 2;
kadonotakashi 0:8fdf9a60065b 281 object->get_phy_params().cflist_channel_cnt = 0;
kadonotakashi 0:8fdf9a60065b 282 object->get_phy_params().max_channel_cnt = 3;
kadonotakashi 0:8fdf9a60065b 283
kadonotakashi 0:8fdf9a60065b 284 uint16_t mask[8];
kadonotakashi 0:8fdf9a60065b 285 channel_params_t p[8];
kadonotakashi 0:8fdf9a60065b 286 object->get_phy_params().channels.default_mask = mask;
kadonotakashi 0:8fdf9a60065b 287 object->get_phy_params().channels.mask = mask;
kadonotakashi 0:8fdf9a60065b 288 object->get_phy_params().channels.channel_list = p;
kadonotakashi 0:8fdf9a60065b 289 object->apply_cf_list(list, 16);
kadonotakashi 0:8fdf9a60065b 290
kadonotakashi 0:8fdf9a60065b 291 list[1] = 15;
kadonotakashi 0:8fdf9a60065b 292 object->get_phy_params().cflist_channel_cnt = 1;
kadonotakashi 0:8fdf9a60065b 293 object->apply_cf_list(list, 16);
kadonotakashi 0:8fdf9a60065b 294 }
kadonotakashi 0:8fdf9a60065b 295
kadonotakashi 0:8fdf9a60065b 296 TEST_F(Test_LoRaPHY, get_next_ADR)
kadonotakashi 0:8fdf9a60065b 297 {
kadonotakashi 0:8fdf9a60065b 298 int8_t i = 0;
kadonotakashi 0:8fdf9a60065b 299 int8_t j = 0;
kadonotakashi 0:8fdf9a60065b 300 uint32_t ctr = 0;
kadonotakashi 0:8fdf9a60065b 301 object->get_phy_params().min_tx_datarate = 0;
kadonotakashi 0:8fdf9a60065b 302 EXPECT_TRUE(!object->get_next_ADR(false, i, j, ctr));
kadonotakashi 0:8fdf9a60065b 303
kadonotakashi 0:8fdf9a60065b 304 i = 1;
kadonotakashi 0:8fdf9a60065b 305 object->get_phy_params().adr_ack_limit = 3;
kadonotakashi 0:8fdf9a60065b 306 EXPECT_TRUE(!object->get_next_ADR(false, i, j, ctr));
kadonotakashi 0:8fdf9a60065b 307
kadonotakashi 0:8fdf9a60065b 308 object->get_phy_params().adr_ack_limit = 3;
kadonotakashi 0:8fdf9a60065b 309 ctr = 4;
kadonotakashi 0:8fdf9a60065b 310 object->get_phy_params().max_tx_power = 2;
kadonotakashi 0:8fdf9a60065b 311 object->get_phy_params().adr_ack_delay = 1;
kadonotakashi 0:8fdf9a60065b 312 EXPECT_TRUE(object->get_next_ADR(true, i, j, ctr));
kadonotakashi 0:8fdf9a60065b 313
kadonotakashi 0:8fdf9a60065b 314 ctr = 5;
kadonotakashi 0:8fdf9a60065b 315 object->get_phy_params().adr_ack_delay = 2;
kadonotakashi 0:8fdf9a60065b 316 EXPECT_TRUE(!object->get_next_ADR(true, i, j, ctr));
kadonotakashi 0:8fdf9a60065b 317 }
kadonotakashi 0:8fdf9a60065b 318
kadonotakashi 0:8fdf9a60065b 319 TEST_F(Test_LoRaPHY, rx_config)
kadonotakashi 0:8fdf9a60065b 320 {
kadonotakashi 0:8fdf9a60065b 321 my_radio radio;
kadonotakashi 0:8fdf9a60065b 322 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 323 uint8_t list;
kadonotakashi 0:8fdf9a60065b 324 object->get_phy_params().datarates.table = &list;
kadonotakashi 0:8fdf9a60065b 325 uint8_t list2;
kadonotakashi 0:8fdf9a60065b 326 object->get_phy_params().payloads_with_repeater.table = &list2;
kadonotakashi 0:8fdf9a60065b 327 rx_config_params_t p;
kadonotakashi 0:8fdf9a60065b 328 p.datarate = 0;
kadonotakashi 0:8fdf9a60065b 329 p.rx_slot = RX_SLOT_WIN_1;
kadonotakashi 0:8fdf9a60065b 330 channel_params_t pp[1];
kadonotakashi 0:8fdf9a60065b 331 object->get_phy_params().channels.channel_list = pp;
kadonotakashi 0:8fdf9a60065b 332 pp[0].rx1_frequency = 2;
kadonotakashi 0:8fdf9a60065b 333 p.channel = 0;
kadonotakashi 0:8fdf9a60065b 334 uint8_t tab[8];
kadonotakashi 0:8fdf9a60065b 335 object->get_phy_params().payloads.table = tab;
kadonotakashi 0:8fdf9a60065b 336 object->get_phy_params().payloads_with_repeater.table = tab;
kadonotakashi 0:8fdf9a60065b 337 EXPECT_TRUE(object->rx_config(&p));
kadonotakashi 0:8fdf9a60065b 338
kadonotakashi 0:8fdf9a60065b 339 p.datarate = DR_7;
kadonotakashi 0:8fdf9a60065b 340 p.is_repeater_supported = true;
kadonotakashi 0:8fdf9a60065b 341 object->get_phy_params().fsk_supported = true;
kadonotakashi 0:8fdf9a60065b 342 EXPECT_TRUE(object->rx_config(&p));
kadonotakashi 0:8fdf9a60065b 343 }
kadonotakashi 0:8fdf9a60065b 344
kadonotakashi 0:8fdf9a60065b 345 TEST_F(Test_LoRaPHY, compute_rx_win_params)
kadonotakashi 0:8fdf9a60065b 346 {
kadonotakashi 0:8fdf9a60065b 347 uint32_t list[1];
kadonotakashi 0:8fdf9a60065b 348 list[0] = 0;
kadonotakashi 0:8fdf9a60065b 349 object->get_phy_params().bandwidths.table = list;
kadonotakashi 0:8fdf9a60065b 350 uint8_t list2;
kadonotakashi 0:8fdf9a60065b 351 object->get_phy_params().datarates.table = &list2;
kadonotakashi 0:8fdf9a60065b 352 rx_config_params_t p;
kadonotakashi 0:8fdf9a60065b 353 object->compute_rx_win_params(0, 0, 0, &p);
kadonotakashi 0:8fdf9a60065b 354
kadonotakashi 0:8fdf9a60065b 355 p.datarate = 0;
kadonotakashi 0:8fdf9a60065b 356 list[0] = 125000;
kadonotakashi 0:8fdf9a60065b 357 object->compute_rx_win_params(0, 0, 0, &p);
kadonotakashi 0:8fdf9a60065b 358
kadonotakashi 0:8fdf9a60065b 359 list[0] = 250000;
kadonotakashi 0:8fdf9a60065b 360 object->compute_rx_win_params(0, 0, 0, &p);
kadonotakashi 0:8fdf9a60065b 361
kadonotakashi 0:8fdf9a60065b 362 list[0] = 500000;
kadonotakashi 0:8fdf9a60065b 363 object->get_phy_params().fsk_supported = true;
kadonotakashi 0:8fdf9a60065b 364 object->get_phy_params().max_rx_datarate = 0;
kadonotakashi 0:8fdf9a60065b 365 object->compute_rx_win_params(0, 0, 0, &p);
kadonotakashi 0:8fdf9a60065b 366 }
kadonotakashi 0:8fdf9a60065b 367
kadonotakashi 0:8fdf9a60065b 368 TEST_F(Test_LoRaPHY, tx_config)
kadonotakashi 0:8fdf9a60065b 369 {
kadonotakashi 0:8fdf9a60065b 370 band_t b;
kadonotakashi 0:8fdf9a60065b 371 object->get_phy_params().bands.table = &b;
kadonotakashi 0:8fdf9a60065b 372 channel_params_t pp;
kadonotakashi 0:8fdf9a60065b 373 pp.band=0;
kadonotakashi 0:8fdf9a60065b 374 object->get_phy_params().channels.channel_list = &pp;
kadonotakashi 0:8fdf9a60065b 375 uint32_t list = 0;
kadonotakashi 0:8fdf9a60065b 376 object->get_phy_params().bandwidths.table = &list;
kadonotakashi 0:8fdf9a60065b 377 uint8_t list2;
kadonotakashi 0:8fdf9a60065b 378 object->get_phy_params().datarates.table = &list2;
kadonotakashi 0:8fdf9a60065b 379 my_radio radio;
kadonotakashi 0:8fdf9a60065b 380 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 381 tx_config_params_t p;
kadonotakashi 0:8fdf9a60065b 382 p.channel=0;
kadonotakashi 0:8fdf9a60065b 383 int8_t i;
kadonotakashi 0:8fdf9a60065b 384 lorawan_time_t t;
kadonotakashi 0:8fdf9a60065b 385 object->tx_config(&p, &i, &t);
kadonotakashi 0:8fdf9a60065b 386
kadonotakashi 0:8fdf9a60065b 387 p.datarate = 8;
kadonotakashi 0:8fdf9a60065b 388 object->get_phy_params().max_tx_datarate = 8;
kadonotakashi 0:8fdf9a60065b 389 object->tx_config(&p, &i, &t);
kadonotakashi 0:8fdf9a60065b 390 }
kadonotakashi 0:8fdf9a60065b 391
kadonotakashi 0:8fdf9a60065b 392 TEST_F(Test_LoRaPHY, link_ADR_request)
kadonotakashi 0:8fdf9a60065b 393 {
kadonotakashi 0:8fdf9a60065b 394 adr_req_params_t p;
kadonotakashi 0:8fdf9a60065b 395 uint8_t b[100];
kadonotakashi 0:8fdf9a60065b 396 p.payload = b;
kadonotakashi 0:8fdf9a60065b 397 b[0] = 0x03;
kadonotakashi 0:8fdf9a60065b 398 b[1] = 1;
kadonotakashi 0:8fdf9a60065b 399 b[2] = 0;
kadonotakashi 0:8fdf9a60065b 400 b[3] = 0;
kadonotakashi 0:8fdf9a60065b 401 b[4] = 1 << 4;
kadonotakashi 0:8fdf9a60065b 402 b[5] = 0x03;
kadonotakashi 0:8fdf9a60065b 403 b[6] = 1;
kadonotakashi 0:8fdf9a60065b 404 b[7] = 1;
kadonotakashi 0:8fdf9a60065b 405 b[8] = 1;
kadonotakashi 0:8fdf9a60065b 406 b[9] = 6 << 4;
kadonotakashi 0:8fdf9a60065b 407 b[10] = 0x03;
kadonotakashi 0:8fdf9a60065b 408 b[11] = 1;
kadonotakashi 0:8fdf9a60065b 409 b[12] = 0xff;
kadonotakashi 0:8fdf9a60065b 410 b[13] = 0xff;
kadonotakashi 0:8fdf9a60065b 411 b[14] = 0;
kadonotakashi 0:8fdf9a60065b 412 b[15] = 0;
kadonotakashi 0:8fdf9a60065b 413 p.payload_size = 16;
kadonotakashi 0:8fdf9a60065b 414 int8_t i, j;
kadonotakashi 0:8fdf9a60065b 415 uint8_t k, l;
kadonotakashi 0:8fdf9a60065b 416 uint8_t t[5];
kadonotakashi 0:8fdf9a60065b 417 t[0] = 0;
kadonotakashi 0:8fdf9a60065b 418 object->get_phy_params().datarates.size = 1;
kadonotakashi 0:8fdf9a60065b 419 object->get_phy_params().datarates.table = t;
kadonotakashi 0:8fdf9a60065b 420 //Test without ADR payload does not make sense here.
kadonotakashi 0:8fdf9a60065b 421
kadonotakashi 0:8fdf9a60065b 422 object->get_phy_params().max_channel_cnt = 2;
kadonotakashi 0:8fdf9a60065b 423 channel_params_t li[4];
kadonotakashi 0:8fdf9a60065b 424 object->get_phy_params().channels.channel_list = li;
kadonotakashi 0:8fdf9a60065b 425 li[0].frequency = 0;
kadonotakashi 0:8fdf9a60065b 426 li[1].frequency = 5;
kadonotakashi 0:8fdf9a60065b 427 EXPECT_TRUE(4 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 428
kadonotakashi 0:8fdf9a60065b 429 t[0] = 3;
kadonotakashi 0:8fdf9a60065b 430 //verify adr with p.adr_enabled = false
kadonotakashi 0:8fdf9a60065b 431 EXPECT_TRUE(0 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 432
kadonotakashi 0:8fdf9a60065b 433 p.current_nb_rep = 0;
kadonotakashi 0:8fdf9a60065b 434 EXPECT_TRUE(0 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 435
kadonotakashi 0:8fdf9a60065b 436 p.adr_enabled = true;
kadonotakashi 0:8fdf9a60065b 437 li[0].dr_range.value = 0xff;
kadonotakashi 0:8fdf9a60065b 438 object->get_phy_params().min_tx_datarate = DR_3;
kadonotakashi 0:8fdf9a60065b 439 object->get_phy_params().max_tx_datarate = DR_8;
kadonotakashi 0:8fdf9a60065b 440
kadonotakashi 0:8fdf9a60065b 441 //verify adr with status != 0
kadonotakashi 0:8fdf9a60065b 442 EXPECT_TRUE(0 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 443
kadonotakashi 0:8fdf9a60065b 444 object->get_phy_params().max_tx_power = 2;
kadonotakashi 0:8fdf9a60065b 445 object->get_phy_params().min_tx_power = 6;
kadonotakashi 0:8fdf9a60065b 446 //verify adr with status != 0
kadonotakashi 0:8fdf9a60065b 447 EXPECT_TRUE(4 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 448
kadonotakashi 0:8fdf9a60065b 449 object->get_phy_params().min_tx_datarate = DR_0;
kadonotakashi 0:8fdf9a60065b 450 li[0].dr_range.value = 0xf0;
kadonotakashi 0:8fdf9a60065b 451 EXPECT_TRUE(6 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 452
kadonotakashi 0:8fdf9a60065b 453 li[1].dr_range.fields.min = DR_0;
kadonotakashi 0:8fdf9a60065b 454 li[1].dr_range.fields.max = DR_13;
kadonotakashi 0:8fdf9a60065b 455 b[4] = 6 << 4;
kadonotakashi 0:8fdf9a60065b 456 p.payload_size = 5;
kadonotakashi 0:8fdf9a60065b 457 EXPECT_TRUE(7 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 458
kadonotakashi 0:8fdf9a60065b 459 uint16_t mask[2];
kadonotakashi 0:8fdf9a60065b 460 object->get_phy_params().channels.mask = mask;
kadonotakashi 0:8fdf9a60065b 461 object->get_phy_params().channels.mask_size = 2;
kadonotakashi 0:8fdf9a60065b 462 EXPECT_TRUE(7 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 463
kadonotakashi 0:8fdf9a60065b 464 li[0].dr_range.value = 0xff;
kadonotakashi 0:8fdf9a60065b 465 object->get_phy_params().max_channel_cnt = 0;
kadonotakashi 0:8fdf9a60065b 466 EXPECT_TRUE(5 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 467
kadonotakashi 0:8fdf9a60065b 468 b[0] = 0x03;
kadonotakashi 0:8fdf9a60065b 469 b[1] = 1;
kadonotakashi 0:8fdf9a60065b 470 b[2] = 0;
kadonotakashi 0:8fdf9a60065b 471 b[3] = 0;
kadonotakashi 0:8fdf9a60065b 472 b[4] = 0;
kadonotakashi 0:8fdf9a60065b 473 t[0] = 0;
kadonotakashi 0:8fdf9a60065b 474 object->get_phy_params().datarates.size = 1;
kadonotakashi 0:8fdf9a60065b 475 object->get_phy_params().datarates.table = t;
kadonotakashi 0:8fdf9a60065b 476 //Test without ADR payload does not make sense here.
kadonotakashi 0:8fdf9a60065b 477
kadonotakashi 0:8fdf9a60065b 478 object->get_phy_params().max_channel_cnt = 2;
kadonotakashi 0:8fdf9a60065b 479 li[0].frequency = 0;
kadonotakashi 0:8fdf9a60065b 480 li[1].frequency = 5;
kadonotakashi 0:8fdf9a60065b 481 EXPECT_TRUE(4 == object->link_ADR_request(&p, &i, &j, &k, &l));
kadonotakashi 0:8fdf9a60065b 482 }
kadonotakashi 0:8fdf9a60065b 483
kadonotakashi 0:8fdf9a60065b 484 TEST_F(Test_LoRaPHY, accept_rx_param_setup_req)
kadonotakashi 0:8fdf9a60065b 485 {
kadonotakashi 0:8fdf9a60065b 486 my_radio radio;
kadonotakashi 0:8fdf9a60065b 487 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 488 rx_param_setup_req_t req;
kadonotakashi 0:8fdf9a60065b 489 EXPECT_TRUE(0 == object->accept_rx_param_setup_req(&req));
kadonotakashi 0:8fdf9a60065b 490 }
kadonotakashi 0:8fdf9a60065b 491
kadonotakashi 0:8fdf9a60065b 492 TEST_F(Test_LoRaPHY, accept_tx_param_setup_req)
kadonotakashi 0:8fdf9a60065b 493 {
kadonotakashi 0:8fdf9a60065b 494 my_radio radio;
kadonotakashi 0:8fdf9a60065b 495 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 496 object->get_phy_params().accept_tx_param_setup_req = true;
kadonotakashi 0:8fdf9a60065b 497 EXPECT_TRUE(object->accept_tx_param_setup_req(0, 0));
kadonotakashi 0:8fdf9a60065b 498 }
kadonotakashi 0:8fdf9a60065b 499
kadonotakashi 0:8fdf9a60065b 500 TEST_F(Test_LoRaPHY, dl_channel_request)
kadonotakashi 0:8fdf9a60065b 501 {
kadonotakashi 0:8fdf9a60065b 502 EXPECT_TRUE(0 == object->dl_channel_request(0, 0));
kadonotakashi 0:8fdf9a60065b 503
kadonotakashi 0:8fdf9a60065b 504 object->get_phy_params().dl_channel_req_supported = true;
kadonotakashi 0:8fdf9a60065b 505 object->get_phy_params().bands.size = 1;
kadonotakashi 0:8fdf9a60065b 506 band_t t[1];
kadonotakashi 0:8fdf9a60065b 507 object->get_phy_params().bands.table = t;
kadonotakashi 0:8fdf9a60065b 508 channel_params_t p[4];
kadonotakashi 0:8fdf9a60065b 509 object->get_phy_params().channels.channel_list = p;
kadonotakashi 0:8fdf9a60065b 510
kadonotakashi 0:8fdf9a60065b 511 p[0].frequency = 0;
kadonotakashi 0:8fdf9a60065b 512 EXPECT_TRUE(0 == object->dl_channel_request(0, 1));
kadonotakashi 0:8fdf9a60065b 513
kadonotakashi 0:8fdf9a60065b 514 t[0].higher_band_freq = 19;
kadonotakashi 0:8fdf9a60065b 515 t[0].lower_band_freq = 0;
kadonotakashi 0:8fdf9a60065b 516 p[0].frequency = 1;
kadonotakashi 0:8fdf9a60065b 517 EXPECT_TRUE(3 == object->dl_channel_request(0, 1));
kadonotakashi 0:8fdf9a60065b 518 }
kadonotakashi 0:8fdf9a60065b 519
kadonotakashi 0:8fdf9a60065b 520 TEST_F(Test_LoRaPHY, get_alternate_DR)
kadonotakashi 0:8fdf9a60065b 521 {
kadonotakashi 0:8fdf9a60065b 522 EXPECT_TRUE(0 == object->get_alternate_DR(0));
kadonotakashi 0:8fdf9a60065b 523
kadonotakashi 0:8fdf9a60065b 524 object->get_phy_params().default_max_datarate = 5;
kadonotakashi 0:8fdf9a60065b 525 object->get_phy_params().min_tx_datarate = 4;
kadonotakashi 0:8fdf9a60065b 526 EXPECT_TRUE(5 == object->get_alternate_DR(1));
kadonotakashi 0:8fdf9a60065b 527
kadonotakashi 0:8fdf9a60065b 528 object->get_phy_params().default_max_datarate = 6;
kadonotakashi 0:8fdf9a60065b 529 object->get_phy_params().min_tx_datarate = 4;
kadonotakashi 0:8fdf9a60065b 530 EXPECT_TRUE(5 == object->get_alternate_DR(2));
kadonotakashi 0:8fdf9a60065b 531 }
kadonotakashi 0:8fdf9a60065b 532
kadonotakashi 0:8fdf9a60065b 533 TEST_F(Test_LoRaPHY, set_next_channel)
kadonotakashi 0:8fdf9a60065b 534 {
kadonotakashi 0:8fdf9a60065b 535 channel_selection_params_t p;
kadonotakashi 0:8fdf9a60065b 536 uint8_t ch;
kadonotakashi 0:8fdf9a60065b 537 lorawan_time_t t1;
kadonotakashi 0:8fdf9a60065b 538 lorawan_time_t t2;
kadonotakashi 0:8fdf9a60065b 539 p.aggregate_timeoff = 10000;
kadonotakashi 0:8fdf9a60065b 540 EXPECT_TRUE(LORAWAN_STATUS_DUTYCYCLE_RESTRICTED == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 541
kadonotakashi 0:8fdf9a60065b 542 uint16_t list[16];
kadonotakashi 0:8fdf9a60065b 543 list[4] = 1;
kadonotakashi 0:8fdf9a60065b 544 memcpy(list, "\0", 16);
kadonotakashi 0:8fdf9a60065b 545 object->get_phy_params().channels.mask = list;
kadonotakashi 0:8fdf9a60065b 546 object->get_phy_params().channels.mask_size = 1;
kadonotakashi 0:8fdf9a60065b 547 p.aggregate_timeoff = 10000;
kadonotakashi 0:8fdf9a60065b 548 EXPECT_TRUE(LORAWAN_STATUS_DUTYCYCLE_RESTRICTED == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 549
kadonotakashi 0:8fdf9a60065b 550 LoRaWANTimer_stub::time_value = 20000;
kadonotakashi 0:8fdf9a60065b 551 EXPECT_TRUE(LORAWAN_STATUS_NO_CHANNEL_FOUND == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 552
kadonotakashi 0:8fdf9a60065b 553 p.joined = false;
kadonotakashi 0:8fdf9a60065b 554 p.dc_enabled = false;
kadonotakashi 0:8fdf9a60065b 555 band_t b[4];
kadonotakashi 0:8fdf9a60065b 556 object->get_phy_params().bands.size = 2;
kadonotakashi 0:8fdf9a60065b 557 object->get_phy_params().bands.table = &b;
kadonotakashi 0:8fdf9a60065b 558 b[0].off_time = 0;
kadonotakashi 0:8fdf9a60065b 559 b[1].off_time = 9999999;
kadonotakashi 0:8fdf9a60065b 560 list[4] = 0;
kadonotakashi 0:8fdf9a60065b 561 object->get_phy_params().channels.mask_size = 128;
kadonotakashi 0:8fdf9a60065b 562 p.current_datarate = DR_1;
kadonotakashi 0:8fdf9a60065b 563 object->get_phy_params().max_channel_cnt = 4;
kadonotakashi 0:8fdf9a60065b 564 EXPECT_TRUE(LORAWAN_STATUS_NO_CHANNEL_FOUND == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 565
kadonotakashi 0:8fdf9a60065b 566 p.dc_enabled = true;
kadonotakashi 0:8fdf9a60065b 567 EXPECT_TRUE(LORAWAN_STATUS_NO_CHANNEL_FOUND == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 568
kadonotakashi 0:8fdf9a60065b 569 list[4] = 1;
kadonotakashi 0:8fdf9a60065b 570 p.joined = true;
kadonotakashi 0:8fdf9a60065b 571 p.dc_enabled = false;
kadonotakashi 0:8fdf9a60065b 572 channel_params_t l[4];
kadonotakashi 0:8fdf9a60065b 573 l[0].dr_range.value = 0xff;
kadonotakashi 0:8fdf9a60065b 574 l[1].dr_range.value = 0xff;
kadonotakashi 0:8fdf9a60065b 575 l[2].dr_range.value = 0xf0;
kadonotakashi 0:8fdf9a60065b 576 l[3].dr_range.value = 0xf0;
kadonotakashi 0:8fdf9a60065b 577 l[2].band = 2;
kadonotakashi 0:8fdf9a60065b 578 l[3].band = 3;
kadonotakashi 0:8fdf9a60065b 579 object->get_phy_params().channels.channel_list = l;
kadonotakashi 0:8fdf9a60065b 580 list[0] = 0xFF;
kadonotakashi 0:8fdf9a60065b 581 b[2].off_time = 9999999;
kadonotakashi 0:8fdf9a60065b 582 b[3].off_time = 0;
kadonotakashi 0:8fdf9a60065b 583 EXPECT_TRUE(LORAWAN_STATUS_OK == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 584
kadonotakashi 0:8fdf9a60065b 585 b[0].off_time = 10000;
kadonotakashi 0:8fdf9a60065b 586 LoRaWANTimer_stub::time_value = 2000;
kadonotakashi 0:8fdf9a60065b 587 p.aggregate_timeoff = 1000;
kadonotakashi 0:8fdf9a60065b 588 p.dc_enabled = true;
kadonotakashi 0:8fdf9a60065b 589 EXPECT_TRUE(LORAWAN_STATUS_OK == object->set_next_channel(&p, &ch, &t1, &t2));
kadonotakashi 0:8fdf9a60065b 590 }
kadonotakashi 0:8fdf9a60065b 591
kadonotakashi 0:8fdf9a60065b 592 TEST_F(Test_LoRaPHY, add_channel)
kadonotakashi 0:8fdf9a60065b 593 {
kadonotakashi 0:8fdf9a60065b 594 uint16_t list[16];
kadonotakashi 0:8fdf9a60065b 595 object->get_phy_params().channels.mask = list;
kadonotakashi 0:8fdf9a60065b 596 object->get_phy_params().channels.default_mask = list;
kadonotakashi 0:8fdf9a60065b 597 channel_params_t p;
kadonotakashi 0:8fdf9a60065b 598 EXPECT_TRUE(LORAWAN_STATUS_PARAMETER_INVALID == object->add_channel(&p, 0));
kadonotakashi 0:8fdf9a60065b 599
kadonotakashi 0:8fdf9a60065b 600 object->get_phy_params().custom_channelplans_supported = true;
kadonotakashi 0:8fdf9a60065b 601 object->get_phy_params().max_channel_cnt = 2;
kadonotakashi 0:8fdf9a60065b 602 object->get_phy_params().min_tx_datarate = 0;
kadonotakashi 0:8fdf9a60065b 603 object->get_phy_params().max_tx_datarate = 13;
kadonotakashi 0:8fdf9a60065b 604 p.dr_range.fields.min = 6;
kadonotakashi 0:8fdf9a60065b 605 p.dr_range.fields.max = 1;
kadonotakashi 0:8fdf9a60065b 606 EXPECT_TRUE(LORAWAN_STATUS_FREQ_AND_DR_INVALID == object->add_channel(&p, 0));
kadonotakashi 0:8fdf9a60065b 607 }
kadonotakashi 0:8fdf9a60065b 608
kadonotakashi 0:8fdf9a60065b 609 TEST_F(Test_LoRaPHY, remove_channel)
kadonotakashi 0:8fdf9a60065b 610 {
kadonotakashi 0:8fdf9a60065b 611 channel_params_t pp;
kadonotakashi 0:8fdf9a60065b 612 pp.band=0;
kadonotakashi 0:8fdf9a60065b 613 object->get_phy_params().channels.channel_list = &pp;
kadonotakashi 0:8fdf9a60065b 614 uint16_t list[16];
kadonotakashi 0:8fdf9a60065b 615 list[0] = 1;
kadonotakashi 0:8fdf9a60065b 616 object->get_phy_params().channels.mask = list;
kadonotakashi 0:8fdf9a60065b 617 object->get_phy_params().channels.default_mask = list;
kadonotakashi 0:8fdf9a60065b 618 EXPECT_TRUE(false == object->remove_channel(0));
kadonotakashi 0:8fdf9a60065b 619
kadonotakashi 0:8fdf9a60065b 620 list[0] = 0;
kadonotakashi 0:8fdf9a60065b 621 EXPECT_TRUE(false == object->remove_channel(0));
kadonotakashi 0:8fdf9a60065b 622
kadonotakashi 0:8fdf9a60065b 623 object->get_phy_params().channels.mask_size = 1;
kadonotakashi 0:8fdf9a60065b 624 object->get_phy_params().max_channel_cnt = 0;
kadonotakashi 0:8fdf9a60065b 625 EXPECT_TRUE(false == object->remove_channel(0));
kadonotakashi 0:8fdf9a60065b 626
kadonotakashi 0:8fdf9a60065b 627 object->get_phy_params().max_channel_cnt = 1;
kadonotakashi 0:8fdf9a60065b 628 EXPECT_TRUE(true == object->remove_channel(0));
kadonotakashi 0:8fdf9a60065b 629 }
kadonotakashi 0:8fdf9a60065b 630
kadonotakashi 0:8fdf9a60065b 631 TEST_F(Test_LoRaPHY, set_tx_cont_mode)
kadonotakashi 0:8fdf9a60065b 632 {
kadonotakashi 0:8fdf9a60065b 633 channel_params_t pp;
kadonotakashi 0:8fdf9a60065b 634 pp.band=0;
kadonotakashi 0:8fdf9a60065b 635 object->get_phy_params().channels.channel_list = &pp;
kadonotakashi 0:8fdf9a60065b 636 band_t b;
kadonotakashi 0:8fdf9a60065b 637 object->get_phy_params().bands.table = &b;
kadonotakashi 0:8fdf9a60065b 638 my_radio radio;
kadonotakashi 0:8fdf9a60065b 639 object->set_radio_instance(radio);
kadonotakashi 0:8fdf9a60065b 640
kadonotakashi 0:8fdf9a60065b 641 cw_mode_params_t p;
kadonotakashi 0:8fdf9a60065b 642 p.max_eirp = 0;
kadonotakashi 0:8fdf9a60065b 643 p.channel=0;
kadonotakashi 0:8fdf9a60065b 644 object->set_tx_cont_mode(&p);
kadonotakashi 0:8fdf9a60065b 645
kadonotakashi 0:8fdf9a60065b 646 p.max_eirp = 1;
kadonotakashi 0:8fdf9a60065b 647 p.antenna_gain = 1;
kadonotakashi 0:8fdf9a60065b 648 object->set_tx_cont_mode(&p, 1);
kadonotakashi 0:8fdf9a60065b 649 }
kadonotakashi 0:8fdf9a60065b 650
kadonotakashi 0:8fdf9a60065b 651 TEST_F(Test_LoRaPHY, apply_DR_offset)
kadonotakashi 0:8fdf9a60065b 652 {
kadonotakashi 0:8fdf9a60065b 653 EXPECT_TRUE(0 == object->apply_DR_offset(0, 0));
kadonotakashi 0:8fdf9a60065b 654
kadonotakashi 0:8fdf9a60065b 655 object->get_phy_params().min_tx_datarate = 1;
kadonotakashi 0:8fdf9a60065b 656 EXPECT_TRUE(1 == object->apply_DR_offset(0, 2));
kadonotakashi 0:8fdf9a60065b 657 }
kadonotakashi 0:8fdf9a60065b 658
kadonotakashi 0:8fdf9a60065b 659 TEST_F(Test_LoRaPHY, reset_to_default_values)
kadonotakashi 0:8fdf9a60065b 660 {
kadonotakashi 0:8fdf9a60065b 661 loramac_protocol_params p;
kadonotakashi 0:8fdf9a60065b 662 object->reset_to_default_values(&p);
kadonotakashi 0:8fdf9a60065b 663
kadonotakashi 0:8fdf9a60065b 664 object->reset_to_default_values(&p, true);
kadonotakashi 0:8fdf9a60065b 665 }
kadonotakashi 0:8fdf9a60065b 666
kadonotakashi 0:8fdf9a60065b 667 TEST_F(Test_LoRaPHY, get_next_lower_tx_datarate)
kadonotakashi 0:8fdf9a60065b 668 {
kadonotakashi 0:8fdf9a60065b 669 EXPECT_TRUE(DR_0 == object->get_next_lower_tx_datarate(DR_2));
kadonotakashi 0:8fdf9a60065b 670
kadonotakashi 0:8fdf9a60065b 671 object->get_phy_params().ul_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 672 object->get_phy_params().dwell_limit_datarate = DR_1;
kadonotakashi 0:8fdf9a60065b 673 EXPECT_TRUE(DR_1 == object->get_next_lower_tx_datarate(DR_2));
kadonotakashi 0:8fdf9a60065b 674 }
kadonotakashi 0:8fdf9a60065b 675
kadonotakashi 0:8fdf9a60065b 676 TEST_F(Test_LoRaPHY, get_minimum_rx_datarate)
kadonotakashi 0:8fdf9a60065b 677 {
kadonotakashi 0:8fdf9a60065b 678 EXPECT_TRUE(DR_0 == object->get_minimum_rx_datarate());
kadonotakashi 0:8fdf9a60065b 679
kadonotakashi 0:8fdf9a60065b 680 object->get_phy_params().dl_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 681 object->get_phy_params().dwell_limit_datarate = DR_1;
kadonotakashi 0:8fdf9a60065b 682 EXPECT_TRUE(DR_1 == object->get_minimum_rx_datarate());
kadonotakashi 0:8fdf9a60065b 683 }
kadonotakashi 0:8fdf9a60065b 684
kadonotakashi 0:8fdf9a60065b 685 TEST_F(Test_LoRaPHY, get_minimum_tx_datarate)
kadonotakashi 0:8fdf9a60065b 686 {
kadonotakashi 0:8fdf9a60065b 687 EXPECT_TRUE(DR_0 == object->get_minimum_tx_datarate());
kadonotakashi 0:8fdf9a60065b 688
kadonotakashi 0:8fdf9a60065b 689 object->get_phy_params().ul_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 690 object->get_phy_params().dwell_limit_datarate = DR_1;
kadonotakashi 0:8fdf9a60065b 691 EXPECT_TRUE(DR_1 == object->get_minimum_tx_datarate());
kadonotakashi 0:8fdf9a60065b 692 }
kadonotakashi 0:8fdf9a60065b 693
kadonotakashi 0:8fdf9a60065b 694 TEST_F(Test_LoRaPHY, get_default_tx_datarate)
kadonotakashi 0:8fdf9a60065b 695 {
kadonotakashi 0:8fdf9a60065b 696 EXPECT_TRUE(0 == object->get_default_tx_datarate());
kadonotakashi 0:8fdf9a60065b 697 }
kadonotakashi 0:8fdf9a60065b 698
kadonotakashi 0:8fdf9a60065b 699 TEST_F(Test_LoRaPHY, get_default_max_tx_datarate)
kadonotakashi 0:8fdf9a60065b 700 {
kadonotakashi 0:8fdf9a60065b 701 EXPECT_TRUE(DR_0 == object->get_default_max_tx_datarate());
kadonotakashi 0:8fdf9a60065b 702 }
kadonotakashi 0:8fdf9a60065b 703
kadonotakashi 0:8fdf9a60065b 704 TEST_F(Test_LoRaPHY, get_default_tx_power)
kadonotakashi 0:8fdf9a60065b 705 {
kadonotakashi 0:8fdf9a60065b 706 EXPECT_TRUE(0 == object->get_default_tx_power());
kadonotakashi 0:8fdf9a60065b 707 }
kadonotakashi 0:8fdf9a60065b 708
kadonotakashi 0:8fdf9a60065b 709 TEST_F(Test_LoRaPHY, get_max_payload)
kadonotakashi 0:8fdf9a60065b 710 {
kadonotakashi 0:8fdf9a60065b 711 uint8_t list=8;
kadonotakashi 0:8fdf9a60065b 712 object->get_phy_params().payloads.table = &list;
kadonotakashi 0:8fdf9a60065b 713 object->get_phy_params().payloads_with_repeater.table = &list;
kadonotakashi 0:8fdf9a60065b 714 EXPECT_TRUE(8 == object->get_max_payload(0));
kadonotakashi 0:8fdf9a60065b 715
kadonotakashi 0:8fdf9a60065b 716 EXPECT_TRUE(8 == object->get_max_payload(0, true));
kadonotakashi 0:8fdf9a60065b 717 }
kadonotakashi 0:8fdf9a60065b 718
kadonotakashi 0:8fdf9a60065b 719 TEST_F(Test_LoRaPHY, get_maximum_frame_counter_gap)
kadonotakashi 0:8fdf9a60065b 720 {
kadonotakashi 0:8fdf9a60065b 721 EXPECT_TRUE(0 == object->get_maximum_frame_counter_gap());
kadonotakashi 0:8fdf9a60065b 722 }
kadonotakashi 0:8fdf9a60065b 723
kadonotakashi 0:8fdf9a60065b 724 TEST_F(Test_LoRaPHY, get_ack_timeout)
kadonotakashi 0:8fdf9a60065b 725 {
kadonotakashi 0:8fdf9a60065b 726 EXPECT_TRUE(0 == object->get_ack_timeout());
kadonotakashi 0:8fdf9a60065b 727 }
kadonotakashi 0:8fdf9a60065b 728
kadonotakashi 0:8fdf9a60065b 729 TEST_F(Test_LoRaPHY, get_default_rx2_frequency)
kadonotakashi 0:8fdf9a60065b 730 {
kadonotakashi 0:8fdf9a60065b 731 EXPECT_TRUE(0 == object->get_default_rx2_frequency());
kadonotakashi 0:8fdf9a60065b 732 }
kadonotakashi 0:8fdf9a60065b 733
kadonotakashi 0:8fdf9a60065b 734 TEST_F(Test_LoRaPHY, get_default_rx2_datarate)
kadonotakashi 0:8fdf9a60065b 735 {
kadonotakashi 0:8fdf9a60065b 736 EXPECT_TRUE(0 == object->get_default_rx2_datarate());
kadonotakashi 0:8fdf9a60065b 737 }
kadonotakashi 0:8fdf9a60065b 738
kadonotakashi 0:8fdf9a60065b 739 TEST_F(Test_LoRaPHY, get_channel_mask)
kadonotakashi 0:8fdf9a60065b 740 {
kadonotakashi 0:8fdf9a60065b 741 EXPECT_TRUE(0 == object->get_channel_mask());
kadonotakashi 0:8fdf9a60065b 742 EXPECT_TRUE(0 == object->get_channel_mask(true));
kadonotakashi 0:8fdf9a60065b 743 }
kadonotakashi 0:8fdf9a60065b 744
kadonotakashi 0:8fdf9a60065b 745 TEST_F(Test_LoRaPHY, get_max_nb_channels)
kadonotakashi 0:8fdf9a60065b 746 {
kadonotakashi 0:8fdf9a60065b 747 EXPECT_TRUE(0 == object->get_max_nb_channels());
kadonotakashi 0:8fdf9a60065b 748 }
kadonotakashi 0:8fdf9a60065b 749
kadonotakashi 0:8fdf9a60065b 750 TEST_F(Test_LoRaPHY, get_phy_channels)
kadonotakashi 0:8fdf9a60065b 751 {
kadonotakashi 0:8fdf9a60065b 752 EXPECT_TRUE(0 == object->get_phy_channels());
kadonotakashi 0:8fdf9a60065b 753 }
kadonotakashi 0:8fdf9a60065b 754
kadonotakashi 0:8fdf9a60065b 755 TEST_F(Test_LoRaPHY, is_custom_channel_plan_supported)
kadonotakashi 0:8fdf9a60065b 756 {
kadonotakashi 0:8fdf9a60065b 757 EXPECT_TRUE(false == object->is_custom_channel_plan_supported());
kadonotakashi 0:8fdf9a60065b 758 }
kadonotakashi 0:8fdf9a60065b 759
kadonotakashi 0:8fdf9a60065b 760 TEST_F(Test_LoRaPHY, verify_rx_datarate)
kadonotakashi 0:8fdf9a60065b 761 {
kadonotakashi 0:8fdf9a60065b 762 EXPECT_TRUE(false == object->verify_rx_datarate(0));
kadonotakashi 0:8fdf9a60065b 763
kadonotakashi 0:8fdf9a60065b 764 object->get_phy_params().datarates.size = 1;
kadonotakashi 0:8fdf9a60065b 765 uint8_t t[1];
kadonotakashi 0:8fdf9a60065b 766 t[0] = 2;
kadonotakashi 0:8fdf9a60065b 767 object->get_phy_params().datarates.table = t;
kadonotakashi 0:8fdf9a60065b 768 object->get_phy_params().dl_dwell_time_setting = 0;
kadonotakashi 0:8fdf9a60065b 769
kadonotakashi 0:8fdf9a60065b 770 EXPECT_TRUE(true == object->verify_rx_datarate(0));
kadonotakashi 0:8fdf9a60065b 771
kadonotakashi 0:8fdf9a60065b 772 object->get_phy_params().dl_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 773 object->get_phy_params().min_rx_datarate = 0;
kadonotakashi 0:8fdf9a60065b 774
kadonotakashi 0:8fdf9a60065b 775 EXPECT_TRUE(true == object->verify_rx_datarate(0));
kadonotakashi 0:8fdf9a60065b 776 }
kadonotakashi 0:8fdf9a60065b 777
kadonotakashi 0:8fdf9a60065b 778 TEST_F(Test_LoRaPHY, verify_tx_datarate)
kadonotakashi 0:8fdf9a60065b 779 {
kadonotakashi 0:8fdf9a60065b 780 EXPECT_TRUE(false == object->verify_tx_datarate(0));
kadonotakashi 0:8fdf9a60065b 781
kadonotakashi 0:8fdf9a60065b 782 object->get_phy_params().datarates.size = 1;
kadonotakashi 0:8fdf9a60065b 783 uint8_t t[1];
kadonotakashi 0:8fdf9a60065b 784 t[0] = 2;
kadonotakashi 0:8fdf9a60065b 785 object->get_phy_params().datarates.table = t;
kadonotakashi 0:8fdf9a60065b 786 object->get_phy_params().ul_dwell_time_setting = 0;
kadonotakashi 0:8fdf9a60065b 787 EXPECT_TRUE(true == object->verify_tx_datarate(0));
kadonotakashi 0:8fdf9a60065b 788
kadonotakashi 0:8fdf9a60065b 789 object->get_phy_params().ul_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 790 EXPECT_TRUE(true == object->verify_tx_datarate(0));
kadonotakashi 0:8fdf9a60065b 791
kadonotakashi 0:8fdf9a60065b 792 object->get_phy_params().ul_dwell_time_setting = 1;
kadonotakashi 0:8fdf9a60065b 793 EXPECT_TRUE(true == object->verify_tx_datarate(0, true));
kadonotakashi 0:8fdf9a60065b 794 }
kadonotakashi 0:8fdf9a60065b 795
kadonotakashi 0:8fdf9a60065b 796 TEST_F(Test_LoRaPHY, verify_tx_power)
kadonotakashi 0:8fdf9a60065b 797 {
kadonotakashi 0:8fdf9a60065b 798 EXPECT_TRUE(true == object->verify_tx_power(0));
kadonotakashi 0:8fdf9a60065b 799 }
kadonotakashi 0:8fdf9a60065b 800
kadonotakashi 0:8fdf9a60065b 801 TEST_F(Test_LoRaPHY, verify_duty_cycle)
kadonotakashi 0:8fdf9a60065b 802 {
kadonotakashi 0:8fdf9a60065b 803 EXPECT_TRUE(true == object->verify_duty_cycle(false));
kadonotakashi 0:8fdf9a60065b 804
kadonotakashi 0:8fdf9a60065b 805 EXPECT_TRUE(false == object->verify_duty_cycle(true));
kadonotakashi 0:8fdf9a60065b 806 }
kadonotakashi 0:8fdf9a60065b 807
kadonotakashi 0:8fdf9a60065b 808 TEST_F(Test_LoRaPHY, verify_nb_join_trials)
kadonotakashi 0:8fdf9a60065b 809 {
kadonotakashi 0:8fdf9a60065b 810 EXPECT_TRUE(false == object->verify_nb_join_trials(0));
kadonotakashi 0:8fdf9a60065b 811 EXPECT_TRUE(true == object->verify_nb_join_trials(100));
kadonotakashi 0:8fdf9a60065b 812 }
kadonotakashi 0:8fdf9a60065b 813
kadonotakashi 0:8fdf9a60065b 814