L14-Click 1.0
STM32WLE5CC LoRaWAN Sensor Platform
Loading...
Searching...
No Matches
CayenneLpp.c
Go to the documentation of this file.
1/*!
2 * @file CayenneLpp.c
3 *
4 * @brief Implements the Cayenne Low Power Protocol
5 *
6 * \copyright Revised BSD License, see section \ref LICENSE.
7 *
8 * \code
9 * ______ _
10 * / _____) _ | |
11 * ( (____ _____ ____ _| |_ _____ ____| |__
12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
13 * _____) ) ____| | | || |_| ____( (___| | | |
14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
15 * (C)2013-2018 Semtech
16 *
17 * \endcode
18 *
19 * \author Miguel Luis ( Semtech )
20 */
21/* Includes ------------------------------------------------------------------*/
22#include "stm32_mem.h"
23#include "CayenneLpp.h"
24/* USER CODE BEGIN Includes */
25#include "utilities.h"
26/* USER CODE END Includes */
27
28/* External variables ---------------------------------------------------------*/
29/* USER CODE BEGIN EV */
30
31/* USER CODE END EV */
32
33/* Private typedef -----------------------------------------------------------*/
34/* USER CODE BEGIN PTD */
35
36/* USER CODE END PTD */
37
38/* Private define ------------------------------------------------------------*/
39#define CAYENNE_LPP_MAXBUFFER_SIZE 242
40#define LPP_DIGITAL_INPUT 0 /* 1 byte */
41#define LPP_DIGITAL_OUTPUT 1 /* 1 byte */
42#define LPP_ANALOG_INPUT 2 /* 2 bytes, 0.01 signed */
43#define LPP_ANALOG_OUTPUT 3 /* 2 bytes, 0.01 signed */
44#define LPP_LUMINOSITY 101 /* 2 bytes, 1 lux unsigned */
45#define LPP_PRESENCE 102 /* 1 byte, 1 */
46#define LPP_TEMPERATURE 103 /* 2 bytes, 0.1 Celsius degrees signed */
47#define LPP_RELATIVE_HUMIDITY 104 /* 1 byte, 0.5% unsigned */
48#define LPP_ACCELEROMETER 113 /* 2 bytes per axis, 0.001G */
49#define LPP_BAROMETRIC_PRESSURE 115 /* 2 bytes 0.1 hPa Unsigned */
50#define LPP_GYROMETER 134 /* 2 bytes per axis, 0.01 degrees/s */
51#define LPP_GPS 136 /* 3 byte lon/lat 0.0001 degrees, 3 bytes alt 0.01m */
52
53/* Data ID + Data Type + Data Size */
54#define LPP_DIGITAL_INPUT_SIZE 3
55#define LPP_DIGITAL_OUTPUT_SIZE 3
56#define LPP_ANALOG_INPUT_SIZE 4
57#define LPP_ANALOG_OUTPUT_SIZE 4
58#define LPP_LUMINOSITY_SIZE 4
59#define LPP_PRESENCE_SIZE 3
60#define LPP_TEMPERATURE_SIZE 4
61#define LPP_RELATIVE_HUMIDITY_SIZE 3
62#define LPP_ACCELEROMETER_SIZE 8
63#define LPP_BAROMETRIC_PRESSURE_SIZE 4
64#define LPP_GYROMETER_SIZE 8
65#define LPP_GPS_SIZE 11
66
67/* USER CODE BEGIN PD */
68/* Additional sensor types for missing sensors */
69#define LPP_CONCENTRATION 125 /* 2 bytes, 1 ppm unsigned (CO2) */
70#define LPP_VOLTAGE 116 /* 2 bytes, 0.01V unsigned */
71#define LPP_PARTICULATE_MATTER_1_0 138 /* 2 bytes, 1 μg/m3 of 1mm unsigned */
72#define LPP_PARTICULATE_MATTER_2_5 139 /* 2 bytes, 1 μg/m3 of 2.5mm unsigned */
73#define LPP_UNIX_TIME 133 /* 4 bytes data, unsigned Unix timestamp */
74#define LPP_MEAUREINTERVAL_MIN 140 /* 2bytes data, measire inteval in minutes*10 */
75
76/* Data sizes for new sensor types */
77#define LPP_CONCENTRATION_SIZE 4
78#define LPP_VOLTAGE_SIZE 4
79#define LPP_PARTICULATE_MATTER_SIZE 4
80#define LPP_UNIX_TIME_SIZE 6
81#define LPP_MEAUREINTERVAL_MIN_SIZE 2
82/* USER CODE END PD */
83
84/* Private macro -------------------------------------------------------------*/
85/* USER CODE BEGIN PM */
86
87/* USER CODE END PM */
88
89/* Private variables ---------------------------------------------------------*/
91static uint8_t CayenneLppCursor = 0;
92/* USER CODE BEGIN PV */
93
94/* USER CODE END PV */
95
96/* Private function prototypes -----------------------------------------------*/
97
98/* USER CODE BEGIN PFP */
99
100/* USER CODE END PFP */
101
102/* Exported functions --------------------------------------------------------*/
104{
106 /* USER CODE BEGIN CayenneLppCursor */
107
108 /* USER CODE END CayenneLppCursor */
109}
110
112{
114 /* USER CODE BEGIN CayenneLppReset */
115
116 /* USER CODE END CayenneLppReset */
117}
118
119uint8_t CayenneLppGetSize(void)
120{
121 /* USER CODE BEGIN CayenneLppGetSize */
122
123 /* USER CODE END CayenneLppGetSize */
124 return CayenneLppCursor;
125}
126
128{
129 /* USER CODE BEGIN CayenneLppGetBuffer */
130
131 /* USER CODE END CayenneLppGetBuffer */
132 return CayenneLppBuffer;
133}
134
135uint8_t CayenneLppCopy(uint8_t *dst)
136{
137 /* USER CODE BEGIN CayenneLppCopy_1 */
138
139 /* USER CODE END CayenneLppCopy_1 */
140 UTIL_MEM_cpy_8(dst, CayenneLppBuffer, CayenneLppCursor);
141 /* USER CODE BEGIN CayenneLppCopy_2 */
142
143 /* USER CODE END CayenneLppCopy_2 */
144 return CayenneLppCursor;
145}
146
147uint8_t CayenneLppAddDigitalInput(uint8_t channel, uint8_t value)
148{
149 /* USER CODE BEGIN CayenneLppAddDigitalInput_1 */
150
151 /* USER CODE END CayenneLppAddDigitalInput_1 */
153 {
154 return 0;
155 }
159 /* USER CODE BEGIN CayenneLppAddDigitalInput_2 */
160
161 /* USER CODE END CayenneLppAddDigitalInput_2 */
162 return CayenneLppCursor;
163}
164
165uint8_t CayenneLppAddDigitalOutput(uint8_t channel, uint8_t value)
166{
167 /* USER CODE BEGIN CayenneLppAddDigitalOutput_1 */
168
169 /* USER CODE END CayenneLppAddDigitalOutput_1 */
171 {
172 return 0;
173 }
177 /* USER CODE BEGIN CayenneLppAddDigitalOutput_2 */
178
179 /* USER CODE END CayenneLppAddDigitalOutput_2 */
180 return CayenneLppCursor;
181}
182
183uint8_t CayenneLppAddAnalogInput(uint8_t channel, float value)
184{
185 /* USER CODE BEGIN CayenneLppAddAnalogInput_1 */
186
187 /* USER CODE END CayenneLppAddAnalogInput_1 */
189 {
190 return 0;
191 }
192
193 int16_t val = (int16_t)(value * 100);
198 /* USER CODE BEGIN CayenneLppAddAnalogInput_2 */
199
200 /* USER CODE END CayenneLppAddAnalogInput_2 */
201 return CayenneLppCursor;
202}
203
204uint8_t CayenneLppAddAnalogOutput(uint8_t channel, float value)
205{
206 /* USER CODE BEGIN CayenneLppAddAnalogOutput_1 */
207
208 /* USER CODE END CayenneLppAddAnalogOutput_1 */
210 {
211 return 0;
212 }
213 int16_t val = (int16_t)(value * 100);
218 /* USER CODE BEGIN CayenneLppAddAnalogOutput_2 */
219
220 /* USER CODE END CayenneLppAddAnalogOutput_2 */
221 return CayenneLppCursor;
222}
223
224uint8_t CayenneLppAddLuminosity(uint8_t channel, uint16_t lux)
225{
226 /* USER CODE BEGIN CayenneLppAddLuminosity_1 */
227
228 /* USER CODE END CayenneLppAddLuminosity_1 */
230 {
231 return 0;
232 }
237 /* USER CODE BEGIN CayenneLppAddLuminosity_2 */
238
239 /* USER CODE END CayenneLppAddLuminosity_2 */
240 return CayenneLppCursor;
241}
242
243uint8_t CayenneLppAddPresence(uint8_t channel, uint8_t value)
244{
245 /* USER CODE BEGIN CayenneLppAddPresence_1 */
246
247 /* USER CODE END CayenneLppAddPresence_1 */
249 {
250 return 0;
251 }
255 /* USER CODE BEGIN CayenneLppAddPresence_2 */
256
257 /* USER CODE END CayenneLppAddPresence_2 */
258 return CayenneLppCursor;
259}
260
261uint8_t CayenneLppAddTemperature(uint8_t channel, float celsius)
262{
263 /* USER CODE BEGIN CayenneLppAddTemperature_1 */
264
265 /* USER CODE END CayenneLppAddTemperature_1 */
267 {
268 return 0;
269 }
270 int16_t val = (int16_t)(celsius * 10);
275 /* USER CODE BEGIN CayenneLppAddTemperature_2 */
276
277 /* USER CODE END CayenneLppAddTemperature_2 */
278 return CayenneLppCursor;
279}
280
281uint8_t CayenneLppAddRelativeHumidity(uint8_t channel, float rh)
282{
283 /* USER CODE BEGIN CayenneLppAddRelativeHumidity_1 */
284
285 /* USER CODE END CayenneLppAddRelativeHumidity_1 */
287 {
288 return 0;
289 }
292 CayenneLppBuffer[CayenneLppCursor++] = (uint8_t)(rh * 2);
293 /* USER CODE BEGIN CayenneLppAddRelativeHumidity_2 */
294
295 /* USER CODE END CayenneLppAddRelativeHumidity_2 */
296 return CayenneLppCursor;
297}
298
299uint8_t CayenneLppAddAccelerometer(uint8_t channel, float x, float y, float z)
300{
301 /* USER CODE BEGIN CayenneLppAddAccelerometer_1 */
302
303 /* USER CODE END CayenneLppAddAccelerometer_1 */
305 {
306 return 0;
307 }
308 int16_t vx = (int16_t)(x * 1000);
309 int16_t vy = (int16_t)(y * 1000);
310 int16_t vz = (int16_t)(z * 1000);
311
320 /* USER CODE BEGIN CayenneLppAddAccelerometer_2 */
321
322 /* USER CODE END CayenneLppAddAccelerometer_2 */
323 return CayenneLppCursor;
324}
325
326uint8_t CayenneLppAddBarometricPressure(uint8_t channel, float hpa)
327{
328 /* USER CODE BEGIN CayenneLppAddBarometricPressure_1 */
329
330 /* USER CODE END CayenneLppAddBarometricPressure_1 */
332 {
333 return 0;
334 }
335 int16_t val = (int16_t)(hpa * 10);
336
341 /* USER CODE BEGIN CayenneLppAddBarometricPressure_2 */
342
343 /* USER CODE END CayenneLppAddBarometricPressure_2 */
344 return CayenneLppCursor;
345}
346
347uint8_t CayenneLppAddGyrometer(uint8_t channel, float x, float y, float z)
348{
349 /* USER CODE BEGIN CayenneLppAddGyrometer_1 */
350
351 /* USER CODE END CayenneLppAddGyrometer_1 */
353 {
354 return 0;
355 }
356 int16_t vx = (int16_t)(x * 100);
357 int16_t vy = (int16_t)(y * 100);
358 int16_t vz = (int16_t)(z * 100);
359
368 /* USER CODE BEGIN CayenneLppAddGyrometer_2 */
369
370 /* USER CODE END CayenneLppAddGyrometer_2 */
371 return CayenneLppCursor;
372}
373
374uint8_t CayenneLppAddGps(uint8_t channel, float latitude, float longitude, float meters)
375{
376 /* USER CODE BEGIN CayenneLppAddGps_1 */
377
378 /* USER CODE END CayenneLppAddGps_1 */
380 {
381 return 0;
382 }
383 int32_t lat = (int32_t)(latitude * 10000);
384 int32_t lon = (int32_t)(longitude * 10000);
385 int32_t alt = (int32_t)(meters * 100);
386
389
390 CayenneLppBuffer[CayenneLppCursor++] = lat >> 16;
393 CayenneLppBuffer[CayenneLppCursor++] = lon >> 16;
396 CayenneLppBuffer[CayenneLppCursor++] = alt >> 16;
399 /* USER CODE BEGIN CayenneLppAddGps_2 */
400
401 /* USER CODE END CayenneLppAddGps_2 */
402 return CayenneLppCursor;
403}
404
405/* USER CODE BEGIN EF */
406
408{
410}
411
412/**
413 * @brief Add CO2 concentration data to the buffer
414 * @param channel Data channel
415 * @param ppm CO2 concentration in parts per million (ppm)
416 * @return Current buffer position
417 */
418uint8_t CayenneLppAddConcentration(uint8_t channel, uint16_t ppm)
419{
421 {
422 return 0;
423 }
428 return CayenneLppCursor;
429}
430
431/**
432 * @brief Add voltage data to the buffer
433 * @param channel Data channel
434 * @param voltage Voltage in volts
435 * @return Current buffer position
436 */
437uint8_t CayenneLppAddVoltage(uint8_t channel, float voltage)
438{
440 {
441 return 0;
442 }
443 uint16_t val = (uint16_t) (voltage * 100);
448 return CayenneLppCursor;
449}
450
451/**
452 * @brief Add particulate matter of 1mm concentration data to the buffer
453 * @param channel Data channel
454 * @param concentration_1_0 Particle concentration of 1mm in μg/m³
455 * @return Current buffer position
456 */
457uint8_t CayenneLppAddParticulateMatter_1_0(uint8_t channel, float concentration_1_0)
458{
460 {
461 return 0;
462 }
463 uint16_t val = (uint16_t) concentration_1_0;
468 return CayenneLppCursor;
469}
470
471/**
472 * @brief Add particulate matter 2.5mm concentration data to the buffer
473 * @param channel Data channel
474 * @param concentration_2_5 Particle concentration of 2.5mm in μg/m³
475 * @return Current buffer position
476 */
477uint8_t CayenneLppAddParticulateMatter_2_5(uint8_t channel, float concentration_2_5)
478{
480 {
481 return 0;
482 }
483 uint16_t val = (uint16_t) concentration_2_5;
488 return CayenneLppCursor;
489}
490
491
492/**
493 * @brief Add battery voltage data to the buffer
494 * @param channel Data channel (30 for main battery, 31 for PA15)
495 * @param voltage Battery voltage in volts
496 * @return Current buffer position
497 */
498uint8_t CayenneLppAddBatteryVoltage(uint8_t channel, float voltage)
499{
500 return CayenneLppAddVoltage(channel, voltage);
501}
502
503/**
504 * @brief Add time offset from LoRa join to the buffer
505 * @param channel Data channel
506 * @param timeOffset Time value in seconds (uint32_t). Can represent either:
507 * - Time offset since joining LoRa network
508 * - Unix timestamp (seconds since epoch)
509 * @return Current buffer position
510 */
511uint8_t CayenneLppAddTimeFromJoin(uint8_t channel, uint32_t timeOffset)
512{
514 {
515 return 0;
516 }
519 CayenneLppBuffer[CayenneLppCursor++] = timeOffset >> 24;
520 CayenneLppBuffer[CayenneLppCursor++] = timeOffset >> 16;
521 CayenneLppBuffer[CayenneLppCursor++] = timeOffset >> 8;
522 CayenneLppBuffer[CayenneLppCursor++] = timeOffset;
523 return CayenneLppCursor;
524}
525
526uint8_t CayenneLppAddMeasureInterval(uint8_t channel, uint16_t min10)
527{
529 {
530 return 0;
531 }
534 CayenneLppBuffer[CayenneLppCursor++] = min10 >> 8;
536 return CayenneLppCursor;
537}
538
539/*
540void CayenneLppSetFrom(const uint8_t* srcBuf, uint8_t sz)
541{
542 memcpy(CayenneLppBuffer, srcBuf, MAX(sz,CAYENNE_LPP_MAXBUFFER_SIZE));
543 CayenneLppCursor = sz;
544}
545*/
546/* USER CODE END EF */
547
548/* Private Functions Definition -----------------------------------------------*/
549/* USER CODE BEGIN PrFD */
550
551/* USER CODE END PrFD */
uint8_t CayenneLppAddTimeFromJoin(uint8_t channel, uint32_t timeOffset)
Add time offset from LoRa join to the buffer.
Definition CayenneLpp.c:511
#define LPP_GYROMETER
Definition CayenneLpp.c:50
uint8_t CayenneLppAddTemperature(uint8_t channel, float celsius)
Definition CayenneLpp.c:261
#define LPP_RELATIVE_HUMIDITY
Definition CayenneLpp.c:47
#define LPP_GYROMETER_SIZE
Definition CayenneLpp.c:64
uint8_t * CayenneLppGetBuffer(void)
Definition CayenneLpp.c:127
#define LPP_BAROMETRIC_PRESSURE
Definition CayenneLpp.c:49
#define LPP_GPS_SIZE
Definition CayenneLpp.c:65
#define LPP_DIGITAL_OUTPUT
Definition CayenneLpp.c:41
#define LPP_DIGITAL_OUTPUT_SIZE
Definition CayenneLpp.c:55
#define LPP_MEAUREINTERVAL_MIN
Definition CayenneLpp.c:74
uint8_t CayenneLppAddDigitalInput(uint8_t channel, uint8_t value)
Definition CayenneLpp.c:147
uint8_t CayenneLppAddConcentration(uint8_t channel, uint16_t ppm)
Add CO2 concentration data to the buffer.
Definition CayenneLpp.c:418
void CayenneLppInit(void)
Definition CayenneLpp.c:103
#define LPP_PARTICULATE_MATTER_SIZE
Definition CayenneLpp.c:79
uint8_t CayenneLppCopy(uint8_t *dst)
Definition CayenneLpp.c:135
#define CAYENNE_LPP_MAXBUFFER_SIZE
Definition CayenneLpp.c:39
uint8_t CayenneLppAddLuminosity(uint8_t channel, uint16_t lux)
Definition CayenneLpp.c:224
uint8_t CayenneLppAddGps(uint8_t channel, float latitude, float longitude, float meters)
Definition CayenneLpp.c:374
#define LPP_VOLTAGE
Definition CayenneLpp.c:70
uint8_t CayenneLppAddPresence(uint8_t channel, uint8_t value)
Definition CayenneLpp.c:243
uint8_t CayenneLppAddBarometricPressure(uint8_t channel, float hpa)
Definition CayenneLpp.c:326
#define LPP_PRESENCE
Definition CayenneLpp.c:45
uint8_t CayenneLppAddVoltage(uint8_t channel, float voltage)
Add voltage data to the buffer.
Definition CayenneLpp.c:437
#define LPP_LUMINOSITY_SIZE
Definition CayenneLpp.c:58
#define LPP_CONCENTRATION_SIZE
Definition CayenneLpp.c:77
#define LPP_PARTICULATE_MATTER_2_5
Definition CayenneLpp.c:72
#define LPP_LUMINOSITY
Definition CayenneLpp.c:44
static uint8_t CayenneLppBuffer[242]
Definition CayenneLpp.c:90
#define LPP_ACCELEROMETER
Definition CayenneLpp.c:48
#define LPP_TEMPERATURE
Definition CayenneLpp.c:46
uint8_t CayenneLppAddBatteryVoltage(uint8_t channel, float voltage)
Add battery voltage data to the buffer.
Definition CayenneLpp.c:498
void CayenneLppReset(void)
Definition CayenneLpp.c:111
uint8_t CayenneLppMaxBuffer()
Definition CayenneLpp.c:407
uint8_t CayenneLppAddAnalogOutput(uint8_t channel, float value)
Definition CayenneLpp.c:204
uint8_t CayenneLppAddAnalogInput(uint8_t channel, float value)
Definition CayenneLpp.c:183
uint8_t CayenneLppAddParticulateMatter_1_0(uint8_t channel, float concentration_1_0)
Add particulate matter of 1mm concentration data to the buffer.
Definition CayenneLpp.c:457
#define LPP_VOLTAGE_SIZE
Definition CayenneLpp.c:78
#define LPP_PARTICULATE_MATTER_1_0
Definition CayenneLpp.c:71
uint8_t CayenneLppAddParticulateMatter_2_5(uint8_t channel, float concentration_2_5)
Add particulate matter 2.5mm concentration data to the buffer.
Definition CayenneLpp.c:477
#define LPP_TEMPERATURE_SIZE
Definition CayenneLpp.c:60
uint8_t CayenneLppAddRelativeHumidity(uint8_t channel, float rh)
Definition CayenneLpp.c:281
#define LPP_BAROMETRIC_PRESSURE_SIZE
Definition CayenneLpp.c:63
#define LPP_ANALOG_INPUT
Definition CayenneLpp.c:42
uint8_t CayenneLppGetSize(void)
Definition CayenneLpp.c:119
#define LPP_DIGITAL_INPUT_SIZE
Definition CayenneLpp.c:54
#define LPP_UNIX_TIME_SIZE
Definition CayenneLpp.c:80
#define LPP_GPS
Definition CayenneLpp.c:51
static uint8_t CayenneLppCursor
Definition CayenneLpp.c:91
#define LPP_PRESENCE_SIZE
Definition CayenneLpp.c:59
#define LPP_ACCELEROMETER_SIZE
Definition CayenneLpp.c:62
uint8_t CayenneLppAddMeasureInterval(uint8_t channel, uint16_t min10)
Add the measure interval in minutes *10 of data measuring.
Definition CayenneLpp.c:526
#define LPP_ANALOG_OUTPUT
Definition CayenneLpp.c:43
#define LPP_ANALOG_OUTPUT_SIZE
Definition CayenneLpp.c:57
uint8_t CayenneLppAddGyrometer(uint8_t channel, float x, float y, float z)
Definition CayenneLpp.c:347
uint8_t CayenneLppAddAccelerometer(uint8_t channel, float x, float y, float z)
Definition CayenneLpp.c:299
#define LPP_MEAUREINTERVAL_MIN_SIZE
Definition CayenneLpp.c:81
#define LPP_CONCENTRATION
Definition CayenneLpp.c:69
uint8_t CayenneLppAddDigitalOutput(uint8_t channel, uint8_t value)
Definition CayenneLpp.c:165
#define LPP_DIGITAL_INPUT
Definition CayenneLpp.c:40
#define LPP_UNIX_TIME
Definition CayenneLpp.c:73
#define LPP_ANALOG_INPUT_SIZE
Definition CayenneLpp.c:56
#define LPP_RELATIVE_HUMIDITY_SIZE
Definition CayenneLpp.c:61
Implements the Cayenne Low Power Protocol.