simplified the sensors API - will break some platforms...

This commit is contained in:
joxe 2010-01-14 13:29:56 +00:00
parent 684c91d0fd
commit 84d969ce85
2 changed files with 24 additions and 96 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, Swedish Institute of Computer Science * Copyright (c) 2009, Swedish Institute of Computer Science
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * 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 */ /* exeperimental code, will be renamed to sensors.c when done */
@ -64,33 +64,6 @@ get_sensor_index(const struct sensors_sensor *s)
return i; 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 * struct sensors_sensor *
sensors_first(void) sensors_first(void)
{ {
@ -128,35 +101,6 @@ sensors_find(char *prefix)
return NULL; 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) PROCESS_THREAD(sensors_process, ev, data)
{ {
static int i; static int i;
@ -164,15 +108,15 @@ PROCESS_THREAD(sensors_process, ev, data)
PROCESS_BEGIN(); PROCESS_BEGIN();
for(i = 0; sensors[i] != NULL; ++i) { sensors_platform_init();
sensors_flags[i] = 0;
sensors[i]->init();
}
num_sensors = i;
sensors_event = process_alloc_event(); 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) { while(1) {
@ -182,11 +126,6 @@ PROCESS_THREAD(sensors_process, ev, data)
events = 0; events = 0;
for(i = 0; i < num_sensors; ++i) { for(i = 0; i < num_sensors; ++i) {
if(sensors_flags[i] & FLAG_CHANGED) { 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) { if(process_post(PROCESS_BROADCAST, sensors_event, sensors[i]) == PROCESS_ERR_OK) {
PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event); PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, Swedish Institute of Computer Science * Copyright (c) 2009, Swedish Institute of Computer Science
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * 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__ #ifndef __SENSORS_H__
@ -36,11 +36,16 @@
#include "contiki.h" #include "contiki.h"
#define SENSORS_SENSOR(name, type, init, irq, activate, deactivate, \ /* some constants for the configure API */
active, value, configure, status) \ #define SENSORS_HW_INIT 128 /* internal - used only for initialization */
const struct sensors_sensor name = { type , \ #define SENSORS_ACTIVE 129 /* ACTIVE => 0 -> turn off, 1 -> turn on */
init, irq, activate, deactivate, \ #define SENSORS_READY 130 /* read only */
active, value, configure, status }
#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 *)) #define SENSORS_NUM (sizeof(sensors) / sizeof(struct sensors_sensor *))
@ -51,11 +56,6 @@ struct process *sensors_selecting_proc[SENSORS_NUM]
struct sensors_sensor { struct sensors_sensor {
char * type; char * type;
void (* init) (void);
int (* irq) (void);
void (* activate) (void);
void (* deactivate)(void);
int (* active) (void);
unsigned int (* value) (int type); unsigned int (* value) (int type);
int (* configure) (int type, void *parameters); int (* configure) (int type, void *parameters);
void * (* status) (int type); void * (* status) (int type);
@ -67,19 +67,8 @@ struct sensors_sensor *sensors_first(void);
void sensors_changed(const struct sensors_sensor *s); 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; extern process_event_t sensors_event;
PROCESS_NAME(sensors_process); PROCESS_NAME(sensors_process);
void irq_init(void);
#endif /* __SENSORS_H__ */ #endif /* __SENSORS_H__ */