Cayenne Low Power Payload
Dependents: LORAWAN-TTN-CAYENNE-LM35 ER4Lora gps_accelerometer sgam_mdw_test ... more
CayenneLPP.cpp
00001 #include "CayenneLPP.h" 00002 00003 CayenneLPP::CayenneLPP(uint8_t size) : maxsize(size) { 00004 buffer = (uint8_t*) malloc(size); 00005 cursor = 0; 00006 } 00007 00008 CayenneLPP::~CayenneLPP(void) { 00009 free(buffer); 00010 } 00011 00012 void CayenneLPP::reset(void) { 00013 cursor = 0; 00014 } 00015 00016 uint8_t CayenneLPP::getSize(void) { 00017 return cursor; 00018 } 00019 00020 uint8_t* CayenneLPP::getBuffer(void) { 00021 // uint8_t[cursor] result; 00022 // memcpy(result, buffer, cursor); 00023 // return result; 00024 return buffer; 00025 } 00026 00027 uint8_t CayenneLPP::copy(uint8_t* dst) { 00028 memcpy(dst, buffer, cursor); 00029 return cursor; 00030 } 00031 00032 uint8_t CayenneLPP::addDigitalInput(uint8_t channel, uint8_t value) { 00033 if ((cursor + LPP_DIGITAL_INPUT_SIZE) > maxsize) { 00034 return 0; 00035 } 00036 buffer[cursor++] = channel; 00037 buffer[cursor++] = LPP_DIGITAL_INPUT; 00038 buffer[cursor++] = value; 00039 00040 return cursor; 00041 } 00042 00043 uint8_t CayenneLPP::addDigitalOutput(uint8_t channel, uint8_t value) { 00044 if ((cursor + LPP_DIGITAL_OUTPUT_SIZE) > maxsize) { 00045 return 0; 00046 } 00047 buffer[cursor++] = channel; 00048 buffer[cursor++] = LPP_DIGITAL_OUTPUT; 00049 buffer[cursor++] = value; 00050 00051 return cursor; 00052 } 00053 00054 uint8_t CayenneLPP::addAnalogInput(uint8_t channel, float value) { 00055 if ((cursor + LPP_ANALOG_INPUT_SIZE) > maxsize) { 00056 return 0; 00057 } 00058 00059 int16_t val = value * 100; 00060 buffer[cursor++] = channel; 00061 buffer[cursor++] = LPP_ANALOG_INPUT; 00062 buffer[cursor++] = val >> 8; 00063 buffer[cursor++] = val; 00064 00065 return cursor; 00066 } 00067 00068 uint8_t CayenneLPP::addAnalogOutput(uint8_t channel, float value) { 00069 if ((cursor + LPP_ANALOG_OUTPUT_SIZE) > maxsize) { 00070 return 0; 00071 } 00072 int16_t val = value * 100; 00073 buffer[cursor++] = channel; 00074 buffer[cursor++] = LPP_ANALOG_OUTPUT; 00075 buffer[cursor++] = val >> 8; 00076 buffer[cursor++] = val; 00077 00078 return cursor; 00079 } 00080 00081 uint8_t CayenneLPP::addLuminosity(uint8_t channel, uint16_t lux) { 00082 if ((cursor + LPP_LUMINOSITY_SIZE) > maxsize) { 00083 return 0; 00084 } 00085 buffer[cursor++] = channel; 00086 buffer[cursor++] = LPP_LUMINOSITY; 00087 buffer[cursor++] = lux >> 8; 00088 buffer[cursor++] = lux; 00089 00090 return cursor; 00091 } 00092 00093 uint8_t CayenneLPP::addPresence(uint8_t channel, uint8_t value) { 00094 if ((cursor + LPP_PRESENCE_SIZE) > maxsize) { 00095 return 0; 00096 } 00097 buffer[cursor++] = channel; 00098 buffer[cursor++] = LPP_PRESENCE; 00099 buffer[cursor++] = value; 00100 00101 return cursor; 00102 } 00103 00104 uint8_t CayenneLPP::addTemperature(uint8_t channel, float celsius) { 00105 if ((cursor + LPP_TEMPERATURE_SIZE) > maxsize) { 00106 return 0; 00107 } 00108 int16_t val = celsius * 10; 00109 buffer[cursor++] = channel; 00110 buffer[cursor++] = LPP_TEMPERATURE; 00111 buffer[cursor++] = val >> 8; 00112 buffer[cursor++] = val; 00113 00114 return cursor; 00115 } 00116 00117 uint8_t CayenneLPP::addRelativeHumidity(uint8_t channel, float rh) { 00118 if ((cursor + LPP_RELATIVE_HUMIDITY_SIZE) > maxsize) { 00119 return 0; 00120 } 00121 buffer[cursor++] = channel; 00122 buffer[cursor++] = LPP_RELATIVE_HUMIDITY; 00123 buffer[cursor++] = rh * 2; 00124 00125 return cursor; 00126 } 00127 00128 uint8_t CayenneLPP::addAccelerometer(uint8_t channel, float x, float y, float z) { 00129 if ((cursor + LPP_ACCELEROMETER_SIZE) > maxsize) { 00130 return 0; 00131 } 00132 int16_t vx = x * 1000; 00133 int16_t vy = y * 1000; 00134 int16_t vz = z * 1000; 00135 00136 buffer[cursor++] = channel; 00137 buffer[cursor++] = LPP_ACCELEROMETER; 00138 buffer[cursor++] = vx >> 8; 00139 buffer[cursor++] = vx; 00140 buffer[cursor++] = vy >> 8; 00141 buffer[cursor++] = vy; 00142 buffer[cursor++] = vz >> 8; 00143 buffer[cursor++] = vz; 00144 00145 return cursor; 00146 } 00147 00148 uint8_t CayenneLPP::addBarometricPressure(uint8_t channel, float hpa) { 00149 if ((cursor + LPP_BAROMETRIC_PRESSURE_SIZE) > maxsize) { 00150 return 0; 00151 } 00152 int16_t val = hpa * 10; 00153 00154 buffer[cursor++] = channel; 00155 buffer[cursor++] = LPP_BAROMETRIC_PRESSURE; 00156 buffer[cursor++] = val >> 8; 00157 buffer[cursor++] = val; 00158 00159 return cursor; 00160 } 00161 00162 uint8_t CayenneLPP::addGyrometer(uint8_t channel, float x, float y, float z) { 00163 if ((cursor + LPP_GYROMETER_SIZE) > maxsize) { 00164 return 0; 00165 } 00166 int16_t vx = x * 100; 00167 int16_t vy = y * 100; 00168 int16_t vz = z * 100; 00169 00170 buffer[cursor++] = channel; 00171 buffer[cursor++] = LPP_GYROMETER; 00172 buffer[cursor++] = vx >> 8; 00173 buffer[cursor++] = vx; 00174 buffer[cursor++] = vy >> 8; 00175 buffer[cursor++] = vy; 00176 buffer[cursor++] = vz >> 8; 00177 buffer[cursor++] = vz; 00178 00179 return cursor; 00180 } 00181 00182 uint8_t CayenneLPP::addGPS(uint8_t channel, float latitude, float longitude, float meters) { 00183 if ((cursor + LPP_GPS_SIZE) > maxsize) { 00184 return 0; 00185 } 00186 int32_t lat = latitude * 10000; 00187 int32_t lon = longitude * 10000; 00188 int32_t alt = meters * 100; 00189 00190 buffer[cursor++] = channel; 00191 buffer[cursor++] = LPP_GPS; 00192 00193 buffer[cursor++] = lat >> 16; 00194 buffer[cursor++] = lat >> 8; 00195 buffer[cursor++] = lat; 00196 buffer[cursor++] = lon >> 16; 00197 buffer[cursor++] = lon >> 8; 00198 buffer[cursor++] = lon; 00199 buffer[cursor++] = alt >> 16; 00200 buffer[cursor++] = alt >> 8; 00201 buffer[cursor++] = alt; 00202 00203 return cursor; 00204 } 00205
Generated on Wed Jul 13 2022 20:35:54 by 1.7.2