From 84d969ce85c7780eb227500d3a0bf254c659f9aa Mon Sep 17 00:00:00 2001 From: joxe Date: Thu, 14 Jan 2010 13:29:56 +0000 Subject: [PATCH] simplified the sensors API - will break some platforms... --- core/lib/sensors.c | 85 +++++++--------------------------------------- core/lib/sensors.h | 35 +++++++------------ 2 files changed, 24 insertions(+), 96 deletions(-) diff --git a/core/lib/sensors.c b/core/lib/sensors.c index fcb9a150b..b3240eb53 100644 --- a/core/lib/sensors.c +++ b/core/lib/sensors.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Swedish Institute of Computer Science + * Copyright (c) 2009, Swedish Institute of Computer Science * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * @(#)$Id: sensors.c,v 1.2 2006/10/06 09:18:52 adamdunkels Exp $ + * @(#)$Id: sensors.c,v 1.3 2010/01/14 13:29:56 joxe Exp $ */ /* exeperimental code, will be renamed to sensors.c when done */ @@ -64,33 +64,6 @@ get_sensor_index(const struct sensors_sensor *s) return i; } /*---------------------------------------------------------------------------*/ -void -sensors_add_irq(const struct sensors_sensor *s, unsigned char irq) -{ - sensors_flags[get_sensor_index(s)] |= irq; -} -/*---------------------------------------------------------------------------*/ -void -sensors_remove_irq(const struct sensors_sensor *s, unsigned char irq) -{ - sensors_flags[get_sensor_index(s)] &= ~irq; -} -/*---------------------------------------------------------------------------*/ -int -sensors_handle_irq(unsigned char irq_flag) -{ - int i, w; - - w = 0; - for(i = 0; i < num_sensors; ++i) { - if(sensors_flags[i] & irq_flag) { - w += sensors[i]->irq(); - } - } - - return w; -} -/*---------------------------------------------------------------------------*/ struct sensors_sensor * sensors_first(void) { @@ -115,11 +88,11 @@ sensors_find(char *prefix) { int i; unsigned short len; - + /* Search through all processes and search for the specified process name. */ len = strlen(prefix); - + for(i = 0; i < num_sensors; ++i) { if(strncmp(prefix, sensors[i]->type, len) == 0) { return sensors[i]; @@ -128,51 +101,22 @@ sensors_find(char *prefix) return NULL; } /*---------------------------------------------------------------------------*/ -#define SELCOLL ((struct process *)0x1) - -void -sensors_select(const struct sensors_sensor *s, struct process *p) -{ - int i = get_sensor_index(s); - - if(sensors_selecting_proc[i] == NULL) { - sensors_selecting_proc[i] = p; - } else if(sensors_selecting_proc[i] == p) { - /* If the selecting process is already registered we do nothing */ - } else { - /* Collision, revert to broadcast! */ - sensors_selecting_proc[i] = SELCOLL; - } -} -/*---------------------------------------------------------------------------*/ -void -sensors_unselect(const struct sensors_sensor *s, const struct process *p) -{ - int i = get_sensor_index(s); - - if(sensors_selecting_proc[i] == p) { - sensors_selecting_proc[i] = NULL; - } else { - /* We collided and must continue to use broadcast! */ - } -} -/*---------------------------------------------------------------------------*/ PROCESS_THREAD(sensors_process, ev, data) { static int i; static int events; PROCESS_BEGIN(); - - for(i = 0; sensors[i] != NULL; ++i) { - sensors_flags[i] = 0; - sensors[i]->init(); - } - num_sensors = i; - + + sensors_platform_init(); + sensors_event = process_alloc_event(); - irq_init(); + for(i = 0; sensors[i] != NULL; ++i) { + sensors_flags[i] = 0; + sensors[i]->configure(SENSORS_HW_INIT, 0); + } + num_sensors = i; while(1) { @@ -182,11 +126,6 @@ PROCESS_THREAD(sensors_process, ev, data) events = 0; for(i = 0; i < num_sensors; ++i) { if(sensors_flags[i] & FLAG_CHANGED) { - /* if(sensors_selecting_proc[i] == SELCOLL - || sensors_selecting_proc[i] == NULL) - process_post(PROCESS_BROADCAST, sensors_event, sensors[i]); - else - process_post(sensors_selecting_proc[i], sensors_event, sensors[i]);*/ if(process_post(PROCESS_BROADCAST, sensors_event, sensors[i]) == PROCESS_ERR_OK) { PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event); } diff --git a/core/lib/sensors.h b/core/lib/sensors.h index 644662cd8..a3714d24e 100644 --- a/core/lib/sensors.h +++ b/core/lib/sensors.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Swedish Institute of Computer Science + * Copyright (c) 2009, Swedish Institute of Computer Science * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * @(#)$Id: sensors.h,v 1.2 2007/11/17 18:05:56 adamdunkels Exp $ + * @(#)$Id: sensors.h,v 1.3 2010/01/14 13:29:56 joxe Exp $ */ #ifndef __SENSORS_H__ @@ -36,11 +36,16 @@ #include "contiki.h" -#define SENSORS_SENSOR(name, type, init, irq, activate, deactivate, \ - active, value, configure, status) \ -const struct sensors_sensor name = { type , \ - init, irq, activate, deactivate, \ - active, value, configure, status } +/* some constants for the configure API */ +#define SENSORS_HW_INIT 128 /* internal - used only for initialization */ +#define SENSORS_ACTIVE 129 /* ACTIVE => 0 -> turn off, 1 -> turn on */ +#define SENSORS_READY 130 /* read only */ + +#define SENSORS_ACTIVATE(sensor) sensor.configure(SENSORS_ACTIVE, (void*)1) +#define SENSORS_DEACTIVATE(sensor) sensor.configure(SENSORS_ACTIVE, (void*)0) + +#define SENSORS_SENSOR(name, type, value, configure, status) \ +const struct sensors_sensor name = { type, value, configure, status } #define SENSORS_NUM (sizeof(sensors) / sizeof(struct sensors_sensor *)) @@ -51,11 +56,6 @@ struct process *sensors_selecting_proc[SENSORS_NUM] struct sensors_sensor { char * type; - void (* init) (void); - int (* irq) (void); - void (* activate) (void); - void (* deactivate)(void); - int (* active) (void); unsigned int (* value) (int type); int (* configure) (int type, void *parameters); void * (* status) (int type); @@ -67,19 +67,8 @@ struct sensors_sensor *sensors_first(void); void sensors_changed(const struct sensors_sensor *s); - -void sensors_add_irq(const struct sensors_sensor *s, unsigned char irq); -void sensors_remove_irq(const struct sensors_sensor *s, unsigned char irq); - -int sensors_handle_irq(unsigned char irq_flag); - -void sensors_select(const struct sensors_sensor *s, struct process *p); -void sensors_unselect(const struct sensors_sensor *s, const struct process *p); - extern process_event_t sensors_event; PROCESS_NAME(sensors_process); -void irq_init(void); - #endif /* __SENSORS_H__ */