41 #include "sys/clock.h" 53 #define PRINTF(...) printf(__VA_ARGS__) 66 uint8_t sensors_ports;
70 static adc_wrapper_t sensors;
73 convert_to_value(uint8_t index)
76 value = adc_zoul.value(sensors.sensor[index].pin_mask);
78 if(value == ZOUL_SENSORS_ERROR) {
79 PRINTF(
"ADC sensors: failed retrieving data\n");
80 return ADC_WRAPPER_ERROR;
88 if(!sensors.sensor[index].vdd3) {
89 value *= ADC_WRAPPER_EXTERNAL_VREF;
90 value /= ADC_WRAPPER_EXTERNAL_VREF_CROSSVAL;
93 switch(sensors.sensor[index].type) {
94 case ANALOG_GROVE_LIGHT:
96 value = (10230 - (value * 10)) / value;
98 return (uint16_t)value;
100 case ANALOG_GROVE_LOUDNESS:
102 return (uint16_t)value;
104 case ANALOG_PHIDGET_ROTATION_1109:
108 return (uint16_t)value;
111 case ANALOG_VAC_SENSOR:
115 return (uint16_t)value;
117 case ANALOG_AAC_SENSOR:
119 return (uint16_t)value;
122 return ADC_WRAPPER_ERROR;
125 return ADC_WRAPPER_ERROR;
129 is_sensor_in_list(
int type)
133 for(i = 0; i <= sensors.sensors_num; i++) {
134 if(sensors.sensor[i].type == type) {
145 uint16_t sensor_value;
147 index = is_sensor_in_list(type);
150 PRINTF(
"ADC sensors: sensor not registered\n");
151 return ADC_WRAPPER_SUCCESS;
156 sensor_value = convert_to_value(index);
162 configure(
int type,
int value)
166 if((type != ANALOG_GROVE_LIGHT) && (type != ANALOG_PHIDGET_ROTATION_1109) &&
167 (type != ANALOG_GROVE_LOUDNESS) && (type != ANALOG_VAC_SENSOR) &&
168 (type != ANALOG_AAC_SENSOR) ) {
169 PRINTF(
"ADC sensors: sensor not supported, check adc_wrapper.h header\n");
170 return ADC_WRAPPER_ERROR;
174 PRINTF(
"ADC sensors: all adc channels available have been assigned\n");
175 return ADC_WRAPPER_ERROR;
178 if((value < 0x01) || (value > 0x07) || ((value == BUTTON_USER_PIN) && (
ADC_SENSORS_ADC6_PIN < 0))) {
179 PRINTF(
"ADC sensors: invalid pin value, (PA0-PA1, PA3) are reserved\n");
180 return ADC_WRAPPER_ERROR;
183 if(sensors.sensors_ports & pin_mask) {
184 PRINTF(
"ADC sensors: a sensor has been already assigned to this pin\n");
185 return ADC_WRAPPER_ERROR;
190 case ANALOG_GROVE_LIGHT:
191 case ANALOG_GROVE_LOUDNESS:
192 case ANALOG_PHIDGET_ROTATION_1109:
193 if(adc_zoul.configure(SENSORS_HW_INIT, pin_mask) == ZOUL_SENSORS_ERROR) {
194 return ADC_WRAPPER_ERROR;
196 sensors.sensor[sensors.sensors_num].type = type;
197 sensors.sensor[sensors.sensors_num].pin_mask = pin_mask;
198 sensors.sensor[sensors.sensors_num].vdd3 = 1;
202 case ANALOG_VAC_SENSOR:
203 case ANALOG_AAC_SENSOR:
204 if(adc_zoul.configure(SENSORS_HW_INIT, pin_mask) == ZOUL_SENSORS_ERROR) {
205 return ADC_WRAPPER_ERROR;
207 sensors.sensor[sensors.sensors_num].type = type;
208 sensors.sensor[sensors.sensors_num].pin_mask = pin_mask;
209 sensors.sensor[sensors.sensors_num].vdd3 = 0;
214 return ADC_WRAPPER_ERROR;
217 PRINTF(
"ADC sensors: type %u mask 0x%02X vdd3 %u\n",
218 sensors.sensor[sensors.sensors_num].type,
219 sensors.sensor[sensors.sensors_num].pin_mask,
220 sensors.sensor[sensors.sensors_num].vdd3);
222 sensors.sensors_num++;
223 sensors.sensors_ports |= pin_mask;
225 return ADC_WRAPPER_SUCCESS;
228 SENSORS_SENSOR(adc_sensors, ADC_SENSORS, value, configure, NULL);
#define ADC_SENSORS_ADC6_PIN
ADC6 not declared.
Header file with register and macro declarations for the cc2538 GPIO module.
Header file for the Zoul ADC sensors API.
Header file with declarations for the I/O Control module.
Header file for the cc2538 ADC driver.
Implementation of a generic module controlling Zoul sensors.
#define GPIO_PIN_MASK(PIN)
Converts a pin number to a pin mask.
#define ADC_SENSORS_MAX
Maximum sensors.
Header file for the Zoul ADC interface.