From 70b43e0bf6e52849bf1a71243bb73f2dd2101c3d Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Fri, 23 Feb 2018 05:28:40 -0800 Subject: [PATCH 1/6] Logging module: added ability to force logging --- os/sys/log.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/os/sys/log.h b/os/sys/log.h index 290ee212c..9433017a7 100644 --- a/os/sys/log.h +++ b/os/sys/log.h @@ -145,21 +145,25 @@ extern struct log_module all_modules[]; } while (0) /* More compact versions of LOG macros */ +#define LOG_PRINT(...) LOG(1, 0, "PRI", __VA_ARGS__) #define LOG_ERR(...) LOG(1, LOG_LEVEL_ERR, "ERR", __VA_ARGS__) #define LOG_WARN(...) LOG(1, LOG_LEVEL_WARN, "WARN", __VA_ARGS__) #define LOG_INFO(...) LOG(1, LOG_LEVEL_INFO, "INFO", __VA_ARGS__) #define LOG_DBG(...) LOG(1, LOG_LEVEL_DBG, "DBG", __VA_ARGS__) +#define LOG_PRINT_(...) LOG(0, 0, "PRI", __VA_ARGS__) #define LOG_ERR_(...) LOG(0, LOG_LEVEL_ERR, "ERR", __VA_ARGS__) #define LOG_WARN_(...) LOG(0, LOG_LEVEL_WARN, "WARN", __VA_ARGS__) #define LOG_INFO_(...) LOG(0, LOG_LEVEL_INFO, "INFO", __VA_ARGS__) #define LOG_DBG_(...) LOG(0, LOG_LEVEL_DBG, "DBG", __VA_ARGS__) +#define LOG_PRINT_LLADDR(...) LOG_LLADDR(0, __VA_ARGS__) #define LOG_ERR_LLADDR(...) LOG_LLADDR(LOG_LEVEL_ERR, __VA_ARGS__) #define LOG_WARN_LLADDR(...) LOG_LLADDR(LOG_LEVEL_WARN, __VA_ARGS__) #define LOG_INFO_LLADDR(...) LOG_LLADDR(LOG_LEVEL_INFO, __VA_ARGS__) #define LOG_DBG_LLADDR(...) LOG_LLADDR(LOG_LEVEL_DBG, __VA_ARGS__) +#define LOG_PRINT_6ADDR(...) LOG_6ADDR(0, __VA_ARGS__) #define LOG_ERR_6ADDR(...) LOG_6ADDR(LOG_LEVEL_ERR, __VA_ARGS__) #define LOG_WARN_6ADDR(...) LOG_6ADDR(LOG_LEVEL_WARN, __VA_ARGS__) #define LOG_INFO_6ADDR(...) LOG_6ADDR(LOG_LEVEL_INFO, __VA_ARGS__) From 8f742a1a6218ca80ac6d0e45139c82b43b1ec056 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Fri, 23 Feb 2018 05:29:24 -0800 Subject: [PATCH 2/6] tsch_schedule_print: use LOG_PRINT instead of printf --- os/net/mac/tsch/tsch-schedule.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/os/net/mac/tsch/tsch-schedule.c b/os/net/mac/tsch/tsch-schedule.c index dd31afecd..193827f44 100644 --- a/os/net/mac/tsch/tsch-schedule.c +++ b/os/net/mac/tsch/tsch-schedule.c @@ -452,16 +452,15 @@ tsch_schedule_print(void) if(!tsch_is_locked()) { struct tsch_slotframe *sf = list_head(slotframe_list); - printf("Schedule: slotframe list\n"); + LOG_PRINT("----- start slotframe list -----\n"); while(sf != NULL) { struct tsch_link *l = list_head(sf->links_list); - printf("[Slotframe] Handle %u, size %u\n", sf->handle, sf->size.val); - printf("List of links:\n"); + LOG_PRINT("Slotframe Handle %u, size %u\n", sf->handle, sf->size.val); while(l != NULL) { - printf("[Link] Options %02x, type %u, timeslot %u, channel offset %u, address %u\n", + LOG_PRINT("* Link Options %02x, type %u, timeslot %u, channel offset %u, address %u\n", l->link_options, l->link_type, l->timeslot, l->channel_offset, l->addr.u8[7]); l = list_item_next(l); } @@ -469,7 +468,7 @@ tsch_schedule_print(void) sf = list_item_next(sf); } - printf("Schedule: end of slotframe list\n"); + LOG_PRINT("----- end slotframe list -----\n"); } } /*---------------------------------------------------------------------------*/ From 539d717263227c853e76868b19c29e38d0641295 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Fri, 23 Feb 2018 05:31:03 -0800 Subject: [PATCH 3/6] Fix simple-node example configuration --- examples/6tisch/simple-node/Makefile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/6tisch/simple-node/Makefile b/examples/6tisch/simple-node/Makefile index e6cb76944..fbdeb804a 100644 --- a/examples/6tisch/simple-node/Makefile +++ b/examples/6tisch/simple-node/Makefile @@ -3,9 +3,12 @@ all: $(CONTIKI_PROJECT) CONTIKI=../../.. -MAKE_WITH_ORCHESTRA ?= 0 # force Orchestra from command line -MAKE_WITH_SECURITY ?= 0 # force Security from command line -MAKE_WITH_PERIODIC_ROUTES_PRINT ?= 0 # print #routes periodically, used for regression tests + # force Orchestra from command line +MAKE_WITH_ORCHESTRA ?= 0 +# force Security from command line +MAKE_WITH_SECURITY ?= 0 + # print #routes periodically, used for regression tests +MAKE_WITH_PERIODIC_ROUTES_PRINT ?= 0 MAKE_MAC = MAKE_MAC_TSCH MODULES += os/services/shell From ddaacdd41d883eda4ddff51234e3375c0e8a3def Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sun, 25 Feb 2018 06:23:42 -0800 Subject: [PATCH 4/6] Only use LOG_*_ENABLED flags from within C 'if' statements --- os/net/ipv6/sicslowpan.c | 16 +++--- os/net/ipv6/uip-ds6-route.c | 64 ++++++++++++------------ os/net/ipv6/uip-sr.c | 14 +++--- os/net/routing/rpl-lite/rpl-dag.c | 18 +++---- os/net/routing/rpl-lite/rpl-nbr-policy.c | 22 +------- os/net/routing/rpl-lite/rpl-timers.c | 6 +-- 6 files changed, 59 insertions(+), 81 deletions(-) diff --git a/os/net/ipv6/sicslowpan.c b/os/net/ipv6/sicslowpan.c index 9bb906f6d..3a08df83a 100644 --- a/os/net/ipv6/sicslowpan.c +++ b/os/net/ipv6/sicslowpan.c @@ -671,8 +671,8 @@ compress_hdr_iphc(linkaddr_t *link_destaddr) int ext_hdr_len; struct uip_udp_hdr *udp_buf; -#if LOG_DBG_ENABLED - { uint16_t ndx; + if(LOG_DBG_ENABLED) { + uint16_t ndx; LOG_DBG("before compression (%d): ", UIP_IP_BUF->len[1]); for(ndx = 0; ndx < UIP_IP_BUF->len[1] + 40; ndx++) { uint8_t data = ((uint8_t *) (UIP_IP_BUF))[ndx]; @@ -680,7 +680,6 @@ compress_hdr_iphc(linkaddr_t *link_destaddr) } LOG_DBG("\n"); } -#endif /* LOG_DBG_ENABLED */ hc06_ptr = PACKETBUF_IPHC_BUF + 2; /* @@ -996,16 +995,15 @@ compress_hdr_iphc(linkaddr_t *link_destaddr) PACKETBUF_IPHC_BUF[0] = iphc0; PACKETBUF_IPHC_BUF[1] = iphc1; -#if LOG_DBG_ENABLED - { uint16_t ndx; + if(LOG_DBG_ENABLED) { + uint16_t ndx; LOG_DBG("after compression %d: ", (int)(hc06_ptr - packetbuf_ptr)); for(ndx = 0; ndx < hc06_ptr - packetbuf_ptr; ndx++) { uint8_t data = ((uint8_t *) packetbuf_ptr)[ndx]; LOG_DBG("%02x", data); } LOG_DBG("\n"); - } -#endif + } packetbuf_hdr_len = hc06_ptr - packetbuf_ptr; } @@ -1906,8 +1904,7 @@ input(void) LOG_INFO("input: IP packet ready (length %d)\n", uip_len); -#if LOG_DBG_ENABLED - { + if(LOG_DBG_ENABLED) { uint16_t ndx; LOG_DBG("after decompression %u:", UIP_IP_BUF->len[1]); for (ndx = 0; ndx < UIP_IP_BUF->len[1] + 40; ndx++) { @@ -1916,7 +1913,6 @@ input(void) } LOG_DBG("\n"); } -#endif /* LOG_DBG_ENABLED */ /* if callback is set then set attributes and call */ if(callback) { diff --git a/os/net/ipv6/uip-ds6-route.c b/os/net/ipv6/uip-ds6-route.c index 9321b632c..a8fdd88fb 100644 --- a/os/net/ipv6/uip-ds6-route.c +++ b/os/net/ipv6/uip-ds6-route.c @@ -103,7 +103,6 @@ LIST(notificationlist); #endif /*---------------------------------------------------------------------------*/ -#if LOG_DBG_ENABLED static void assert_nbr_routes_list_sane(void) { @@ -131,7 +130,6 @@ assert_nbr_routes_list_sane(void) } #endif /* (UIP_MAX_ROUTES != 0) */ } -#endif /* LOG_DBG_ENABLED */ /*---------------------------------------------------------------------------*/ #if UIP_DS6_NOTIFICATIONS static void @@ -330,9 +328,9 @@ uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, uip_ds6_route_t *r; struct uip_ds6_route_neighbor_route *nbrr; -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } if(ipaddr == NULL || nexthop == NULL) { return NULL; @@ -473,9 +471,9 @@ uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, call_route_callback(UIP_DS6_NOTIFICATION_ROUTE_ADD, ipaddr, nexthop); #endif -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } return r; #else /* (UIP_MAX_ROUTES != 0) */ @@ -489,9 +487,11 @@ uip_ds6_route_rm(uip_ds6_route_t *route) { #if (UIP_MAX_ROUTES != 0) struct uip_ds6_route_neighbor_route *neighbor_route; -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } + if(route != NULL && route->neighbor_routes != NULL) { LOG_INFO("Rm: removing route: "); @@ -541,9 +541,9 @@ uip_ds6_route_rm(uip_ds6_route_t *route) #endif } -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } #endif /* (UIP_MAX_ROUTES != 0) */ return; @@ -553,9 +553,10 @@ uip_ds6_route_rm(uip_ds6_route_t *route) static void rm_routelist(struct uip_ds6_route_neighbor_routes *routes) { -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } + if(routes != NULL && routes->route_list != NULL) { struct uip_ds6_route_neighbor_route *r; r = list_head(routes->route_list); @@ -565,9 +566,10 @@ rm_routelist(struct uip_ds6_route_neighbor_routes *routes) } nbr_table_remove(nbr_routes, routes); } -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } } /*---------------------------------------------------------------------------*/ static void @@ -603,9 +605,9 @@ uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) { uip_ds6_defrt_t *d; -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } if(ipaddr == NULL) { return NULL; @@ -643,9 +645,9 @@ uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) call_route_callback(UIP_DS6_NOTIFICATION_DEFRT_ADD, ipaddr, ipaddr); #endif -#if LOG_DBG_ENABLED +if(LOG_DBG_ENABLED) { assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ +} return d; } @@ -655,9 +657,9 @@ uip_ds6_defrt_rm(uip_ds6_defrt_t *defrt) { uip_ds6_defrt_t *d; -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } /* Make sure that the defrt is in the list before we remove it. */ for(d = list_head(defaultrouterlist); @@ -675,10 +677,10 @@ uip_ds6_defrt_rm(uip_ds6_defrt_t *defrt) return; } } -#if LOG_DBG_ENABLED - assert_nbr_routes_list_sane(); -#endif /* LOG_DBG_ENABLED */ + if(LOG_DBG_ENABLED) { + assert_nbr_routes_list_sane(); + } } /*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * diff --git a/os/net/ipv6/uip-sr.c b/os/net/ipv6/uip-sr.c index 9b859fb3a..15b123552 100644 --- a/os/net/ipv6/uip-sr.c +++ b/os/net/ipv6/uip-sr.c @@ -217,13 +217,13 @@ uip_sr_periodic(unsigned seconds) break; } } -#if LOG_INFO_ENABLED - uip_ipaddr_t node_addr; - NETSTACK_ROUTING.get_sr_node_ipaddr(&node_addr, l); - LOG_INFO("NS: removing expired node "); - LOG_INFO_6ADDR(&node_addr); - LOG_INFO_("\n"); -#endif /* LOG_INFO_ENABLED */ + if(LOG_INFO_ENABLED) { + uip_ipaddr_t node_addr; + NETSTACK_ROUTING.get_sr_node_ipaddr(&node_addr, l); + LOG_INFO("NS: removing expired node "); + LOG_INFO_6ADDR(&node_addr); + LOG_INFO_("\n"); + } /* No child found, deallocate node */ list_remove(nodelist, l); memb_free(&nodememb, l); diff --git a/os/net/routing/rpl-lite/rpl-dag.c b/os/net/routing/rpl-lite/rpl-dag.c index fed488013..5074dd482 100644 --- a/os/net/routing/rpl-lite/rpl-dag.c +++ b/os/net/routing/rpl-lite/rpl-dag.c @@ -185,9 +185,9 @@ rpl_global_repair(const char *str) if(rpl_dag_root_is_root()) { LOG_WARN("initiating global repair (%s), version %u, rank %u)\n", str, curr_instance.dag.version, curr_instance.dag.rank); -#if LOG_INFO_ENABLED - rpl_neighbor_print_list("Global repair (before)"); -#endif /* LOG_INFO_ENABLED */ + if(LOG_INFO_ENABLED) { + rpl_neighbor_print_list("Global repair (before)"); + } /* Initiate global repair */ RPL_LOLLIPOP_INCREMENT(curr_instance.dag.version); /* New DAG version */ @@ -202,9 +202,9 @@ global_repair_non_root(rpl_dio_t *dio) if(!rpl_dag_root_is_root()) { LOG_WARN("participating in global repair, version %u, rank %u)\n", curr_instance.dag.version, curr_instance.dag.rank); -#if LOG_INFO_ENABLED - rpl_neighbor_print_list("Global repair (before)"); -#endif /* LOG_INFO_ENABLED */ + if(LOG_INFO_ENABLED) { + rpl_neighbor_print_list("Global repair (before)"); + } /* Re-initialize configuration from DIO */ init_dag_from_dio(dio); rpl_local_repair("Global repair"); @@ -325,9 +325,9 @@ rpl_dag_update_state(void) rpl_timers_schedule_leaving(); } -#if LOG_INFO_ENABLED - rpl_neighbor_print_list("Parent switch"); -#endif /* LOG_INFO_ENABLED */ + if(LOG_INFO_ENABLED) { + rpl_neighbor_print_list("Parent switch"); + } } } diff --git a/os/net/routing/rpl-lite/rpl-nbr-policy.c b/os/net/routing/rpl-lite/rpl-nbr-policy.c index f848ddb39..3db84f3a8 100644 --- a/os/net/routing/rpl-lite/rpl-nbr-policy.c +++ b/os/net/routing/rpl-lite/rpl-nbr-policy.c @@ -65,19 +65,7 @@ static int num_parents; /* all nodes that are possible parents */ static int num_free; static linkaddr_t *worst_rank_nbr_lladdr; /* lladdr of the the neighbor with the worst rank */ static rpl_rank_t worst_rank; -/*---------------------------------------------------------------------------*/ -#if LOG_DBG_ENABLED -/* Print out state periodically */ -static void update_state(void); -static struct ctimer periodic_timer; -static int timer_init = 0; -static void -handle_periodic_timer(void *ptr) -{ - update_state(); - ctimer_restart(&periodic_timer); -} -#endif /* LOG_DBG_ENABLED */ + /*---------------------------------------------------------------------------*/ static void update_state(void) @@ -87,14 +75,6 @@ update_state(void) rpl_rank_t nbr_rank; int num_used = 0; -#if LOG_DBG_ENABLED - if(!timer_init) { - timer_init = 1; - ctimer_set(&periodic_timer, 60 * CLOCK_SECOND, - &handle_periodic_timer, NULL); - } -#endif /* LOG_DBG_ENABLED */ - worst_rank = 0; worst_rank_nbr_lladdr = NULL; num_parents = 0; diff --git a/os/net/routing/rpl-lite/rpl-timers.c b/os/net/routing/rpl-lite/rpl-timers.c index 5da6edc67..9bb98ed60 100644 --- a/os/net/routing/rpl-lite/rpl-timers.c +++ b/os/net/routing/rpl-lite/rpl-timers.c @@ -514,9 +514,9 @@ handle_periodic_timer(void *ptr) the meaning of last_advertised_rank changes with time */ rpl_dag_update_state(); -#if LOG_INFO_ENABLED - rpl_neighbor_print_list("Periodic"); -#endif /* LOG_INFO_ENABLED */ + if(LOG_INFO_ENABLED) { + rpl_neighbor_print_list("Periodic"); + } ctimer_reset(&periodic_timer); } From 075d42ca24fa1b669ca54488392afe1313eea204 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sun, 25 Feb 2018 06:24:00 -0800 Subject: [PATCH 5/6] Document LOG_*_ENABLED macros --- os/sys/log.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/os/sys/log.h b/os/sys/log.h index 290ee212c..05ed3503e 100644 --- a/os/sys/log.h +++ b/os/sys/log.h @@ -165,7 +165,12 @@ extern struct log_module all_modules[]; #define LOG_INFO_6ADDR(...) LOG_6ADDR(LOG_LEVEL_INFO, __VA_ARGS__) #define LOG_DBG_6ADDR(...) LOG_6ADDR(LOG_LEVEL_DBG, __VA_ARGS__) -/* For testing log level */ +/* For checking log level. + As this builds on curr_log_level variables, this should not be used + in pre-processor macros. Use in a C 'if' statement instead, e.g.: + if(LOG_INFO_ENABLED) { ... } + Note that most compilers will still be able to strip the code out + for low enough log levels configurations. */ #define LOG_ERR_ENABLED ((LOG_LEVEL) >= LOG_LEVEL_ERR) #define LOG_WARN_ENABLED ((LOG_LEVEL) >= LOG_LEVEL_WARN) #define LOG_INFO_ENABLED ((LOG_LEVEL) >= LOG_LEVEL_INFO) From cab38d9ea86fcf00207f326760815a3e59e71b69 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 25 Feb 2018 23:01:03 +0000 Subject: [PATCH 6/6] Use the GPIO HAL for Zoul sensor drivers --- arch/platform/zoul/dev/ac-dimmer.c | 16 +++++++++------ arch/platform/zoul/dev/grove-gyro.c | 12 +++++++++--- arch/platform/zoul/dev/motion-sensor.c | 12 +++++++++--- arch/platform/zoul/dev/tsl256x.c | 11 +++++++++-- arch/platform/zoul/dev/weather-meter.c | 27 +++++++++++++++++++------- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/arch/platform/zoul/dev/ac-dimmer.c b/arch/platform/zoul/dev/ac-dimmer.c index 5c27c2ffc..e5bb9b1f4 100644 --- a/arch/platform/zoul/dev/ac-dimmer.c +++ b/arch/platform/zoul/dev/ac-dimmer.c @@ -40,6 +40,7 @@ #include "contiki.h" #include "ac-dimmer.h" #include "dev/gpio.h" +#include "dev/gpio-hal.h" #include "lib/sensors.h" #include "dev/ioc.h" /*---------------------------------------------------------------------------*/ @@ -76,13 +77,17 @@ PROCESS_THREAD(ac_dimmer_int_process, ev, data) } /*---------------------------------------------------------------------------*/ static void -dimmer_zero_cross_int_handler(uint8_t port, uint8_t pin) +dimmer_zero_cross_int_handler(gpio_hal_pin_mask_t pin_mask) { - if((port == DIMMER_SYNC_PORT) && (pin == DIMMER_SYNC_PIN)) { - process_poll(&ac_dimmer_int_process); - } + process_poll(&ac_dimmer_int_process); } /*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t dimmer_handler = { + .next = NULL, + .handler = dimmer_zero_cross_int_handler, + .pin_mask = gpio_hal_pin_to_mask(DIMMER_SYNC_PIN) << (DIMMER_SYNC_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ static int status(int type) { @@ -128,8 +133,7 @@ configure(int type, int value) GPIO_DETECT_EDGE(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); GPIO_TRIGGER_SINGLE_EDGE(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); GPIO_DETECT_RISING(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); - gpio_register_callback(dimmer_zero_cross_int_handler, DIMMER_SYNC_PORT, - DIMMER_SYNC_PIN); + gpio_hal_register_handler(&dimmer_handler); /* Spin process until an interrupt is received */ process_start(&ac_dimmer_int_process, NULL); diff --git a/arch/platform/zoul/dev/grove-gyro.c b/arch/platform/zoul/dev/grove-gyro.c index ce316a207..1ef9d6036 100644 --- a/arch/platform/zoul/dev/grove-gyro.c +++ b/arch/platform/zoul/dev/grove-gyro.c @@ -44,6 +44,7 @@ #include "contiki.h" #include "dev/i2c.h" #include "dev/grove-gyro.h" +#include "dev/gpio-hal.h" #include "lib/sensors.h" #include "dev/watchdog.h" /*---------------------------------------------------------------------------*/ @@ -458,11 +459,17 @@ PROCESS_THREAD(grove_gyro_int_process, ev, data) } /*---------------------------------------------------------------------------*/ static void -grove_gyro_interrupt_handler(uint8_t port, uint8_t pin) +grove_gyro_interrupt_handler(gpio_hal_pin_mask_t pin_mask) { process_poll(&grove_gyro_int_process); } /*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t gyro_handler = { + .next = NULL, + .handler = grove_gyro_interrupt_handler, + .pin_mask = gpio_hal_pin_to_mask(I2C_INT_PIN) << (I2C_INT_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ static int value(int type) { @@ -593,8 +600,7 @@ configure(int type, int value) GPIO_DETECT_EDGE(GROVE_GYRO_INT_PORT_BASE, GROVE_GYRO_INT_PIN_MASK); GPIO_TRIGGER_SINGLE_EDGE(GROVE_GYRO_INT_PORT_BASE, GROVE_GYRO_INT_PIN_MASK); GPIO_DETECT_FALLING(GROVE_GYRO_INT_PORT_BASE, GROVE_GYRO_INT_PIN_MASK); - gpio_register_callback(grove_gyro_interrupt_handler, I2C_INT_PORT, - I2C_INT_PIN); + gpio_hal_register_handler(&gyro_handler); /* Spin process until an interrupt is received */ process_start(&grove_gyro_int_process, NULL); diff --git a/arch/platform/zoul/dev/motion-sensor.c b/arch/platform/zoul/dev/motion-sensor.c index ce31c3c46..a44462d69 100644 --- a/arch/platform/zoul/dev/motion-sensor.c +++ b/arch/platform/zoul/dev/motion-sensor.c @@ -47,6 +47,7 @@ #include "lib/sensors.h" #include "dev/sys-ctrl.h" #include "dev/gpio.h" +#include "dev/gpio-hal.h" #include "dev/ioc.h" /*---------------------------------------------------------------------------*/ #define DEBUG 0 @@ -76,11 +77,17 @@ PROCESS_THREAD(motion_int_process, ev, data) } /*---------------------------------------------------------------------------*/ static void -motion_interrupt_handler(uint8_t port, uint8_t pin) +motion_interrupt_handler(gpio_hal_pin_mask_t pin_mask) { process_poll(&motion_int_process); } /*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t motion_handler = { + .next = NULL, + .handler = motion_interrupt_handler, + .pin_mask = gpio_hal_pin_to_mask(MOTION_SENSOR_PIN) << (MOTION_SENSOR_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ static int status(int type) { @@ -113,8 +120,7 @@ configure(int type, int value) GPIO_DETECT_RISING(MOTION_SENSOR_PORT_BASE, MOTION_SENSOR_PIN_MASK); GPIO_TRIGGER_SINGLE_EDGE(MOTION_SENSOR_PORT_BASE, MOTION_SENSOR_PIN_MASK); ioc_set_over(MOTION_SENSOR_PORT, MOTION_SENSOR_PIN, IOC_OVERRIDE_DIS); - gpio_register_callback(motion_interrupt_handler, MOTION_SENSOR_PORT, - MOTION_SENSOR_PIN); + gpio_hal_register_handler(&motion_handler); process_start(&motion_int_process, NULL); diff --git a/arch/platform/zoul/dev/tsl256x.c b/arch/platform/zoul/dev/tsl256x.c index 3f6870547..ffcf2e218 100644 --- a/arch/platform/zoul/dev/tsl256x.c +++ b/arch/platform/zoul/dev/tsl256x.c @@ -43,6 +43,7 @@ #include "contiki.h" #include "dev/i2c.h" #include "dev/gpio.h" +#include "dev/gpio-hal.h" #include "dev/zoul-sensors.h" #include "lib/sensors.h" #include "tsl256x.h" @@ -255,7 +256,7 @@ PROCESS_THREAD(tsl256x_int_process, ev, data) } /*---------------------------------------------------------------------------*/ static void -tsl256x_interrupt_handler(uint8_t port, uint8_t pin) +tsl256x_interrupt_handler(gpio_hal_pin_mask_t pin_mask) { /* There's no alert/interruption flag to check, clear the interruption by * writting to the CLEAR bit in the COMMAND register @@ -263,6 +264,12 @@ tsl256x_interrupt_handler(uint8_t port, uint8_t pin) process_poll(&tsl256x_int_process); } /*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t tsl256x_handler = { + .next = NULL, + .handler = tsl256x_interrupt_handler, + .pin_mask = gpio_hal_pin_to_mask(I2C_INT_PIN) << (I2C_INT_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ static int configure(int type, int value) { @@ -440,7 +447,7 @@ configure(int type, int value) GPIO_DETECT_EDGE(TSL256X_INT_PORT_BASE, TSL256X_INT_PIN_MASK); GPIO_TRIGGER_SINGLE_EDGE(TSL256X_INT_PORT_BASE, TSL256X_INT_PIN_MASK); GPIO_DETECT_FALLING(TSL256X_INT_PORT_BASE, TSL256X_INT_PIN_MASK); - gpio_register_callback(tsl256x_interrupt_handler, I2C_INT_PORT, I2C_INT_PIN); + gpio_hal_register_handler(&tsl256x_handler); /* Spin process until an interrupt is received */ process_start(&tsl256x_int_process, NULL); diff --git a/arch/platform/zoul/dev/weather-meter.c b/arch/platform/zoul/dev/weather-meter.c index 357c37d4b..cc78f9654 100644 --- a/arch/platform/zoul/dev/weather-meter.c +++ b/arch/platform/zoul/dev/weather-meter.c @@ -51,6 +51,7 @@ #include "lib/sensors.h" #include "dev/sys-ctrl.h" #include "dev/gpio.h" +#include "dev/gpio-hal.h" #include "dev/ioc.h" #include "sys/timer.h" #include "sys/ctimer.h" @@ -292,8 +293,22 @@ PROCESS_THREAD(weather_meter_int_process, ev, data) PROCESS_END(); } /*---------------------------------------------------------------------------*/ +static void weather_meter_interrupt_handler(gpio_hal_pin_mask_t pin_mask); +/*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t rain_handler = { + .next = NULL, + .handler = weather_meter_interrupt_handler, + .pin_mask = gpio_hal_pin_to_mask(RAIN_GAUGE_SENSOR_PIN) << (RAIN_GAUGE_SENSOR_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ +static gpio_hal_event_handler_t anemometer_handler = { + .next = NULL, + .handler = weather_meter_interrupt_handler, + .pin_mask = gpio_hal_pin_to_mask(ANEMOMETER_SENSOR_PIN) << (ANEMOMETER_SENSOR_PORT << 3), +}; +/*---------------------------------------------------------------------------*/ static void -weather_meter_interrupt_handler(uint8_t port, uint8_t pin) +weather_meter_interrupt_handler(gpio_hal_pin_mask_t pin_mask) { uint32_t aux; @@ -308,10 +323,10 @@ weather_meter_interrupt_handler(uint8_t port, uint8_t pin) * value */ - if((port == ANEMOMETER_SENSOR_PORT) && (pin == ANEMOMETER_SENSOR_PIN)) { + if(pin_mask == rain_handler.pin_mask) { weather_sensors.anemometer.ticks++; process_post(&weather_meter_int_process, anemometer_int_event, NULL); - } else if((port == RAIN_GAUGE_SENSOR_PORT) && (pin == RAIN_GAUGE_SENSOR_PIN)) { + } else if(pin_mask == anemometer_handler.pin_mask) { weather_sensors.rain_gauge.ticks++; aux = weather_sensors.rain_gauge.ticks * WEATHER_METER_AUX_RAIN_MM; aux /= 1000; @@ -427,8 +442,7 @@ configure(int type, int value) GPIO_TRIGGER_SINGLE_EDGE(ANEMOMETER_SENSOR_PORT_BASE, ANEMOMETER_SENSOR_PIN_MASK); ioc_set_over(ANEMOMETER_SENSOR_PORT, ANEMOMETER_SENSOR_PIN, IOC_OVERRIDE_DIS); - gpio_register_callback(weather_meter_interrupt_handler, ANEMOMETER_SENSOR_PORT, - ANEMOMETER_SENSOR_PIN); + gpio_hal_register_handler(&anemometer_handler); /* Configure rain gauge interruption */ GPIO_SOFTWARE_CONTROL(RAIN_GAUGE_SENSOR_PORT_BASE, RAIN_GAUGE_SENSOR_PIN_MASK); @@ -437,8 +451,7 @@ configure(int type, int value) GPIO_TRIGGER_SINGLE_EDGE(RAIN_GAUGE_SENSOR_PORT_BASE, RAIN_GAUGE_SENSOR_PIN_MASK); ioc_set_over(RAIN_GAUGE_SENSOR_PORT, RAIN_GAUGE_SENSOR_PIN, IOC_OVERRIDE_DIS); - gpio_register_callback(weather_meter_interrupt_handler, RAIN_GAUGE_SENSOR_PORT, - RAIN_GAUGE_SENSOR_PIN); + gpio_hal_register_handler(&rain_handler); process_start(&weather_meter_int_process, NULL);