#ifndef __LORA_H__
#define __LORA_H__

//#include "USART3.h"
#include "USART.h"

// #define LORA_MODE

/* LoRaµÄ¾²Ì¬ÉèÖÃ */
#define LORA_MODE_INIT                                        1
#define LORA_GPIO_PIN_TX                                      GPIO_Pin_10
#define LORA_GPIO_PIN_RX                                      GPIO_Pin_11
#define LORA_GPIO_PIN_ATK_AUX                                 GPIO_Pin_4 //PA4
#define LORA_GPIO_PIN_ATK_MD0                                 GPIO_Pin_3 //PB3
#define LORA_GATE_ADDR_HIGH                                   0x03
#define LORA_GATE_ADDR_LOW                                    0xE9
#define LORA_GATE_CHANNEL                                     0x17
#define LORA_NODE1_ADDR_HIGH                                  0x03
#define LORA_NODE1_ADDR_LOW                                   0xEA
#define LORA_NODE1_CHANNEL                                    0x17
#define LORA_NODE1_IDENTIFIER                                 0xD1
#define LORA_NODE2_ADDR_HIGH                                  0x03
#define LORA_NODE2_ADDR_LOW                                   0xEB
#define LORA_NODE2_CHANNEL                                    0x17
#define LORA_NODE2_IDENTIFIER                                 0xD2
#define LORA_SENSOR_DHT11                                     0xEA
#define LORA_SENSOR_MQ2                                       0xEB
#define LORA_SENSOR_LIGHT                                     0xEC
#define LORA_SENSOR_FIRE                                      0xED
#define LORA_EXECUTOR_LED                                     0xFA
#define LORA_EXECUTOR_FAN                                     0xFB
#define LORA_EXECUTOR_HUMIDIFIER                              0xFC
#define LORA_EXECUTOR_BUZZER                                  0xFD
#define LORA_EXECUTOR_SERVO                                   0xFE
#define LORA_EXECUTOR_COMMAND_ON                              0x01
#define LORA_EXECUTOR_COMMAND_OFF                             0x00

/* LoRaÒÆÖ²²ã */

typedef enum {
    statusGatawayNode = 1,
    statusNode1,
    statusNode2,
    statusExeLed,
    statusExeFan,
    statusExeHumidifier,
    statusExeBuzzer,
    statusExeServo,
    statusExeOn,
    statusExeOff,
    statusLedOn,
    statusLedOff,
    statusFanOn,
    statusFanOff,
    statusHumidifierOn,
    statusHumidifierOff,
    statusBuzzerOn,
    statusBuzzerOff,
    statusServoOn,
    statusServoOff,
    null
}eLoRaMsgRecStatus;

typedef struct {
    uint8_t ucLoRaGateAddrHigh;
    uint8_t ucLoRaGateAddrLow;    
    uint8_t ucLoRaGateChannel;
} LoRaGateConfig_t;

typedef struct {
    uint8_t ucLoRaNode1AddrHigh;
    uint8_t ucLoRaNode1AddrLow;
    uint8_t ucLoRaNode1Channel;
    uint8_t ucLoRaNode1Identifier;
} LoRaNode1Config_t;

typedef struct {
    uint8_t ucLoRaNode2AddrHigh;
    uint8_t ucLoRaNode2AddrLow;
    uint8_t ucLoRaNode2Channel;
    uint8_t ucLoRaNode2Identifier;
} LoRaNode2Config_t;
	
typedef struct {
    uint8_t ucIdDht11;
    uint8_t ucIdMq2;
    uint8_t ucIdLight;
    uint8_t	ucIdFire;
} LoRaSensorID_t;

typedef struct {
    uint8_t ucIdLed;
    uint8_t ucIdFan;
    uint8_t ucIdHumidifier;
    uint8_t ucIdBuzzer;
    uint8_t ucIdServo;
} LoRaExecutorID_t;

typedef struct {
    uint8_t ucCommandOn;
    uint8_t ucCommandOff;
} LoRaExecutorCmd_t;

static LoRaGateConfig_t xLoRaGateConfig = {
    .ucLoRaGateAddrHigh    = LORA_GATE_ADDR_HIGH,
    .ucLoRaGateAddrLow     = LORA_GATE_ADDR_LOW,
    .ucLoRaGateChannel     = LORA_GATE_CHANNEL  
};

static LoRaNode1Config_t xLoRaNode1Config = {
    .ucLoRaNode1AddrHigh   = LORA_NODE1_ADDR_HIGH,
    .ucLoRaNode1AddrLow    = LORA_NODE1_ADDR_LOW,
    .ucLoRaNode1Channel    = LORA_NODE1_CHANNEL,
    .ucLoRaNode1Identifier = LORA_NODE1_IDENTIFIER,
};

static LoRaNode2Config_t xLoRaNode2Config = {
    .ucLoRaNode2AddrHigh   = LORA_NODE2_ADDR_HIGH,
    .ucLoRaNode2AddrLow    = LORA_NODE2_ADDR_LOW,
    .ucLoRaNode2Channel    = LORA_NODE2_CHANNEL,
    .ucLoRaNode2Identifier = LORA_NODE2_IDENTIFIER
};

static LoRaSensorID_t xLoRaSensorID = {
    .ucIdDht11      = LORA_SENSOR_DHT11,
    .ucIdMq2        = LORA_SENSOR_MQ2,
    .ucIdLight      = LORA_SENSOR_LIGHT,
    .ucIdFire       = LORA_SENSOR_FIRE
};

static LoRaExecutorID_t xLoRaExecutorID = {
    .ucIdLed        = LORA_EXECUTOR_LED,
    .ucIdFan        = LORA_EXECUTOR_FAN,
    .ucIdHumidifier = LORA_EXECUTOR_HUMIDIFIER,
    .ucIdBuzzer     = LORA_EXECUTOR_BUZZER,
    .ucIdServo      = LORA_EXECUTOR_SERVO
};

static LoRaExecutorCmd_t xLoRaExecutorCommand = {
    .ucCommandOn     = LORA_EXECUTOR_COMMAND_ON,
    .ucCommandOff    = LORA_EXECUTOR_COMMAND_OFF,
};

void vLoRaConnectionPkt(uint8_t ucNodeId);
void vLoRaToGateIdPkt(uint8_t ucNodeId);
void vLoRaToGateSenIdPkt(uint8_t ucSensorId);
void vLoRaToGateExeIdPkt(uint8_t ucExecutorId);
eLoRaMsgRecStatus xLoRaMessageReceived(uint8_t *pucData);
eLoRaMsgRecStatus xLoRaMsgProcess(uint8_t ucDataRecNodeId, uint8_t ucDataRecExeId, uint8_t ucDataRecExeSta);

#endif
