Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FW-877 Heterogeneous radio settings in the Mesh #508

Draft
wants to merge 100 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
6ffee84
Initial commit of code compiling and working and synching but not ful…
minarady1 Mar 10, 2020
92a27e9
wrote radio_set_modulation and radio_local_bootstrap
minarady1 Mar 11, 2020
9035323
some updates
minarady1 Mar 12, 2020
9999fe1
open radio working :)
minarady1 Mar 12, 2020
ff29667
some updates, mainly trying to debug
minarady1 Mar 13, 2020
eebd083
updates
minarady1 Mar 13, 2020
133dc1c
radio at86rf files
minarady1 Mar 13, 2020
984444a
Integrating cc2538rf into the open radio interface
minarady1 Mar 19, 2020
9273ca3
using openradio in openwsn
minarady1 Mar 20, 2020
a6468d7
open radio interface finally working and integrated into openwsn
minarady1 Mar 23, 2020
1669b80
full radio set added to openradio
minarady1 Mar 26, 2020
999f50f
Complete open radio interface for openmote-b tested with 7 modulations.
minarady1 Mar 30, 2020
917665d
Restoring default configuration
minarady1 Mar 30, 2020
64006b5
restoring default config
minarady1 Mar 30, 2020
0de94cb
resorting default configurations and removing unnecessary code used f…
minarady1 Mar 30, 2020
185038e
restoring bsp_radio_tx default code
minarady1 Mar 30, 2020
ecc3bd2
restoring sniffer code
minarady1 Mar 30, 2020
56ed0cf
restoring sniffer code
minarady1 Mar 30, 2020
480f1dc
restoring sniffer code
minarady1 Mar 30, 2020
9226da2
restoring bsp_radio_rx code
minarady1 Mar 30, 2020
6dda3e9
A project for demonstrating the open radio interface on openmote-b:
minarady1 Mar 30, 2020
39a1bdc
Merge branch 'develop_FW-866' of https://github.com/minarady1/openwsn…
minarady1 Mar 30, 2020
f0d59e5
openradio interface cleaning in progress
minarady1 Apr 15, 2020
6bae185
modivided slot 40 for FSK and added slot 41 for ofdm1 mcs3
minarady1 Apr 16, 2020
75b7eb1
introduced slot_template instead of slot duration
minarady1 Apr 16, 2020
d2b9c40
cleaneing openradio interface + adding comments + using slot template…
minarady1 Apr 16, 2020
0166d42
comments+cleaning
minarady1 Apr 16, 2020
aa7237b
Merge branch 'develop' into develop_FW-866
minarady1 Apr 16, 2020
2464d80
minor fixes
minarady1 Apr 16, 2020
f23a799
macpong
minarady1 Apr 16, 2020
4882b35
Merge branch 'develop_FW-866' of https://github.com/minarady1/openwsn…
minarady1 Apr 16, 2020
c9f560e
changing slot templates to struct variables instead of #def constants
minarady1 Apr 17, 2020
e5fdab3
slot_duration struct update
minarady1 Apr 17, 2020
4e484f2
adding few helper functions to handle slot info
minarady1 Apr 17, 2020
74ca322
quick update
minarady1 Apr 17, 2020
48f3080
fixed dynamic slot selection + code formatting
minarady1 Apr 21, 2020
6ecca16
Final fixes to the dynamic slot selection at runtime. This feature no…
minarady1 Apr 22, 2020
49d565f
cleaning up code for bsp, projacts, MAC, IAR project files and .gitig…
minarady1 Apr 23, 2020
a506320
Updated radio drivers for python board + at86rf231 board to be compli…
minarady1 Apr 23, 2020
6a8f446
restoring defaults
minarady1 Apr 23, 2020
5e6ca11
FW-866 fixed slot template timing references as per PR comments
minarady1 Apr 24, 2020
ba85ad8
FW-866 merged board_setSlotType (slotType) and slot_board_vars_t boar…
minarady1 Apr 24, 2020
c861218
FW-866 fixing indentation, variable names for openradio + adjusting 2…
minarady1 Apr 24, 2020
5110952
FW-866 restoring tx/rx common project
minarady1 Apr 24, 2020
5538db7
increased testbed bootload timeout
minarady1 May 6, 2020
0883865
- EBs are transmitted on 3 cells
minarady1 May 8, 2020
72b22ef
modifing addactive slot to use cell radio setting
minarady1 May 14, 2020
3367bd5
EB transmitted on 3 slots with dynamically configured radios and slot…
minarady1 May 14, 2020
465368e
FW-877 EBs transmitting on het. radios successfully
minarady1 Jun 16, 2020
4abc73e
FW-877 radio setting column created for neighbor table. First EB adds…
minarady1 Jun 22, 2020
a6b96db
fw-877 three neighbors register successfully with 3 radios(for one mo…
minarady1 Jun 24, 2020
df696f7
fw-877 different join priority values are used for each radio and dec…
minarady1 Jun 25, 2020
4e89839
fw-877 dummy dagranks used for each radio, neighbor_getjoinproxy is u…
minarady1 Jun 25, 2020
03c3689
fw-877 added cemmradiosetting in debugprint
minarady1 Aug 12, 2020
fb079ab
fw-877 sixtop add/relocate cells progress
minarady1 Aug 18, 2020
6110eeb
fw-877 using neighborKey instead of openaddr in different locations
minarady1 Sep 4, 2020
a5ffc10
fw-877 modifying cjon procedure to depend on neighborKey
minarady1 Sep 4, 2020
9228205
fw-877 including the cellRadioSetting in the 6p addcells request
minarady1 Sep 4, 2020
d3ff4c9
fw-877 integrating cellRadioSetting_t in the schedule
minarady1 Sep 4, 2020
079f0a5
fw-877 undoing the neighborKey struct since it lead to more complicat…
minarady1 Sep 10, 2020
6c88226
fw-877 updating sixtop to specify the cellRadioSetting in the in the …
minarady1 Sep 14, 2020
882c01c
fw-877 updating icmpv6rpl.c to update DIO info in the neighbor table …
minarady1 Sep 14, 2020
35fcc2b
fw-877 temp hack for testing parent selection with different DAGRanks…
minarady1 Sep 14, 2020
6b8a157
fw-877 adding the cellRadioSetting member to ieee154evars
minarady1 Sep 15, 2020
94c0007
fw-877 updating msf housekeeping function and msf helper functions to…
minarady1 Sep 15, 2020
18307b8
fw-877 updating neighbors_updateSequenceNumber and neighbors_resetSeq…
minarady1 Sep 15, 2020
149056a
fw-877 updating schedule interface and helper functions to include th…
minarady1 Sep 15, 2020
3416093
fw-877 updating sixtop to use cellRadioSetting in Clear command and i…
minarady1 Sep 15, 2020
4e57791
fw-877 updating the routing algorithm code to include the radio setti…
minarady1 Sep 15, 2020
2cc1c38
fw-877 updating the radio setting of packets to be forwarded after pa…
minarady1 Sep 15, 2020
a531cab
dummy
minarady1 Sep 15, 2020
2103354
fw-877 updating board timings for cc2538 radio
minarady1 Sep 17, 2020
0aa22f4
fw-877 updating comments for at86rf215 settings
minarady1 Sep 17, 2020
4265dab
fw-877 updating weights for link metric objective function calculatio…
minarady1 Sep 17, 2020
ac84804
fw-877 fixes to the ieee54e layer
minarady1 Sep 17, 2020
26f4633
fw-877 introducing the new link Metric function
minarady1 Sep 17, 2020
a4ada63
fw-877 updating RPL to create 3 DIOs, for the three min. cells, inste…
minarady1 Sep 17, 2020
2886182
fw-877 selective uploading feature
minarady1 Sep 23, 2020
f452684
fw-877 new weights for PHY layer link metric function
minarady1 Sep 23, 2020
a0d112e
fw-877 restoring cjoin timeout
minarady1 Sep 23, 2020
dc4322a
fw-877 extended uinject payload
minarady1 Sep 23, 2020
fe1e99a
fw-877 extended duty cycle stats in MAC layer
minarady1 Sep 23, 2020
969f3d7
fw-877 new schedule helper function schedule_hasNegotiatedCellToNeigh…
minarady1 Sep 23, 2020
35293f6
fw-877 using default radiosetting for sixtop requests if dedicated ce…
minarady1 Sep 23, 2020
a32486c
fw-877 forwarding sub-layer updated to identify parent as combination…
minarady1 Sep 23, 2020
7253599
fw-877 updating parent definition to include radio setting in layer 3
minarady1 Sep 23, 2020
76bd1a9
fw-877 updating openqueue to get and reset queue occupancy stats
minarady1 Sep 23, 2020
9db91b7
fw-877 restoing opendefs g6tisch parameters
minarady1 Oct 7, 2020
6799ad1
fw-877 capturing radio-specific duty cycle measurements in the uinjec…
minarady1 Oct 7, 2020
766fad7
fw-877 capturing radio-specific duty cycle measurements in the mac layer
minarady1 Oct 7, 2020
a6ae140
fw-877 temporary hack to continue adding cells before cell clearing i…
minarady1 Oct 7, 2020
4350c12
fw-877 enhanced join procedure
minarady1 Oct 7, 2020
5f7cfbd
fw-877 ignoring the radio setting while getting the number of backup …
minarady1 Oct 7, 2020
01d6ad8
FW_877
minarady1 Sep 14, 2021
cd8e553
FW-553 simple network relay code.
minarady1 Oct 11, 2021
925e8b8
FW-533 String retrieved over serial and transfered to a payload varia…
minarady1 Oct 11, 2021
e468bef
FW-533 payload is transferred to packet and periodic transmission starts
minarady1 Oct 11, 2021
61a96db
FW-553 tx/rx link established
minarady1 Oct 12, 2021
23ad631
FW-553 implements frame validity check and prevents inverse routing a…
minarady1 Oct 12, 2021
8d3d678
Update 02drv_relay.c
minarady1 Oct 12, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
Debug
settings
*.dep
*.ewd
*.ewt
*.bak
*.sfr
*.o
*.exe
Expand All @@ -24,3 +27,5 @@ settings
/projects/telosb/01bsp_uart/path.txt
/projects/telosb/03oos_macpong/path.txt
/projects/telosb/02drv_opentimers/path.txt
/projects/openmote-b/01bsp_openradio_rx/log.txt
/projects/openmote-b/01bsp_radio_tx/asm.s
2 changes: 1 addition & 1 deletion SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import sys
import platform
import SCons

#============================ banner ==========================================
#============================ banner =========================================

banner = []
banner += [""]
Expand Down
145 changes: 131 additions & 14 deletions bootloader/openmote-cc2538/ot_program.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,105 @@
#============================ defines =========================================
BROKER_ADDRESS = "argus.paris.inria.fr"
NUMBER_OF_MOTES = 80 - 4 # 4 motes are used for local test
BOOT_MODE = "default" #"default" or "subset"

# subset used for 10% disturbance experiments
mote_subset1 = [
"00-12-4b-00-14-b5-b5-95"
]

# subset used for 10% disturbance experiments
#mote_subset = [
#"00-12-4b-00-14-b5-b5-8c",
#"00-12-4b-00-14-b5-b6-02",
#"00-12-4b-00-14-b5-b5-7e",
#"00-12-4b-00-14-b5-b6-1c"
#]
temp_subset=[
"00-12-4b-00-14-b5-b6-46",
"00-12-4b-00-14-b5-b6-1c",
"00-12-4b-00-14-b5-b5-57",
"00-12-4b-00-14-b5-b5-58",
"00-12-4b-00-14-b5-b5-a3",
"00-12-4b-00-14-b5-b6-3a",
"00-12-4b-00-14-b5-b6-18",
"00-12-4b-00-14-b5-b5-8c",
"00-12-4b-00-14-b5-b5-71",
"00-12-4b-00-14-b5-b6-12"

]
# subset used for 50% density experiments
#mote_subset = [
#"00-12-4b-00-14-b5-b4-8d",
#"00-12-4b-00-14-b5-b5-71",
#"00-12-4b-00-14-b5-b5-b5",
#"00-12-4b-00-14-b5-b5-93",
#"00-12-4b-00-14-b5-b5-a3",
#"00-12-4b-00-14-b5-b6-02",
#"00-12-4b-00-14-b5-b6-05",
#"00-12-4b-00-14-b5-b6-1c",
#"00-12-4b-00-14-b5-b5-a9",
#"00-12-4b-00-14-b5-b5-88",
#"00-12-4b-00-14-b5-b4-62",
#"00-12-4b-00-14-b5-b6-22",
#"00-12-4b-00-14-b5-b5-63",
#"00-12-4b-00-14-b5-b6-0b",
#"00-12-4b-00-14-b5-b6-40",
#"00-12-4b-00-14-b5-b5-d8",
#"00-12-4b-00-14-b5-b6-12",
#"00-12-4b-00-14-b5-b6-18",
#"00-12-4b-00-14-b5-b6-3a",
#"00-12-4b-00-14-b5-b5-57",
#"00-12-4b-00-14-b5-b6-48"
#]

# motes in building a
mote_subset2 = [
"00-12-4b-00-14-b5-b5-95",
"00-12-4b-00-14-b5-b5-d8",
"00-12-4b-00-14-b5-b4-8d",
"00-12-4b-00-14-b5-b6-22",
"00-12-4b-00-14-b5-b6-40",
"00-12-4b-00-14-b5-b6-29",
"00-12-4b-00-14-b5-b6-46",
"00-12-4b-00-14-b5-b6-47",
"00-12-4b-00-14-b5-b6-02",
"00-12-4b-00-14-b5-b6-1c",
"00-12-4b-00-14-b5-b6-1a",
"00-12-4b-00-14-b5-b5-e7",
"00-12-4b-00-14-b5-b4-62",
"00-12-4b-00-14-b5-b4-98",
"00-12-4b-00-14-b5-b5-a9",
"00-12-4b-00-14-b5-b5-57",
"00-12-4b-00-14-b5-b5-58",
"00-12-4b-00-14-b5-b5-88",
"00-12-4b-00-14-b5-b5-3d",
"00-12-4b-00-14-b5-b5-a3",
"00-12-4b-00-14-b5-b4-aa",
"00-12-4b-00-14-b5-b5-5b",
"00-12-4b-00-14-b5-b6-48",
"00-12-4b-00-14-b5-b5-7e",
"00-12-4b-00-14-b5-b6-3a",
"00-12-4b-00-14-b5-b6-38",
"00-12-4b-00-14-b5-b5-93",
"00-12-4b-00-14-b5-b6-18",
"00-12-4b-00-14-b5-b5-b5",
"00-12-4b-00-14-b5-b5-f8",
"00-12-4b-00-14-b5-b5-b7",
"00-12-4b-00-14-b5-b5-8c",
"00-12-4b-00-14-b5-b6-0b",
"00-12-4b-00-14-b5-b5-f1",
"00-12-4b-00-14-b5-b5-f3",
"00-12-4b-00-14-b5-b5-f2",
"00-12-4b-00-14-b5-b5-bf",
"00-12-4b-00-14-b5-b6-05",
"00-12-4b-00-14-b5-b5-63",
"00-12-4b-00-14-b5-b5-71",
"00-12-4b-00-14-b5-b5-65",
"00-12-4b-00-14-b5-b6-12"
]

mote_subset = temp_subset

#============================ classes =========================================
class program_over_testbed(object):
Expand All @@ -18,14 +117,14 @@ class program_over_testbed(object):
CMD = 'program'

# in seconds, should be larger than the time starting from publishing message until receiving the response
MESSAGE_RESP_TIMEOUT = 30
MESSAGE_RESP_TIMEOUT = 60

def __init__(self, mote, image_path):

# initialize parameters
self.mote = mote
self.image = None

print "\tprogramming: {0}".format(mote)
# check bootload backdoor is configured correctly

bootloader_backdoor_enabled = False
Expand Down Expand Up @@ -66,10 +165,6 @@ def __init__(self, mote, image_path):
'failed_messages_topic': []
}

# mqtt topic string format
self.mqtttopic_mote_cmd = 'opentestbed/deviceType/mote/deviceId/{0}/cmd/{1}'.format(self.mote,self.CMD)
self.mqtttopic_mote_resp = 'opentestbed/deviceType/mote/deviceId/{0}/resp/{1}'.format(self.mote,self.CMD)

# connect to MQTT
self.mqttclient = mqtt.Client(self.CLIENT_ID)
self.mqttclient.on_connect = self._on_mqtt_connect
Expand All @@ -85,12 +180,33 @@ def __init__(self, mote, image_path):
'description': self.image_name,
'hex': self.image,
}
# publish the cmd message
self.mqttclient.publish(
topic = self.mqtttopic_mote_cmd,
payload = json.dumps(payload_program_image),
)

if BOOT_MODE == 'default':
# mqtt topic string format
self.mqtttopic_mote_cmd = 'opentestbed/deviceType/mote/deviceId/{0}/cmd/{1}'.format(self.mote,self.CMD)
self.mqtttopic_mote_resp = 'opentestbed/deviceType/mote/deviceId/{0}/resp/{1}'.format(self.mote,self.CMD)
print "\tcmd: {}".format(self.mqtttopic_mote_cmd)
# publish the cmd message
self.mqttclient.publish(
topic = self.mqtttopic_mote_cmd,
payload = json.dumps(payload_program_image),
)
elif BOOT_MODE == "subset":
i = 0
for m in mote_subset:
# mqtt topic string format
self.mqtttopic_mote_cmd = 'opentestbed/deviceType/mote/deviceId/{0}/cmd/{1}'.format(m,self.CMD)
self.mqtttopic_mote_resp = 'opentestbed/deviceType/mote/deviceId/{0}/resp/{1}'.format(m,self.CMD)
print "\tcmd: {}".format(self.mqtttopic_mote_cmd)
self.mqttclient.publish(
topic = self.mqtttopic_mote_cmd,
payload = json.dumps(payload_program_image),
)
# wait = random.randrange(60, 360, 1) # a random value beween 1 and 3 minutes
wait = 5
time.sleep(wait)
i+=1
if i%10==0:
time.sleep(5)
try:
# wait maxmium MESSAGE_RESP_TIMEOUT seconds before return
self.cmd_response_success_queue.get(timeout=self.MESSAGE_RESP_TIMEOUT)
Expand Down Expand Up @@ -118,7 +234,8 @@ def _on_mqtt_message(self, client, userdata, message):
'''
Record the number of message received and success status
'''

print userdata
print message
self.response_success['message_counter'] += 1
if json.loads(message.payload)['success']:
self.response_success['success_counter'] += 1
Expand Down Expand Up @@ -187,4 +304,4 @@ def usage():
raise Exception('No file path given.')

#==== program_over_testbed
program_over_testbed(configure['mote_address'], configure['image_name_path'])
program_over_testbed(configure['mote_address'], configure['image_name_path'])
40 changes: 35 additions & 5 deletions bsp/boards/board.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,55 @@
#include "toolchain_defs.h"

//=========================== define ==========================================
#define SLOTDURATION_MS board_getSlotDuration()/PORT_TICS_PER_MS

typedef enum {
DO_NOT_KICK_SCHEDULER = 0,
KICK_SCHEDULER = 1,
} kick_scheduler_t;


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove the additional empty lines here


//=========================== typedef =========================================
typedef struct {
uint16_t slotDuration;

// execution speed related
// also implementation related (e.g. SoC radio or spi-connected radio because of the time to load a packet to/from radio)
uint16_t maxTxDataPrepare;
uint16_t maxRxAckPrepare;
uint16_t maxRxDataPrepare;
uint16_t maxTxAckPrepare;

// radio speed related
// also implementation related (because the time to execute the Tx/Rx command is highly dependent on the radio AND the configuration)
uint16_t delayTx;
uint16_t delayRx;
} slot_board_vars_t; //board specific slot vars

// available slot templates
typedef enum{
SLOT_10ms,
SLOT_20ms_24GHZ,
SLOT_40ms_24GHZ,
SLOT_40ms_FSK_SUBGHZ,
SLOT_40ms_OFDM1MCS0_3_SUBGHZ,
MAX_SLOT_TYPES,
} slotType_t;

//=========================== variables =======================================

//=========================== prototypes ======================================

void board_init(void);
void board_sleep(void);
void board_reset(void);

void board_init(void);
void board_sleep(void);
void board_reset(void);
uint16_t board_getSlotDuration (void);
slot_board_vars_t board_selectSlotTemplate(slotType_t slot_type);
/**
\}
\}
*/

//=========================== private =========================================
void board_init_slot_vars(void);
#endif
36 changes: 35 additions & 1 deletion bsp/boards/iot-lab_A8-M3/board.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
#include "nvic.h"
#include "debugpins.h"

//=========================== variable ========================================
//=========================== variables =======================================

slot_board_vars_t slot_board_vars [MAX_SLOT_TYPES];
slotType_t selected_slot_type;

//=========================== private =========================================

Expand All @@ -25,6 +28,8 @@ void GPIO_Config_ALL_AIN(void);
// configure the hard fault exception
void board_enableHardFaultExceptionHandler(void);


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

only one empty line space between codes, please remove the two empty lines here.


//=========================== main ============================================

extern int mote_main(void);
Expand Down Expand Up @@ -96,6 +101,35 @@ void board_init(void){
debugpins_init();
//enable nvic for the radio
NVIC_radio();
board_init_slot_vars();
}


//==== bootstrapping slot info lookup table
void board_init_slot_vars(void){

// 20ms slot
slot_board_vars [SLOT_20ms_24GHZ].slotDuration = 655 ; // ms
slot_board_vars [SLOT_20ms_24GHZ].maxTxDataPrepare = 110 ; // 3355us (not measured)
slot_board_vars [SLOT_20ms_24GHZ].maxRxAckPrepare = 20 ; // 610us (not measured)
slot_board_vars [SLOT_20ms_24GHZ].maxRxDataPrepare = 33 ; // 1000us (not measured)
slot_board_vars [SLOT_20ms_24GHZ].maxTxAckPrepare = 50 ; // 1525us (not measured)
slot_board_vars [SLOT_20ms_24GHZ].delayTx = 18 ; // 549us (not measured)
slot_board_vars [SLOT_20ms_24GHZ].delayRx = 0 ; // 0us (can not measure)
}

// To get the current slotDuration at any time
// used during initialization by sixtop to fire the first sixtop EB
uint16_t board_getSlotDuration (void)
{
return slot_board_vars [selected_slot_type].slotDuration;
}

// Setter/Getter function for slot_board_vars
slot_board_vars_t board_selectSlotTemplate (slotType_t slot_type)
{
selected_slot_type = slot_type;
return slot_board_vars [selected_slot_type];
}

void board_sleep(void) {
Expand Down
17 changes: 0 additions & 17 deletions bsp/boards/iot-lab_A8-M3/board_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,6 @@ to return the board's description.
#define PORT_PIN_RADIO_RESET_HIGH() //GPIOC->ODR |= 0X0040;// nothing
#define PORT_PIN_RADIO_RESET_LOW() //GPIOC->ODR &= ~0X0040;// nothing

//===== IEEE802154E timing

#define SLOTDURATION 20 // in miliseconds

// time-slot related
#define PORT_TsSlotDuration 655 // 20ms

// execution speed related
#define PORT_maxTxDataPrepare 110 // 3355us (not measured)
#define PORT_maxRxAckPrepare 20 // 610us (not measured)
#define PORT_maxRxDataPrepare 33 // 1000us (not measured)
#define PORT_maxTxAckPrepare 50 // 1525us (not measured)

// radio speed related
#define PORT_delayTx 18 // 549us (not measured)
#define PORT_delayRx 0 // 0us (can not measure)
// radio watchdog

//===== adaptive_sync accuracy

Expand Down
Loading