123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // LoRa encoding and decoding functions
- // Copyright (c) 2016 Maarten Westenberg
- // Version 1.1.0
- // Date: 2016-10-23
- //
- // All rights reserved. This program and the accompanying materials
- // are made available under the terms of the MIT License
- // which accompanies this distribution, and is available at
- // https://opensource.org/licenses/mit-license.php
- //
- // Author: Maarten Westenberg
- //
- // The protocols used in this code:
- // 1. LoRA Specification version V1.0 and V1.1 for Gateway-Node communication
- //
- // 2. Semtech Basic communication protocol between Lora gateway and server version 3.0.0
- // https://github.com/Lora-net/packet_forwarder/blob/master/PROTOCOL.TXT
- //
- // Notes:
- // The lCode specification is documented on a sparate page on github.
- //
- // Todo:
- // The luminescense is read as a 16-bit value in the library and converted to
- // a float value in order to get proper scaling etc. In the lCode lib it is
- // coded as a 2-byte value over the air, which might be incorrect for lux values
- // over 650 lux (which IS posible since bright daylight has more than 1000 lux).
- // So XXX we have to add another byte to cover values above 65
- // ----------------------------------------------------------------------------------------
- #ifndef LoRaCode_h
- #define LoRaCode_h
- // Op Codes
- #define O_TEMP 0x01 // Temperature is a one-byte code
- #define O_HUMI 0x02 // Humidity is a one-byte code
- #define O_AIRP 0x03 // Air pressure is a one-byte code
- #define O_GPS 0x04 // Short version: ONLY 3 bytes LAT and 3 bytes LONG
- #define O_GPSL 0x05 // Long GPS
- #define O_PIR 0x06 // Movement, 1 bit (=1 byte)
- #define O_AQ 0x07 // Airquality
- #define O_RTC 0x08 // Real Time Clock
- #define O_COMPASS 0x09 // Compass
- #define O_MB 0x0A // Multi Sensors 433
- #define O_MOIST 0x0B // Moisture is one-byte
- #define O_LUMI 0x0C // Luminescense u16
- #define O_DIST 0x0D // Distance is 2-byte
- #define O_GAS 0x0E // GAS
- // 0x0F
- // 0x10 // 16 values
- // 0x11
- // ..
- // 0x1F
- #define O_BATT 0x20 // Internal Battery
- #define O_ADC0 0x21 // AD converter on pin 0
- #define O_ADC1 0x22
- // Reserved for LoRa messages (especially downstream)
- #define O_STAT 0x30 // Ask for status message from node
- #define O_SF 0x31 // Spreading factor change OFF=0, values 7-12
- #define O_TIM 0x32 // Timing of the wait cyclus (20 to 7200 seconds)
- #define O_1CH 0x33 // Single channel: Channel Value=0-9, OFF==255
- #define O_LOC 0x34 // Ask for the location. Responds with GPS (if available)
- // ..
- // 0x3F
- class LoRaCode
- {
- public:
- int eVal(int opcode, byte *val, byte *msg);
- int eTemperature(float val, byte *msg);
- int eHumidity(float val, byte *msg);
- int eAirpressure(float val, byte *msg);
- int eGps(double lat, double lng, byte *msg);
- int eGpsL(double lat, double lng, long alt, int sat, byte *msg);
- int ePir(int val, byte *msg);
- int eAirquality(int pm25, int pm10, byte *msg); // value 0 (good) -1024 (gas)
- int eMbuttons(byte val, unsigned long address, unsigned short channel, byte *msg); // concentrator for multi-buttons
- int eMoist(int val, byte *msg); // 255 is dry, 0 is wet
- int eLuminescense(float val, byte *msg); // val contains light intensity
- int eLuminescenseL(float val, byte *msg); // long contains light intensity
- int eDistance(int val, byte *msg);
- int eGas(int val, byte *msg);
-
- // opcodes 0x0F until 0x1F
- int eBattery(float val, byte *msg);
- int eAdc0(int val, byte *msg); // Pin A0 has 1024 values, we use 256
- int eAdc1(int val, byte *msg); // Pin A1 has 1024 values, we use 256
-
- bool eMsg(byte *msg, int len);
- void lPrint(byte *msg, int len);
-
- //Decoding (downstream)
- int dLen (byte *msg);
- int dMsg (byte *msg, byte *val, byte *mode);
-
- };
- extern LoRaCode lcode;
- #endif
|