/// © MiroZ 2024
#ifndef __SENSOR_DATA_H__
#define __SENSOR_DATA_H__

#include <stdint.h>

#pragma pack(push, 1)

struct MESSAGE_HEADER
{
	uint8_t type;
	uint32_t sec;
	uint32_t usec;
	uint8_t mac[6];
	uint32_t group_id;
};

struct MESSAGE_TYPE_VAL_REASON
{
	uint8_t type;
	uint32_t val;
	uint8_t reason;
};

struct RADAR
{
	uint8_t type;
	uint16_t vals[24];
};

#pragma pack(pop)

#define HEADER_MESSAGE(name_) \
	struct MESSAGE_HEADER name_; \
	createHeader(&name_);

#define HEADER_MESSAGE_P(addr_) \
	createHeader(addr_);

#define PRESSURE_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_PRESSURE; \
	name_.val = val_; name_.reason = reason_;

#define PRESSURE_MESSAGE_P(addr_, val_, reason_) \
	addr->type = MESSAGE_TYPE_PRESSURE; \
	addr->val = val_; addr->reason = reason_;

#define LIGHT_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_LIGHT; \
	name_.val = val_; name_.reason = reason_;

#define LIGHT_MESSAGE_P(addr_, val_, reason_) \
	addr_->type = MESSAGE_TYPE_LIGHT; \
	addr_->val = val_; addr_->reason = reason_;

#define TEMP_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_TEMP; \
	name_.val = val_; name_.reason = reason_;

#define TEMP_MESSAGE_P(addr_, val_, reason_) \
	addr_->type = MESSAGE_TYPE_TEMP; \
	addr_->val = val_; addr_->reason = reason_;

#define HUM_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_HUMIDITY; \
	name_.val = val_; name_.reason = reason_;

#define HUM_MESSAGE_P(addr_, val_, reason_) \
	addr_->type = MESSAGE_TYPE_HUMIDITY; \
	addr_->val = val_; addr_->reason = reason_;

#define GAS_IX_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_GAS_IX; \
	name_.val = val_; name_.reason = reason_;

#define GAS_IX_MESSAGE_P(addr_, val_, reason_) \
	addr_->type = MESSAGE_TYPE_GAS_IX; \
	addr_->val = val_; addr_->reason = reason_;

#define GAS_VAL_MESSAGE(name_, val_, reason_) \
	struct MESSAGE_TYPE_VAL_REASON name_; \
	name_.type = MESSAGE_TYPE_GAS_VAL; \
	name_.val = val_; name_.reason = reason_;

#define GAS_VAL_MESSAGE_P(addr_, val_, reason_) \
	addr_->type = MESSAGE_TYPE_GAS_VAL; \
	addr_->val = val_; addr_->reason = reason_;

#define RADAR_MESSAGE(name_) \
	struct RADAR name_; \
	name_.type = MESSAGE_TYPE_RADAR;

#define RADAR_MESSAGE_P(addr_) \
	(addr_)->type = MESSAGE_TYPE_RADAR;

#define MESSAGE_TYPE_HEADER			0xa5
#define MESSAGE_TYPE_PRESSURE		0x04
#define MESSAGE_TYPE_RADAR			0x37
#define MESSAGE_TYPE_LIGHT			0x06
#define MESSAGE_TYPE_TEMP			0x07
#define MESSAGE_TYPE_HUMIDITY		0x08
#define MESSAGE_TYPE_GAS_IX			0x09
#define MESSAGE_TYPE_GAS_VAL		0x0a

void createHeader(struct MESSAGE_HEADER * header);

#endif