TwePacketPAL
TwePacketPal
class interprets packet data from TWELITE PAL. This class provides a common interface for handling TWELITE PAL packets (e.g., sensor data sent upstream).
class TwePacketPal : public TwePacket, public DataPal { ... };
Common PAL data is defined in DataPal
.
Generator functions are provided to extract sensor-board-specific data for each type of PAL.
DataPal
Struct
The data structure of PAL packets varies depending on the connected sensor, but DataPal
holds the common part of the data structure.
struct DataPal {
uint8_t u8lqi; // LQI value
uint32_t u32addr_rpt; // Address of repeater
uint32_t u32addr_src; // Source address
uint8_t u8addr_src; // Source logical address
uint16_t u16seq; // Sequence number
E_PAL_PCB u8palpcb; // Type of PAL board
uint8_t u8palpcb_rev; // Revision of PAL board
uint8_t u8sensors; // Number of sensor data entries included (MSB=1 indicates error)
uint8_t u8snsdatalen; // Length of sensor data (in bytes)
union {
const uint8_t *au8snsdata; // Pointer to sensor data
uint8_t _pobj[MWX_PARSER_PKT_APPPAL_FIXED_BUF]; // Sensor-specific objects
};
};
A PAL packet consists of two main blocks: the common PAL part and a sensor-specific data part. The sensor-specific part is stored as-is without parsing. To simplify handling, data exceeding 32 bytes is stored in uptr_snsdata
, which is dynamically allocated.
The sensor-specific part is stored in a structure that inherits from PalBase
. This structure is generated by generator functions defined in TwePacketPal
.
When parse<TwePacketPAL>()
is executed and the data fits within MWX_PARSER_PKT_APPPAL_FIXED_BUF
, sensor-specific objects are created.
If it exceeds that size, a reference to the raw byte sequence is stored in au8snsdata
.
In such cases, if the original byte sequence is modified, sensor-specific objects can no longer be generated.
PalBase
All sensor-specific structures for PAL inherit from PalBase
, which contains the sensor data storage status u32StoredMask
.
struct PalBase {
uint32_t u32StoredMask; // Internal flag indicating which data is stored
};
PalEvent
A PAL event does not directly transmit raw sensor data, but rather processed information triggered under specific conditions. For example, when acceleration exceeds a threshold from a stationary state.
struct PalEvent {
uint8_t b_stored; // True if stored
uint8_t u8event_source; // Reserved
uint8_t u8event_id; // Event ID
uint32_t u32event_param;// Event parameter
};
If event data is present, .is_PalEvent()
in TwePacketPal
returns true
, and .get_PalEvent()
provides the PalEvent
structure.
Generator Functions
Generator functions are provided to extract sensor-board-specific data for each type of PAL.
void print_pal(pktparser& pkt) {
auto&& pal = pkt.use<TwePacketPal>();
if (pal.is_PalEvent()) {
PalEvent obj = pal.get_PalEvent();
} else
switch(pal.u8palpcb) {
case E_PAL_PCB::MAG:
{
// generate pal board specific data structure.
PalMag obj = pal.get_PalMag();
} break;
case E_PAL_PCB::AMB:
{
// generate pal board specific data structure.
PalAmb obj = pal.get_PalAmb();
} break;
...
default: ;
}
}
To use generator functions, first check whether pkt
is an event using .is_PalEvent()
. If so, retrieve the data using get_PalEvent()
. Otherwise, generate the appropriate object based on u8palpcb
.
get_PalMag()
PalMag get_PalMag()
// MAG
struct PalMag : public PalBase {
uint16_t u16Volt; // Module voltage [mV]
uint8_t u8MagStat; // Magnetic switch state [0: no magnet, 1, 2]
uint8_t bRegularTransmit; // MSB flag of u8MagStat
};
If .u8palpcb == E_PAL_PCB::MAG
, retrieve PalMag
data for the open-close sensor PAL.
get_PalAmb()
PalAmb get_PalAmb()
// AMB
struct PalAmb : public PalBase {
uint16_t u16Volt; // Module voltage [mV]
int16_t i16Temp; // Temperature (value ×100)
uint16_t u16Humd; // Humidity (value ×100)
uint32_t u32Lumi; // Illuminance (approx. lux)
};
If .u8palpcb == E_PAL_PCB::AMB
, retrieve PalAmb
data for the environmental sensor PAL.
get_PalMot()
PalMot get_PalMot()
// MOT
struct PalMot : public PalBase {
uint16_t u16Volt; // Module voltage [mV]
uint8_t u8samples; // Number of samples
uint8_t u8sample_rate_code; // Sample rate (0: 25Hz, 4: 100Hz)
int16_t i16X[16]; // X-axis
int16_t i16Y[16]; // Y-axis
int16_t i16Z[16]; // Z-axis
};
If .u8palpcb == E_PAL_PCB::MOT
, retrieve PalMot
data for the motion sensor PAL.
get_PalEvent()
PalEvent get_PalEvent()
// PAL event
struct PalEvent {
uint8_t b_stored; // True if event information is available
uint8_t u8event_source; // Event source
uint8_t u8event_id; // Event ID
uint32_t u32event_param; // 24-bit event parameter
};
If .is_PalEvent()
is true
, retrieve PalEvent
data.