Yosensi / CDM7160
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CDM7160.cpp Source File

CDM7160.cpp

00001 /**
00002  * Project:      CDM7160
00003  * Company:      yosensi.io
00004  * CodeWriter:   Michal Kozlowski
00005  * File:         CDM7160.cpp
00006  * Date:         09-09-2019
00007  * Description:  CDM7160 Driver Operation File
00008  */
00009 
00010 #include "mbed.h"
00011 #include "CDM7160.h"
00012 
00013 
00014 CDM7160::CDM7160(PinName sda, PinName scl, uint8_t addr) : pI2C(new I2C(sda, scl)), 
00015                                                        _I2C(*pI2C)
00016 {
00017     cdm7160.addr = addr << 1;
00018     cdm7160.co2 = 0;
00019 }
00020 
00021 CDM7160::CDM7160(I2C &oI2C, uint8_t addr) : pI2C(NULL),
00022                                         _I2C(oI2C) 
00023 {
00024     cdm7160.addr = (addr << 1);
00025     cdm7160.co2 = 0;
00026 }
00027 
00028 CDM7160::~CDM7160()
00029 {
00030     if (NULL != pI2C) delete  pI2C;
00031 }
00032 
00033 /**
00034  * ==================== PUBLIC FUNCTIONS ====================
00035  */
00036 
00037 int8_t CDM7160::init(){
00038 
00039     for(uint8_t i=0 ; i<3 ; i++){
00040         if(control() == CDM7160_SUCCESS)
00041             return CDM7160_I2C_ADDR;
00042         wait_ms(20);
00043     }
00044     return CDM7160_ERROR;     
00045 }
00046 
00047 int8_t CDM7160::initIntegrated( uint16_t hpa, uint16_t height, 
00048                                 eControlMode mode, 
00049                                 eFunctionSetting atm_alt_correct,
00050                                 eFunctionSetting pwm_conce,
00051                                 eFunctionSetting pwm_pin){
00052     for(uint8_t i=0 ; i<3 ; i++){
00053         if(control(mode) == CDM7160_SUCCESS){
00054             if(setSettings(atm_alt_correct, pwm_conce, pwm_pin) == CDM7160_SUCCESS){
00055                 if(setAirPressureAndAltitude(hpa, height) == CDM7160_SUCCESS){
00056                     return CDM7160_I2C_ADDR;
00057                 }
00058 
00059             }
00060         }
00061         wait_ms(20);
00062     }
00063 
00064     return CDM7160_ERROR;   
00065 }
00066 
00067 int8_t CDM7160::softReset(){
00068     char data[1] = {0x01};
00069     if(write(RST, data, 1) == CDM7160_SUCCESS){
00070         wait(1);
00071         return CDM7160_SUCCESS;
00072     }
00073     return CDM7160_ERROR;
00074 }
00075 
00076 int8_t CDM7160::control(eControlMode mode){
00077     char data[1];
00078     data[0] = mode;
00079     if(write(CTL, data, 1) == CDM7160_SUCCESS){
00080         wait_ms(1);
00081         if(read(data,1) == CDM7160_SUCCESS){
00082             cdm7160.control = data[0];
00083             return CDM7160_SUCCESS;
00084         }
00085     }
00086     return CDM7160_ERROR;
00087 }
00088 
00089 int CDM7160::getCO2(){
00090     char data[2];
00091     uint8_t buff[2];
00092 
00093     if(write(DAL) == CDM7160_SUCCESS){
00094         if(read(data,2) == CDM7160_SUCCESS){
00095             for(int i=0; i<2; i++){buff[i] = data[i];}
00096                 cdm7160.co2 = (int16_t)data[1]<<8 | data[0];
00097                 return cdm7160.co2;
00098         }
00099     }
00100     return CDM7160_ERROR;
00101 }
00102 
00103 int8_t CDM7160::getStatus(){
00104     char data[1];
00105 
00106     if(write(ST1) == CDM7160_SUCCESS){
00107         if(read(data,1) == CDM7160_SUCCESS){
00108             cdm7160.status = data[0];
00109             return CDM7160_SUCCESS;
00110         }
00111     }
00112 
00113     return CDM7160_ERROR;
00114 }
00115 
00116 int8_t CDM7160::getAlarmLimits(){
00117     char data[2];
00118     if(write(ALHI) == CDM7160_SUCCESS){
00119         if(read(data, 2) == CDM7160_SUCCESS){
00120             cdm7160.highAlertLimit = data[0]*10;
00121             cdm7160.lowAlertLimit = data[1]*10;
00122             return CDM7160_SUCCESS;
00123         }
00124     }
00125     return CDM7160_ERROR;
00126 }
00127 
00128 int8_t CDM7160::setAlarmLimits(uint16_t high_limit, uint16_t low_limit){
00129     char data[1];
00130     data[0] = high_limit/10;
00131     if(write(ALHI, data, 1) == CDM7160_SUCCESS){
00132         wait_ms(1);
00133         data[0] = low_limit/10;
00134         if(write(ALLO, data, 1) == CDM7160_SUCCESS){
00135             return CDM7160_SUCCESS;
00136         }
00137     }
00138     return CDM7160_ERROR;
00139 }
00140 
00141 int8_t CDM7160::getAirPressureAndAltitude(){
00142     char data[2];
00143     if(write(HPA) == CDM7160_SUCCESS){
00144         if(read(data,1) == CDM7160_SUCCESS){
00145             cdm7160.atmosferic_pressure = data[0] + 800;
00146             if(write(HIT) == CDM7160_SUCCESS){
00147                 if(read(data,1) == CDM7160_SUCCESS){
00148                     cdm7160.altitude = data[0]*10;
00149                     return CDM7160_SUCCESS;
00150                 }
00151             }
00152         }
00153     }
00154     return CDM7160_ERROR;
00155 }
00156 
00157 int8_t CDM7160::setAirPressureAndAltitude(uint16_t hpa, uint16_t height){
00158     uint8_t atm, alt;
00159     atm = hpa - 800;
00160     alt = height/10;
00161     char data[1] = {atm};
00162     if(write(HPA, data, 1) == CDM7160_SUCCESS){
00163         data[0] = alt;
00164         if(write(HIT, data, 1) == CDM7160_SUCCESS){
00165             return CDM7160_SUCCESS;
00166         }
00167     }
00168     return CDM7160_ERROR;
00169 }
00170 
00171 int8_t CDM7160::getSettings(){
00172     char data[1];
00173     if(write(FUNC) == CDM7160_SUCCESS){
00174         if(read(data, 1) == CDM7160_SUCCESS){
00175             cdm7160.settings = data[0];
00176             return CDM7160_SUCCESS;
00177         }
00178     }
00179     return CDM7160_ERROR;
00180 }
00181 
00182 int8_t CDM7160::setSettings(eFunctionSetting atm_alt_correct,
00183                        eFunctionSetting pwm_conce,
00184                        eFunctionSetting pwm_pin){
00185     
00186     char data[1];
00187     data[0] = pwm_pin | pwm_conce | atm_alt_correct;
00188 
00189     if(write(FUNC, data, 1) == CDM7160_SUCCESS){
00190         return CDM7160_SUCCESS;
00191     }
00192     return CDM7160_ERROR;
00193 }
00194 
00195 int8_t CDM7160::selfDiagnosis(){
00196     char data[1];
00197     if(write(ERR) == CDM7160_SUCCESS){
00198         if(read(data,1) == CDM7160_SUCCESS){
00199             cdm7160.selfDiag = data[0];
00200             return CDM7160_SUCCESS;
00201         }
00202     }
00203     return CDM7160_ERROR;
00204 }
00205  
00206 /**
00207  * ==================== PRIVATE FUNCTIONS ====================
00208  */
00209 
00210 int8_t CDM7160::read(char data[], uint8_t len) {
00211     return _I2C.read((cdm7160.addr + DIR_BIT_READ), data, len);
00212 }
00213 
00214 int8_t CDM7160::write(uint8_t reg) {
00215     char regToWrite[1] = {reg};
00216     return _I2C.write((cdm7160.addr + DIR_BIT_WRITE), regToWrite, 1);
00217 }
00218 
00219 int8_t CDM7160::write(uint8_t reg, char data[], uint8_t len) {
00220     char dataToWrite[len + 1];
00221     dataToWrite[0] = reg;
00222     for(uint8_t i=0; i<len; i++)
00223         dataToWrite[i+1] = data[i];
00224     return _I2C.write((cdm7160.addr + DIR_BIT_WRITE), dataToWrite, (len + 1));
00225 }