36 #include "lib/sensors.h" 37 #include "light-sensor.h" 38 #include <AppHardwareApi.h> 39 #include <AlsDriver.h> 48 #define PRINTF(...) printf(__VA_ARGS__) 54 LIGHT_SENSOR_STATUS_NOT_INIT = 0,
55 LIGHT_SENSOR_STATUS_INIT,
56 LIGHT_SENSOR_STATUS_NOT_ACTIVE = LIGHT_SENSOR_STATUS_INIT,
57 LIGHT_SENSOR_STATUS_ACTIVE
58 } light_sensor_status_t;
61 #define DELTA_LIGHT_SENSOR_VALUE 1 66 const struct sensors_sensor light_sensor;
67 volatile static light_sensor_status_t light_sensor_status = LIGHT_SENSOR_STATUS_NOT_INIT;
68 static int prev_light_event_val = 0;
69 static int light_sensor_value = 0;
74 static int adjust(
int input1,
int input2);
75 PROCESS(LightSensorSampling,
"Light sensor");
81 configure(
int type,
int value)
83 if(type == SENSORS_HW_INIT) {
84 PRINTF(
"SENSORS_HW_INIT\n");
85 light_sensor_status = LIGHT_SENSOR_STATUS_INIT;
88 }
else if(type == SENSORS_ACTIVE) {
89 if(light_sensor_status != LIGHT_SENSOR_STATUS_NOT_INIT) {
93 prev_light_event_val = 0;
95 PRINTF(
"LIGHT SENSOR ACTIVATED\n");
96 light_sensor_status = LIGHT_SENSOR_STATUS_ACTIVE;
97 process_post(&LightSensorSampling, PROCESS_EVENT_MSG, (
void *)&light_sensor_status);
101 PRINTF(
"LIGHT SENSOR DE-ACTIVATED\n");
102 light_sensor_status = LIGHT_SENSOR_STATUS_NOT_ACTIVE;
103 process_post(&LightSensorSampling, PROCESS_EVENT_MSG, (
void *)&light_sensor_status);
108 PRINTF(
"ERROR: NO HW_INIT LIGHT SENSOR\n");
120 if(type == SENSORS_ACTIVE) {
121 return light_sensor_status == LIGHT_SENSOR_STATUS_ACTIVE;
122 }
else if(type == SENSORS_READY) {
123 return light_sensor_status != LIGHT_SENSOR_STATUS_NOT_INIT;
132 return light_sensor_value;
145 int channel0_value, channel1_value;
150 if(ev == PROCESS_EVENT_TIMER) {
152 PRINTF(
"Light sensor sample\n");
153 vALSstartReadChannel(0);
154 channel0_value = u16ALSreadChannelResult();
155 PRINTF(
"Channel 0 = %d\n", channel0_value);
156 vALSstartReadChannel(1);
157 channel1_value = u16ALSreadChannelResult();
158 PRINTF(
"Channel 1 = %d\n", channel1_value);
159 light_sensor_value = adjust(channel0_value, channel1_value);
160 PRINTF(
"Light output = %d\n", light_sensor_value);
161 if(abs(light_sensor_value - prev_light_event_val) > DELTA_LIGHT_SENSOR_VALUE) {
162 prev_light_event_val = light_sensor_value;
163 sensors_changed(&light_sensor);
168 if(*(
int *)data == LIGHT_SENSOR_STATUS_NOT_ACTIVE) {
171 }
else if((*(
int *)data == LIGHT_SENSOR_STATUS_ACTIVE)) {
182 SENSORS_SENSOR(light_sensor, LIGHT_SENSOR, value, configure, status);
191 adjust(
int ch0,
int ch1)
194 return (39 * (ch0 - ch1)) / 100;
#define PROCESS(name, strname)
Declare a process.
void etimer_stop(struct etimer *et)
Stop a pending event timer.
void etimer_restart(struct etimer *et)
Restart an event timer from the current point in time.
#define PROCESS_BEGIN()
Define the beginning of a process.
#define PROCESS_END()
Define the end of a process.
#define PROCESS_WAIT_EVENT_UNTIL(c)
Wait for an event to be posted to the process, with an extra condition.
#define CLOCK_SECOND
A second, measured in system clock time.
int process_post(struct process *p, process_event_t ev, process_data_t data)
Post an asynchronous event.
PROCESS_THREAD(cc2538_rf_process, ev, data)
Implementation of the cc2538 RF driver process.
void etimer_reset(struct etimer *et)
Reset an event timer with the same interval as was previously set.
void etimer_set(struct etimer *et, clock_time_t interval)
Set an event timer.
void process_start(struct process *p, process_data_t data)
Start a process.