simplified the sensors API - will break some platforms...
This commit is contained in:
parent
684c91d0fd
commit
84d969ce85
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user