53#define PRINTF(...) printf(__VA_ARGS__)
66 uint8_t sensors_ports;
70static adc_wrapper_t sensors;
73convert_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;
129is_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);
162configure(
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;
228SENSORS_SENSOR(adc_sensors, ADC_SENSORS, value, configure, NULL);
Header file for the Zoul ADC sensors API.
Header file for the Zoul ADC interface.
Header file for the cc2538 ADC driver.
Header file with register and macro declarations for the cc2538 GPIO module.
#define GPIO_PIN_MASK(PIN)
Converts a pin number to a pin mask.
#define ADC_SENSORS_MAX
Maximum sensors
#define ADC_SENSORS_ADC6_PIN
ADC6 not declared
Header file with declarations for the I/O Control module.
Implementation of a generic module controlling Zoul sensors.