/*
 * lora_port.h
 *
 *  Created on: Oct 8, 2018
 *      Author: zgh
 */

#ifndef LORA_PROTOCOL_STACK_LORA_PORT_H_
#define LORA_PROTOCOL_STACK_LORA_PORT_H_

#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stropts.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include "radio.h"

#define LORA_CH_MAX 16

#define KEEPALIVE_REC	        500	/* default ms interval for continue mode  keep-alive */

#define TIMESLOT        130
#define TIME_SEND_MIN 	20
#define TIME_TR_MAX 	38//随机避峰时间
#define TIME_TD_MIN 	g_param_lora.rcv_timeout//接收延时//200

#define TIME_TR 		(TIMESLOT*(rand()%TIME_TR_MAX - 2) + TIME_SEND_MIN)
#define TIME_RETRY 		(TIMESLOT*(rand()%TIME_TR_MAX - 2) + TIME_SEND_MIN + TIME_TD_MIN)
//#define TIME_ACK_MAX 		(TIME_TD_MIN - 50)

#define IS_ACK_PACK(x) (x & 0x80)
#define SET_ACK_PACK(x) (x | 0x80)
#define CODE_MASK(x) (x & (~0x80))

typedef struct
{
	bool valid;
	int rssi;
	int snr;
    uint16_t crc;
	time_t time;
}lora_pkt_info_t;

//typedef void read_call(char *ptr,size_t size);
radiodev * LoRa_dev_init(void);

int LoRa_dev_close();

int LoRa_set_frq(uint32_t frq_band,uint32_t frq_code);

uint32_t LoRa_get_frq(uint32_t frq_band,uint32_t frq_code);

int LoRa_transfer(uint8_t *ptr,int size);

bool LoRa_received(void);

int LoRa_get_index(uint8_t *ptr,int *size,int index,lora_pkt_info_t *pkt_info);

int LoRa_get_first(uint8_t *ptr,int *size,lora_pkt_info_t *pkt_info);

void LoRa_WaitRx(void);

bool Lora_peek_and_compare(char *ptr,int len,int *index);

void LoRa_clean(int index);

#endif /* LORA_PROTOCOL_STACK_LORA_PORT_H_ */
