diff --git a/cpu/avr/radio/rf230bb/halbb.c b/cpu/avr/radio/rf230bb/halbb.c index 6f24c2701..6c8b1f712 100644 --- a/cpu/avr/radio/rf230bb/halbb.c +++ b/cpu/avr/radio/rf230bb/halbb.c @@ -640,11 +640,11 @@ void RADIO_VECT(void); /* These link to the RF230BB driver in rf230.c */ void rf230_interrupt(void); extern hal_rx_frame_t rxframe; - +/* rf230interruptflag can be printed in the main idle loop for debugging */ #define DEBUG 0 #if DEBUG -volatile char rf230_interrupt_flag=0; -#define INTERRUPTDEBUG(arg) rf230_interrupt_flag=arg +volatile char rf230interruptflag; +#define INTERRUPTDEBUG(arg) rf230interruptflag=arg #else #define INTERRUPTDEBUG(arg) #endif @@ -717,12 +717,18 @@ ISR(RADIO_VECT) if (rxframe.length) INTERRUPTDEBUG(42); else INTERRUPTDEBUG(12); #ifdef RF230_MIN_RX_POWER - /* Discard packets weaker than the minimum if defined */ + /* Discard packets weaker than the minimum if defined. This is for testing miniature meshes.*/ + /* Save the rssi for printing in the main loop */ + volatile extern signed char rf230_last_rssi; #if RF230_CONF_AUTOACK - if (hal_subregister_read(SR_ED_LEVEL) >= RF230_MIN_RX_POWER) { + rf230_last_rssi=hal_subregister_read(SR_ED_LEVEL); + if (rf230_last_rssi >= RF230_MIN_RX_POWER) { +// if (hal_subregister_read(SR_ED_LEVEL) >= RF230_MIN_RX_POWER) { #else - if (hal_subregister_read(SR_RSSI) >= RF230_MIN_RX_POWER) { -#endif + rf230_last_rssi=hal_subregister_read(SR_RSSI); + // if (hal_subregister_read(SR_RSSI) >= RF230_MIN_RX_POWER/3) { + if (rf230_last_rssi >= RF230_MIN_RX_POWER/3) { +#endif #endif hal_frame_read(&rxframe, NULL); rf230_interrupt(); diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index cabfde3ed..fd7ddefa7 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * @(#)$Id: rf230bb.c,v 1.13 2010/11/24 18:46:59 dak664 Exp $ + * @(#)$Id: rf230bb.c,v 1.14 2010/11/26 20:39:15 dak664 Exp $ */ /* * This code is almost device independent and should be easy to port. @@ -965,17 +965,24 @@ if (RF230_receive_on) { /* Process to handle input packets * Receive interrupts cause this process to be polled * It calls the core MAC layer which calls rf230_read to get the packet + * rf230processflag can be printed in the main idle loop for debugging */ -char rf230processflag; //for debugging process call problems +#if 1 +uint8_t rf230processflag; +#define RF230PROCESSFLAG(arg) rf230processflag=arg +#else +#define RF230PROCESSFLAG(arg) +#endif + PROCESS_THREAD(rf230_process, ev, data) { int len; PROCESS_BEGIN(); - rf230processflag=99; + RF230PROCESSFLAG(99); while(1) { PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); - rf230processflag=42; + RF230PROCESSFLAG(42); #if RF230_TIMETABLE_PROFILING TIMETABLE_TIMESTAMP(rf230_timetable, "poll"); #endif /* RF230_TIMETABLE_PROFILING */ @@ -983,13 +990,11 @@ PROCESS_THREAD(rf230_process, ev, data) pending = 0; packetbuf_clear(); - len = rf230_read(packetbuf_dataptr(), PACKETBUF_SIZE); -// printf_P(PSTR("RSSI reads %x "),hal_subregister_read(SR_RSSI)); -// printf_P(PSTR("ED reads %d "),hal_subregister_read(SR_ED_LEVEL)); - rf230processflag=1; + len = rf230_read(packetbuf_dataptr(), PACKETBUF_SIZE); + RF230PROCESSFLAG(1); if(len > 0) { packetbuf_set_datalen(len); - rf230processflag=2; + RF230PROCESSFLAG(2); NETSTACK_RDC.input(); #if RF230_TIMETABLE_PROFILING TIMETABLE_TIMESTAMP(rf230_timetable, "end"); @@ -1105,11 +1110,17 @@ if (RF230_receive_on) { checksum == crc16_data(buf, len - AUX_LEN, 0)) { #endif /* RF230_CONF_CHECKSUM */ +/* Get the received signal strength for the packet, 0-84 dB above rx threshold */ +#if 0 //more general + rf230_last_rssi = rf230_get_raw_rssi(); +#else //faster #if RF230_CONF_AUTOACK rf230_last_rssi = hal_subregister_read(SR_ED_LEVEL); //0-84 resolution 1 dB #else rf230_last_rssi = 3*hal_subregister_read(SR_RSSI); //0-28 resolution 3 dB #endif +#endif /* speed vs. generality */ + rf230_last_correlation = rxframe.lqi; packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rf230_last_rssi); packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, rf230_last_correlation); @@ -1188,7 +1199,7 @@ rf230_get_txpower(void) uint8_t rf230_get_raw_rssi(void) { - uint8_t rssi; + uint8_t rssi,state; bool radio_was_off = 0; /*The RSSI measurement should only be done in RX_ON or BUSY_RX.*/ @@ -1196,12 +1207,15 @@ rf230_get_raw_rssi(void) radio_was_off = 1; rf230_on(); } + /* The energy detect register is used in extended mode (since RSSI will read 0) */ - #if RF230_CONF_AUTOACK - rssi = hal_subregister_read(SR_ED_LEVEL); //0-84, resolution 1 dB -#else - rssi = 3*hal_subregister_read(SR_RSSI); //0-28, resolution 3 dB -#endif +/* The rssi register is multiplied by 3 to a consistent value from either register */ + state=radio_get_trx_state(); + if ((state==RX_AACK_ON) || (state==BUSY_RX_AACK)) { + rssi = hal_subregister_read(SR_ED_LEVEL); //0-84, resolution 1 dB + } else { + rssi = 3*hal_subregister_read(SR_RSSI); //0-28, resolution 3 dB + } if(radio_was_off) { rf230_off(); diff --git a/platform/avr-ravenusb/cdc_task.c b/platform/avr-ravenusb/cdc_task.c index 9da9298f8..554bac8d5 100644 --- a/platform/avr-ravenusb/cdc_task.c +++ b/platform/avr-ravenusb/cdc_task.c @@ -115,6 +115,11 @@ static uint8_t previous_uart_usb_control_line_state = 0; static uint8_t timer = 0; static struct etimer et; +#define CONVERTTXPOWER 1 +#if CONVERTTXPOWER //adds 92 bytes to program flash size +const char txonesdigit[16] PROGMEM = {'3','2','2','1','1','0','0','1','2','3','4','5','7','9','2','7'}; +const char txtenthsdigit[16] PROGMEM = {'0','6','1','6','1','5','2','2','2','2','2','2','2','2','2','2'}; +#endif PROCESS(cdc_process, "CDC serial process"); @@ -200,10 +205,8 @@ PROCESS_THREAD(cdc_process, ev, data_proc) */ void menu_print(void) { - PRINTF_P(PSTR("\n\r********** Jackdaw Menu *********\n\r")); + PRINTF_P(PSTR("\n\r*********** Jackdaw Menu **********\n\r")); PRINTF_P(PSTR("* *\n\r")); - PRINTF_P(PSTR("* Main Menu: *\n\r")); - PRINTF_P(PSTR("* h,? Print this menu *\n\r")); PRINTF_P(PSTR("* m Print current mode *\n\r")); PRINTF_P(PSTR("* s Set to sniffer mode *\n\r")); PRINTF_P(PSTR("* n Set to network mode *\n\r")); @@ -224,6 +227,7 @@ void menu_print(void) if(bootloader_is_present()) PRINTF_P(PSTR("* D Switch to DFU mode *\n\r")); PRINTF_P(PSTR("* R Reset (via WDT) *\n\r")); + PRINTF_P(PSTR("* h,? Print this menu *\n\r")); PRINTF_P(PSTR("* *\n\r")); PRINTF_P(PSTR("* Make selection at any time by *\n\r")); PRINTF_P(PSTR("* pressing your choice on keyboard*\n\r")); @@ -473,8 +477,22 @@ extern uip_ds6_route_t uip_ds6_routing_table[]; } case 'G': - PRINTF_P(PSTR("Global repair returns %d\n\r"),rpl_repair_dag(rpl_get_dag(RPL_ANY_INSTANCE))); + PRINTF_P(PSTR("Global repair returns %d\n\r"),rpl_repair_dag(rpl_get_dag(RPL_ANY_INSTANCE))); break; + + case 'L': + rpl_local_repair(rpl_get_dag(RPL_ANY_INSTANCE)); + PRINTF_P(PSTR("Local repair initiated\n\r")); + break; + + case 'Z': //zap the routing table + { uint8_t i; + for (i = 0; i < UIP_DS6_ROUTE_NB; i++) { + uip_ds6_routing_table[i].isused=0; + } + PRINTF_P(PSTR("Routing table cleared!\n\r")); + break; + } #endif case 'm': @@ -515,11 +533,22 @@ extern uip_ds6_route_t uip_ds6_routing_table[]; ((uint8_t *)&macLongAddr)[7] ); #if RF230BB +#if CONVERTTXPOWER + { + uint8_t power=rf230_get_txpower()&0xf; + char sign=(power<6?'+':'-'); + char tens=(power>14?'1':'0'); + char ones=pgm_read_byte(&txonesdigit[power]); + char tenths=pgm_read_byte(&txtenthsdigit[power]); + PRINTF_P(PSTR(" * Operates on channel %d with TX power %c%c%c.%cdBm\n\r"), rf230_get_channel(),sign,tens,ones,tenths); + } +#else //just show the raw value PRINTF_P(PSTR(" * Operates on channel %d\n\r"), rf230_get_channel()); PRINTF_P(PSTR(" * TX Power(0=3dBm, 15=-17.2dBm): %d\n\r"), rf230_get_txpower()); - PRINTF_P(PSTR(" * Current RSSI: %ddB\n\r"), -91+(rf230_rssi()-1)); - PRINTF_P(PSTR(" * Last RSSI: %ddB\n\r"), -91+(rf230_last_rssi-1)); -#else // RF230BB +#endif + PRINTF_P(PSTR(" * Current/Last RSSI: %d/%ddBm\n\r"), -91+(rf230_rssi()-1), -91+(rf230_last_rssi-1)); + +#else /* RF230BB */ PRINTF_P(PSTR(" * Operates on channel %d\n\r"), radio_get_operating_channel()); PRINTF_P(PSTR(" * TX Power Level: 0x%02X\n\r"), radio_get_tx_power_level()); { @@ -531,9 +560,12 @@ extern uip_ds6_route_t uip_ds6_routing_table[]; PRINTF_P(PSTR("Unknown\n\r")); } -#endif // !RF230BB - PRINTF_P(PSTR(" * Configuration: %d\n\r"), usb_configuration_nb); - PRINTF_P(PSTR(" * usb_eth_is_active: %d\n\r"), usb_eth_is_active); +#endif /* RF230BB */ + + PRINTF_P(PSTR(" * Configuration: %d, USB<->ETH is "), usb_configuration_nb); + if (usb_eth_is_active == 0) PRINTF_P(PSTR("not ")); + PRINTF_P(PSTR("active\n\r")); + break; case 'e': @@ -562,9 +594,10 @@ extern uip_ds6_route_t uip_ds6_routing_table[]; #endif _delay_us(3*10); #if RF230BB - RSSI = rf230_rssi(); + RSSI = rf230_rssi(); //multiplies rssi register by 3 for consistency with energy-detect register #else // RF230BB radio_get_rssi_value(&RSSI); + RSSI*=3; #endif maxRSSI[i-11]=Max(maxRSSI[i-11],RSSI); accRSSI[i-11]+=RSSI; @@ -588,7 +621,7 @@ extern uip_ds6_route_t uip_ds6_routing_table[]; PRINTF_P(PSTR("\n")); for(i=11;i<=26;i++) { uint8_t activity=Min(maxRSSI[i-11],accRSSI[i-11]/(1<<7)); - PRINTF_P(PSTR(" %d: %02ddB "),i, -91+3*(maxRSSI[i-11]-1)); + PRINTF_P(PSTR(" %d: %02ddB "),i, -91+(maxRSSI[i-11]-1)); for(;activity--;maxRSSI[i-11]--) { PRINTF_P(PSTR("#")); } diff --git a/platform/avr-ravenusb/contiki-conf.h b/platform/avr-ravenusb/contiki-conf.h index d2cb21420..d0d0a759c 100644 --- a/platform/avr-ravenusb/contiki-conf.h +++ b/platform/avr-ravenusb/contiki-conf.h @@ -301,8 +301,10 @@ or include the needed source files in /plaftorm/avr-ravenusb/Makefile.avr-ravenu * tx=0 (3dbm, default) to 15 (-17.2dbm) * RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm) * else the rssi register is used having range 0 (91dBm) to 28 (-10dBm) - * For simplicity RF230_MIN_RX_POWER is based on the rssi value and multiplied by 3 when autoack is set. + * For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set. * On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested. + * These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm + * and a 10 meter range to a full-sensitivity RF230 sniffer. */ #define RF230_MAX_TX_POWER 15 #define RF230_MIN_RX_POWER 30 diff --git a/platform/avr-ravenusb/contiki-raven-main.c b/platform/avr-ravenusb/contiki-raven-main.c index 46c86f7e4..0e6889f26 100644 --- a/platform/avr-ravenusb/contiki-raven-main.c +++ b/platform/avr-ravenusb/contiki-raven-main.c @@ -91,8 +91,6 @@ #include "radio/rf230bb/rf230bb.h" #include "net/mac/frame802154.h" #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) -extern int rf230_interrupt_flag; -extern uint8_t rf230processflag; rimeaddr_t macLongAddr; #define tmp_addr macLongAddr #else //legacy radio driver using Atmel/Cisco 802.15.4'ish MAC @@ -488,6 +486,15 @@ main(void) watchdog_periodic(); +/* Print rssi of all received packets, useful for range testing */ +#ifdef RF230_MIN_RX_POWER + uint8_t lastprint; + if (rf230_last_rssi != lastprint) { //can be set in halbb.c interrupt routine + printf_P(PSTR("%u "),rf230_last_rssi); + lastprint=rf230_last_rssi; + } +#endif + #if TESTRTIMER if (rtimerflag) { //8 seconds is maximum interval, my jackdaw 4% slow rtimer_set(&rt, RTIMER_NOW()+ RTIMER_ARCH_SECOND*1UL, 1,(void *) rtimercycle, NULL); @@ -507,8 +514,7 @@ main(void) } #endif /* TESTRTIMER */ -//Use with RF230BB DEBUGFLOW to show path through driver -//Warning, Jackdaw doesn't handle simultaneous radio and USB interrupts very well. +/* Use with rf230bb.c DEBUGFLOW to show the sequence of driver calls from the uip stack */ #if RF230BB&&0 extern uint8_t debugflowsize,debugflow[]; if (debugflowsize) { @@ -518,16 +524,19 @@ extern uint8_t debugflowsize,debugflow[]; } #endif +/* Use for low level interrupt debugging */ #if RF230BB&&0 +extern uint8_t rf230interruptflag; //in halbb.c +extern uint8_t rf230processflag; //in rf230bb.c if (rf230processflag) { printf("**RF230 process flag %u\n\r",rf230processflag); rf230processflag=0; } - if (rf230_interrupt_flag) { -// if (rf230_interrupt_flag!=11) { - printf("**RF230 Interrupt %u\n\r",rf230_interrupt_flag); + if (rf230interruptflag) { +// if (rf230interruptflag!=11) { + printf("**RF230 Interrupt %u\n\r",rf230interruptflag); // } - rf230_interrupt_flag=0; + rf230interruptflag=0; } #endif }