Orefatoi
/
afero_poc15_171201
POC1.5 prototype 2 x color sensor 2 x LM75B 3 x AnalogIn 1 x accel
edge_utils/edge_mgr.cpp
- Committer:
- Rhyme
- Date:
- 2017-12-07
- Revision:
- 8:5590f55bdf41
- Parent:
- 7:aa858d789025
- Child:
- 9:f958fa2cdc74
File content as of revision 8:5590f55bdf41:
#include "mbed.h" #include "edge_mgr.h" #include "af_attributes.h" #include "edge_time.h" #include "edge_pin.h" #include "MMA8451Q.h" #include "VEML6040.h" #include "LM75B.h" #include "SMTC502AT.h" #include "PSE530.h" #include "SO1602A.h" #include "edge_sensor.h" #include "edge_accel.h" #include "edge_color.h" #include "edge_temp.h" #include "edge_pressure.h" #define MMA8451Q_I2C_ADDRESS 0x1C #define VEML6040_I2C_ADDRESS 0x10 #define LM75B_I2C_ADDRESS 0x48 #define SO1602A_I2C_ADDRESS 0x3C #define NUM_MAX_SENSOR 5 edge_sensor *sensor[NUM_MAX_SENSOR] ; int num_sensor = 0 ; int sensor_index = 0 ; edge_accel *accel = 0 ; edge_color *color[2] = {0, 0} ; edge_temp *temp = 0 ; edge_pressure *pressure = 0 ; PwmOut *led[3] = {0, 0, 0} ; uint16_t pwm[3] = { 0x5FA2, 0xB09B, 0x83DF } ; I2C *edge_i2c0 = 0 ; I2C *edge_i2c1 = 0 ; SO1602A *display = 0 ; /* OLED display on I2C */ MMA8451Q *mma8451q = 0 ; VEML6040 *veml6040[2] = { 0, 0 } ; LM75B *lm75b0 = 0 ; /* for temp1 */ AnalogIn *an0 = 0 ; /* for temp2 */ SMTC502AT *smtc502at0 = 0 ; AnalogIn *an1 = 0 ; /* for temp3 */ SMTC502AT *smtc502at1 = 0 ; LM75B *lm75b1 = 0 ; /* for temp4 */ AnalogIn *an2 = 0 ; /* for gas pressure */ PSE530 *pse530 = 0 ; static int loop_interval = 1000 ; static int accel_interval = 10 ; int first_loop = 1 ; int init_edge_attribute(void) { static int sensor_index = 0 ; if (first_loop) { enable_sensors() ; first_loop = 0 ; printf("Sensor loop started!\n") ; if (display) { display->clearDisplay() ; display->locate(0, 0) ; display->putStr("Sensor Loop") ; display->locate(2, 1) ; display->putStr("Started!") ; } } switch(sensor_index) { case 0: /* accel */ if (sensor[sensor_index]) { afero->setAttributeBool(ATTR_ACCEL_PRESENT, true) ; afero->setAttributeBool(ATTR_ACCEL_ENABLE, true) ; } else { afero->setAttributeBool(ATTR_ACCEL_PRESENT, false) ; } break ; case 1: /* color0 */ if (sensor[sensor_index]) { afero->setAttributeBool(ATTR_COLOR0_PRESENT, true) ; afero->setAttributeBool(ATTR_COLOR0_ENABLE, true) ; // afero->setAttribute32(ATTR_COLOR0_PWM_R, color0_pwm[0]) ; // afero->setAttribute32(ATTR_COLOR0_PWM_G, color0_pwm[1]) ; // afero->setAttribute32(ATTR_COLOR0_PWM_B, color0_pwm[2]) ; afero->getAttribute(ATTR_COLOR0_PWM_R) ; afero->getAttribute(ATTR_COLOR0_PWM_G) ; afero->getAttribute(ATTR_COLOR0_PWM_B) ; } else { afero->setAttributeBool(ATTR_COLOR0_PRESENT, false) ; } break ; case 2: /* color1 */ if (sensor[sensor_index]) { afero->setAttributeBool(ATTR_COLOR1_PRESENT, true) ; afero->setAttributeBool(ATTR_COLOR1_ENABLE, true) ; // afero->setAttribute32(ATTR_COLOR1_PWM_R, color1_pwm[0]) ; // afero->setAttribute32(ATTR_COLOR1_PWM_G, color1_pwm[1]) ; // afero->setAttribute32(ATTR_COLOR1_PWM_B, color1_pwm[2]) ; afero->getAttribute(ATTR_COLOR1_PWM_R) ; afero->getAttribute(ATTR_COLOR1_PWM_G) ; afero->getAttribute(ATTR_COLOR1_PWM_B) ; } else { afero->setAttributeBool(ATTR_COLOR1_PRESENT, false) ; } break ; case 3: /* temp */ if (lm75b0) { afero->setAttributeBool(ATTR_TEMP0_PRESENT, true) ; afero->setAttributeBool(ATTR_TEMP0_ENABLE, true) ; } else { afero->setAttributeBool(ATTR_TEMP0_PRESENT, false) ; } afero->setAttributeBool(ATTR_TEMP1_PRESENT, true) ; afero->setAttributeBool(ATTR_TEMP2_PRESENT, true) ; if (lm75b1) { afero->setAttributeBool(ATTR_TEMP3_PRESENT, true) ; afero->setAttributeBool(ATTR_TEMP3_ENABLE, true) ; } else { afero->setAttributeBool(ATTR_TEMP3_PRESENT, false) ; } break ; case 4: /* pressure */ if (sensor[sensor_index]) { afero->setAttributeBool(ATTR_GAS_PRESENT, true) ; afero->setAttributeBool(ATTR_GAS_ENABLE, true) ; } else { afero->setAttributeBool(ATTR_GAS_PRESENT, false) ; } break ; default: break ; } sensor_index++ ; return(sensor_index < NUM_MAX_SENSOR) ; } void edge_loop(uint32_t count_robin) { if ((count_robin % accel_interval) == 0) { if (accel) { accel->accum() ; /* get and accum accel data */ } } if ((count_robin % loop_interval) == 0) { loop_interval = 1 ; if ((sensor[sensor_index])&&(sensor[sensor_index]->isEnabled())) { sensor[sensor_index]->runStateMachine() ; } sensor_index = (sensor_index + 1) % NUM_MAX_SENSOR ; } } int is_present(I2C *i2c, int address) { char t[1] = { 0 } ; char data[2] = { 0, 0 } ; int result ; address <<= 1 ; result = i2c->write(address, t, 1, true) ; if (result == 0) { result = i2c->read(address, data, 2) ; } return((result == 0)) ; } void init_sensors(void) { #if 0 I2C *edge_i2c0 = 0 ; I2C *edge_i2c1 = 0 ; MMA8451Q *mma8451q = 0 ; VEML6040 *veml6040[2] = { 0, 0 } ; LM75B *lm75b0 = 0 ; /* for temp1 */ AnalogIn *an0 = 0 ; /* for temp2 */ SMTC502AT *smtc502at0 = 0 ; AnalogIn *an1 = 0 ; /* for temp3 */ SMTC502AT *smtc502at1 = 0 ; LM75B *lm75b1 = 0 ; /* for temp4 */ AnalogIn *an2 = 0 ; /* for gas pressure */ PSE530 *pse530 = 0 ; #endif printf("=== Initializing Sensor(s) ===\n") ; edge_i2c0 = new I2C(PIN_I2C0_SDA, PIN_I2C0_SCL) ; edge_i2c1 = new I2C(PIN_I2C1_SDA, PIN_I2C1_SCL) ; if (is_present(edge_i2c0, SO1602A_I2C_ADDRESS)) { printf("SO1602A on I2C0 is present\n") ; display = new SO1602A(edge_i2c0, SO1602A_I2C_ADDRESS) ; } else if (is_present(edge_i2c1, SO1602A_I2C_ADDRESS)) { printf("SO1602A on I2C1 is present\n") ; display = new SO1602A(edge_i2c1, SO1602A_I2C_ADDRESS) ; } else { printf("SO1602A is absent\n") ; } if (display) { display->clearDisplay() ; display->locate(3, 0) ; display->putStr("Suntory") ; display->locate(0, 1) ; display->putStr("Server Monitor") ; } if (is_present(edge_i2c1, MMA8451Q_I2C_ADDRESS)) { printf("MMA8451Q on I2C1 is present\n") ; mma8451q = new MMA8451Q(edge_i2c1, MMA8451Q_I2C_ADDRESS) ; accel = new edge_accel(mma8451q) ; sensor[0] = accel ; num_sensor++ ; } else { sensor[0] = 0 ; printf("MMA8451Q is absent\n") ; } if (is_present(edge_i2c1, VEML6040_I2C_ADDRESS)) { printf("VEML6040 on I2C1 is present\n") ; veml6040[0] = new VEML6040(edge_i2c1, VEML6040_I2C_ADDRESS) ; led[0] = new PwmOut(PIN_LED_R) ; led[1] = new PwmOut(PIN_LED_G) ; led[2] = new PwmOut(PIN_LED_B) ; color[0] = new edge_color(veml6040[0], led, pwm) ; sensor[1] = color[0] ; num_sensor++ ; } else { sensor[1] = 0 ; printf("VEML6040 on I2C1 is absent\n") ; } if (is_present(edge_i2c0, VEML6040_I2C_ADDRESS)) { printf("VEML6040 on I2C0 is present\n") ; veml6040[1] = new VEML6040(edge_i2c0, VEML6040_I2C_ADDRESS) ; if (led[0] == 0) { led[0] = new PwmOut(PIN_LED_R) ; led[1] = new PwmOut(PIN_LED_G) ; led[2] = new PwmOut(PIN_LED_B) ; } color[1] = new edge_color(veml6040[1], led, pwm) ; sensor[2] = color[1] ; num_sensor++ ; } else { sensor[2] = 0 ; printf("VEML6040 on I2C0 is absent\n") ; } if (is_present(edge_i2c1, LM75B_I2C_ADDRESS)) { printf("LM75B on I2C1 is present\n") ; lm75b0 = new LM75B(edge_i2c1, LM75B_I2C_ADDRESS) ; } else { printf("LM75B on I2C1 is absent\n") ; } #if 0 if (is_present(edge_i2c0, LM75B_I2C_ADDRESS)) { printf("LM75B on I2C0 is present\n") ; lm75b1 = new LM75B(edge_i2c0, LM75B_I2C_ADDRESS) ; } else { printf("LM75B on I2C0 is absent\n") ; } #endif an0 = new AnalogIn(PIN_AN0) ; smtc502at0 = new SMTC502AT(an0) ; an1 = new AnalogIn(PIN_AN1) ; smtc502at1 = new SMTC502AT(an1) ; temp = new edge_temp(lm75b0, smtc502at0, smtc502at1, lm75b1) ; sensor[3] = temp ; num_sensor++ ; an2 = new AnalogIn(PIN_AN2) ; pse530 = new PSE530(an2) ; pressure = new edge_pressure(pse530) ; sensor[4] = pressure ; num_sensor++ ; #if 0 if (color[0]) { color[0]->calibrate(target, color0_pwm, 10) ; } if (color[1]) { color[1]->calibrate(target, color1_pwm, 10) ; } #endif if (num_sensor > 0) { printf("%d edge_sensor(s) registered\n", num_sensor) ; printf("Edge is waiting for ASR to link\n") ; if (display) { display->clearDisplay() ; display->locate(0, 0) ; display->putStr("Waiting for") ; display->locate(0, 1) ; display->putStr("ASR to Link") ; } } } void enable_sensors(void) { int i ; for (i = 0 ; i < NUM_MAX_SENSOR ; i++ ) { if (sensor[i]) { sensor[i]->enable() ; } } }