//----------------------------------------------------------------------------------
// <copyright file="FlPyldComms.h" company="LiquidRobotics">
//	Copyright (c) Liquid Robotics Corporation.  All rights reserved.
// </copyright>
//
// <summary>
// 	This is the header for managing communication between the PIB, Float, and 
//  other payloads daisychained off the PIB
// </summary>
//
// <owner>Jim Kirklin</owner>
//----------------------------------------------------------------------------------

#ifndef _FLOAT_COMMS_H_
#define _FLOAT_COMMS_H_


void FloatComms(void* pParam);

#define PM_COMM_NOT_USED	0
#define PM_STANDARD_COMM	1
#define PM_SMC_COMM			2

typedef struct _PYLD_COMMS_INIT_
{
	uint8_t		pmState[4];
}PYLD_COMMS_INIT, *PPYLD_COMMS_INIT;

typedef struct _FLOAT_TX_BUFFER_
{
	char bufFloat[310];
}FLOAT_TX_BUFFER, *PFLOAT_TX_BUFFER;

#define MAX_FLOAT_BUFFERS	8
#define MAX_ACK_BUFFERS		4

#define HDLC_SOF			0x7E
#define HDLC_ESC			0x7D
#define HDLC_EOF			0x7C
#define HDLC_TX_AND_MASK	0xDF
#define HDLC_RX_OR_MASK		0x20
#define HDLC_MAX_LENGTH		560


//Structures Common to Inbound and Outboud traffic
typedef struct _COMM_HEADER_
{
	uint8_t		type;
	uint32_t	packetID;
	uint16_t	size;
}COMM_HEADER, *PCOMM_HEADER;

//Payload Communication Wrappers and Definitions

typedef struct _LRI_COMM_WRAPPER_
{
//	uint8_t 	sof;
	uint16_t	length;
	uint16_t	destination;
	uint16_t	source;
	uint16_t	msgID;
	uint16_t	msgType;
}LRI_COMM_WRAPPER, *PLRI_COMM_WRAPPER;

typedef struct _LRI_GENERIC_NAK_
{
	uint16_t	originalCmd;
	uint8_t		nakSummary;
}LRI_GENERIC_NAK, *PLRI_GENERIC_NAK;

typedef struct _LRI_GENERIC_ACK_
{
	uint16_t	originalCmd;
}LRI_GENERIC_ACK, *PLRI_GENERIC_ACK;


typedef struct _LRI_FORWARD_INFO_
{
	uint8_t		msgFormat;
	uint16_t	destination;
	uint16_t	source;
}LRI_FORWARD_INFO, *PLRI_FORWARD_INFO;

typedef struct _LRI_REQUEST_ID_
{
	uint16_t	communicationProtocols;
	uint16_t	commandFormats;
}LRI_REQUEST_ID, *PLRI_REQUEST_ID;

typedef struct _LRI_ID_PACKET_
{
	uint16_t	version;
	uint16_t	deviceType;
	uint16_t	address;
	char		serialNum[6];
	uint8_t		port;
	uint32_t	pollingRate;
	uint8_t		extraInfo;	//Bit 0 = telemetry, Bit 1 = power, Bit 2 = evets, Bit 3 = Echoed ACKS
	uint8_t		firmwareMajor;
	uint8_t		firmwareMinor;
	uint16_t	firmwareRev;
	char		description[20];
}LRI_ID_PACKET, *PLRI_ID_PACKET;

typedef struct _LRI_ID_ACK_WRAPPER_
{
	uint16_t		totalNumber;
	uint16_t		numberOfReplies;
	LRI_ID_PACKET	firstID;
}LRI_ID_ACK_WRAPPER, *PLRI_ID_ACK_WRAPPER;

typedef struct _LRI_ACK_COUNT_WRAPPER_
{
	uint16_t		totalNumber;
	uint16_t		numberOfReplies;
}LRI_ACK_COUNT_WRAPPER, *PLRI_ACK_COUNT_WRAPPER;


typedef struct _LRI_TELEM_ACK_WRAPPER_
{
	uint16_t	numACKS;
	uint16_t	numDataWaiting;
	uint16_t	firstAddress;
}LRI_TELEM_ACK_WRAPPER, *PLRI_TELEM_ACK_WRAPPER;

typedef struct _LRI_REQUEST_PIB_STATUS_
{
	TIMESTAMP	timestamp;
	uint32_t	latitude;
	uint32_t	longitude;
	char		fixValid;
}LRI_REQUEST_PIB_STATUS, *PLRI_REQUEST_PIB_STATUS;

typedef struct _LRI_PIB_STATUS_
{
	uint16_t	version;	//Hi bit = Comand/Data Waiting
	uint16_t	address;	//PIB address
	uint16_t	alarms;
    uint8_t 	leak1;		//Leak Sensor 1 status
	uint8_t		leak2;		//Leak Sensor 2 status
	int8_t 		humidTemp;	//Temperature Form the Humidity Sensor (deg C)
	uint8_t 	humidity;	//Relative Humidity (%)
	int8_t 		presTemp;	//Temperature From the Pressure Sensor (deg C)
	uint8_t 	pressure;	//Pressure (kPa)
}LRI_PIB_STATUS, *PLRI_PIB_STATUS;

typedef struct _LRI_STATUS_ACK_WRAPPER_
{
	uint16_t		totalNumber;
	uint16_t		numberOfReplies;
	LRI_PIB_STATUS	firstStatus;
}LRI_STATUS_ACK_WRAPPER, *PLRI_STATUS_ACK_WRAPPER;

typedef struct _LRI_COMMAND_DATA_REQUEST_ACK_WRAPPER_
{
	uint16_t	commandFormat;
}LRI_COMMAND_REQUEST_ACK_WRAPPER, *PLRI_COMMAND_REQUEST_ACK_WRAPPER;

typedef struct _LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_
{
	uint8_t		structureType;
	uint16_t	size;
}LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER, *PLRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER;

typedef struct _LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_EXT
{
	COMM_HEADER headerICD;
}LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_EXT, *PLRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_EXT;

typedef struct _LRI_XBEE_DATA_REQUEST_ACK_WRAPPER_
{
	uint8_t		outputFormat;
	uint8_t		debugLevel;
	uint16_t	size;
}LRI_XBEE_DATA_REQUEST_ACK_WRAPPER, *PLRI_XBEE_DATA_REQUEST_ACK_WRAPPER;

typedef struct _LRI_FLOAT_COMMAND_ACK_WRAPPER_
{
	uint16_t	commandFormat;
	uint16_t	acknowledgementCode;
}LRI_FLOAT_COMMAND_ACK_WRAPPER, *PLRI_FLOAT_COMMAND_ACK_WRAPPER;

typedef struct _LRI_GENERIC_ACK_PACKET_
{
	LRI_COMM_WRAPPER	headers;
	LRI_GENERIC_ACK		ackInfo;
}LRI_GENERIC_ACK_PACKET, *PLRI_GENERIC_ACK_PACKET;

typedef struct _LRI_GENERIC_NAK_PACKET_
{
	LRI_COMM_WRAPPER	headers;
	LRI_GENERIC_NAK		nakInfo;
}LRI_GENERIC_NAK_PACKET, *PLRI_GENERIC_NAK_PACKET;


typedef struct _COMM_XBEE_DATA_XMIT_
{
	LRI_COMM_WRAPPER 						headers;
	LRI_GENERIC_ACK							ackInfo;
	LRI_XBEE_DATA_REQUEST_ACK_WRAPPER		debugInfo;
}COMM_XBEE_DATA_XMIT, *PCOMM_XBEE_DATA_XMIT;

typedef struct _DEBUG_MSG_OUTPUT_
{
	COMM_XBEE_DATA_XMIT	comm;
	uint8_t				msg[192];	
}DEBUG_MSG_OUTPUT, *PDEBUG_MSG_OUTPUT;

typedef struct _DEBUG_OUTPUT_INFO_
{
	char* 		pBuffer;
	uint8_t		lenBuffer;
	uint8_t		fmtBuffer;
	uint8_t		dbgLevel;
}DEBUG_OUTPUT_INFO, *PDEBUG_OUTPUT_INFO;

typedef struct _LRI_REQUEST_SERIAL_PORT_PASS_THROUGH_
{
	uint8_t		personalityModuleNumber;
	uint32_t	passThroughBaud;
	uint8_t		passThroughParity;
	uint8_t		passThroughDataBits;
	uint8_t		passThroughStopBits;
}LRI_REQUEST_SERIAL_PORT_PASS_THROUGH, *PLRI_REQUEST_SERIAL_PORT_PASS_THROUGH;

//Payload Buffer Sizes
#define PAYLOAD_RX_BUF_SIZE 556
#define PAYLOAD_TX_BUF_SIZE 556

//Payload Serial Port ID's
#define PAYLOAD_PORT_1	8
#define PAYLOAD_PORT_2	9

#define PAYLOAD_COMM_TIMEOUT	4

//Broadcast Addresses
#define ALL_BOARDS		0xFF00
#define	ALL_TASKS		0x00FF
#define	BROADCAST		0xFFFF

//Task ID's for Float C&C
#define FLOAT_BOARD_ADDRESS			0x0000

#define	FLOAT_COMMAND_INTERFACE		0x0001
#define FLOAT_IRIDIUM_INTERFACE		0x0002
#define FLOAT_DEBUG_INTERFACE		0x0003
#define FLOAT_FS_INTERFACE			0x0005
#define FLOAT_DATA_INTERFACE		0x0010
#define	FLOAT_TASK_COMMAND_INTERFACE	0x0001
#define FLOAT_TO_SHORE_VIA_DEFAULT		0x0002
#define FLOAT_TASK_DEBUG_INTERFACE		0x0003
#define FLOAT_TASK_FS_INTERFACE			0x0005
#define FLOAT_TO_SHORE_VIA_IRIDIUM		0x000A
#define FLOAT_TO_SHORE_VIA_XBEE			0x000B
#define FLOAT_TASK_DATA_INTERFACE		0x0010
#define FLOAT_TASK_FORWARD_MESSAGE		0x0020

#define DEBUG_ASCII					0
#define DEBUG_HEX					1

//Message Formats when sending unsolicited messages to various components
#define MSG_FORMAT_SHORE_TO_SHIP	1
#define MSG_FORMAT_SHIP_TO_SHORE	2
//#define MSG_FORMAT_PAYLOAD_MSG		3

//Communication Protocols
#define PROTOCOL_1					0x0001

//Command Formats
#define IRIDIUM_SHIP_SHORE_ICD		0x0001

//Command ACK/NAK indicators
#define	CMD_ACK						0x0000
#define CMD_NAK_CMD					0x0001
#define CMD_NAK_DATA				0x0002
#define CMD_NAK_UNABLE_COMPLETE		0x0003
#define CMD_NAK_UNKNOWN_FORMAT		0x0004

//File System Types
#define ACK_WITH_LIST_DETAILED		0x1C
#define ACK_WITH_FILE_LIST			0x31
#define NEW_FILE_AVAILABLE			0x60

//Message Types
#define LRI_NAK							0x0000
#define LRI_ACK							0x0001
#define	REQUEST_ID						0x0010
#define FLOAT_TELEMETRY_DATA			0x0015
#define REQUEST_PIB_STATUS				0x0022
#define SEND_FORWARD_MSG				0x0024
#define SEND_FWD_ICD_CMD			    0x0024
#define POWER_NOTIFICATION				0x0030
#define REQUEST_WAITING_PACKET			0x0040
#define ACK_REQUESTED_PACKET			0x0041

//Used for direct communication with a sensor on a personality
//Reset to normal operation requires a reboot of the PIB (power cycle the board)
#define REQUEST_SERIAL_PORT_PASS_THRU	0x0FAD


//Custom Messages
#define MSG_PYLD_MGR_ENUMERATE			0x80000100
#define MSG_PYLD_MGR_CLR_ENUMERATE		0x80000101
#define MSG_PYLD_MGR_FLOAT_TELEM		0x80000200
#define MSG_PYLD_MGR_STATUS_REQ			0x80000300
#define MSG_PYLD_MGR_PACKET_REQUEST		0x80000400
#define MSG_PYLD_MGR_COMMAND_ACK		0x80000410
#define MSG_PYLD_MGR_ADD_COMMAND_ACK	0x80000411



//Nak Dispositions
#define	NAKDISP_SUCCEEDED			(3)				// this item succeeded, other items failed
#define	NAKDISP_DATA				(5)				// something was wrong with the data
#define	NAKDISP_FILE_IN_USE			(7)				// file exists and is in use
#define	NAKDISP_WOULD_OVERWRITE		(8)				// file exists (new file would overwrite)
#define	NAKDISP_READ_ONLY			(9)				// file is marked as read-only
#define	NAKDISP_MISSING_STORAGE		(10)			// storage device is missing, cannot be mounted
#define	NAKDISP_CRC_FAILED			(11)			// calculated CRC of file content does not match provided number
#define	NAKDISP_MD5_FAILED			(12)			// calculated MD5 of file content does not match provided signature
#define	NAKDISP_STORAGE_FULL		(13)			// storage device is full
#define	NAKDISP_STORAGE_IO_ERROR	(14)			// there was a problem talking to the storage device
#define	NAKDISP_BAD_FILE_CONTROL_BLOCK (15)			// there is a problem with the control blocks that describe the file
#define	NAKDISP_BAD_PROG_SELECT		(16)			// there is a problem with the configuration of program selection
#define	NAKDISP_TOO_MANY_COMMANDS	(17)			// there are too many active commands


// structure that holds a MD5 signature
typedef struct _MD5_
{
	uint8_t		data[16];
}MD5, *PMD5;


////Structures Common to Inbound and Outboud traffic
//typedef struct _COMM_HEADER_
//{
//	uint8_t		type;
//	uint32_t	packetID;
//	uint16_t	size;
//}COMM_HEADER, *PCOMM_HEADER;




#define IPIB_SECURE_ON				0x2000
#define IPIB_SECURE_AUTHENTICATE	0x2001
#define IPIB_SECURE_REGISTER_CLIENT	0x2002
#define IPIB_SECURE_FAILED			0x2003
#define IPIB_SECURE_OFF				0x2004
#define IPIB_SECURE_HW_ID			0x2005
#define IPIB_SECURE_ON_2			0x2006
#define IPIB_SECURE_GET_COUNT		0x2007

#define IPIB_ENCRYPT_DECRYPT_PACKET	0x2010

#define IPIB_ENCRYPT_DECRYPT_BLOCK_DOWN_START	0x2020
#define IPIB_ENCRYPT_DECRYPT_BLOCK_DOWN			0x2021
#define IPIB_ENCRYPT_DECRYPT_BLOCK_DOWN_END		0x2022

#define IPIB_ENCRYPT_DECRYPT_BLOCK_UP_START		0x2030
#define IPIB_ENCRYPT_DECRYPT_BLOCK_UP			0x2031
#define IPIB_ENCRYPT_DECRYPT_BLOCK_UP_END		0x2032

#define IPIB_SECURE_REBOOT			0x2FFF




//Structures used to describe inbound traffic (Shore to Ship)
typedef struct _CMD_FMT_10_
{
	uint8_t		field3;
	uint8_t		field4;
	uint8_t		field5;
	uint8_t		field6;
	uint8_t		field7;
	uint32_t	latitude;
	uint32_t	longitude;
	uint16_t	crc;
}CMD_FMT_10, *PCMD_FMT_10;

typedef struct _CMD_FMT_18_
{
	uint16_t	storageControllerAddress;
	char		fileName[11];
	uint32_t	fileID;
	uint32_t	fileSize;
	DATE_TIME	creationDate;
	DATE_TIME	modifiedDate;
	uint8_t		fileAttributes;
	uint8_t		overwriteFile;
	uint16_t	contentCRC;
	MD5			contentMD5;
	uint16_t	numDataBytes;
	uint8_t		data[1];
}CMD_FMT_18, *PCMD_FMT_18;

typedef struct _CMD_FMT_19_
{
	uint16_t	storageControllerAddress;
	uint32_t	fileID;
	uint32_t	offset;
	uint16_t	numDataBytes;
	uint8_t		data[1];
}CMD_FMT_19, *PCMD_FMT_19;

typedef struct _CMD_FMT_1A_
{
	uint16_t	storageControllerAddress;
	char		fileName[11];
	uint32_t	fileID;
	uint8_t		overrideReadOnly;
}CMD_FMT_1A, *PCMD_FMT_1A;

typedef struct _CMD_FMT_1B_
{
	uint16_t	storageControllerAddress;
	char		fileName[11];
	uint32_t	originalTransactionID;
	uint32_t	offset;
	uint32_t	readLength;
	uint16_t	maxResponseSize;
}CMD_FMT_1B, *PCMD_FMT_1B;

typedef struct _CMD_FMT_1C_
{
	uint16_t	storageControllerAddress;
	char		fileName[11];
	uint32_t	fileID;
	uint8_t		actionFlags;
	uint16_t	maxResponseSize;
}CMD_FMT_1C, *PCMD_FMT_1C;

typedef struct _CMD_FMT_1E_
{
	uint16_t dest;
	uint8_t function;
	uint16_t dataLength;
	char consoleData[1];
}CMD_FMT_1E, *PCMD_FMT_1E;

typedef CMD_FMT_1C CMD_FMT_31, *PCMD_FMT_31;


////Structures Common to Inbound and Outboud traffic
//typedef struct _COMM_HEADER_
//{
//	uint8_t		type;
//	uint32_t	packetID;
//	uint16_t	size;
//}COMM_HEADER, *PCOMM_HEADER;
	
typedef struct _CMD_FMT_COMMON_
{
	uint8_t		fmtID;
	uint16_t	command;
}CMD_FMT_COMMON, *PCMD_FMT_COMMON;


//NAK Summary Codes
#define NAKSUMMARY_UNKNOWN_RECIPIENT			0x00
#define NAKSUMMARY_UNKNOWN_COMMAND				0x01
#define NAKSUMMARY_INVALID_DATA					0x02
#define NAKSUMMARY_DEVICE_NOT_FOUND				0x03
#define NAKSUMMARY_PROGRAM_DOWNLOAD				0x04
#define NAKSUMMARY_REQUEST_POWER_CYCLE			0x05
#define NAKSUMMARY_REQUEST_POWER_OFF			0x06

#define SHIP_SHORE_ICD		0x0001
#define EXECUTE_CMD			1
#define INFORMATION			0

typedef struct _PYLD_MGR_FILE_RX_BUFFER_
{
//	LRI_COMM_WRAPPER	wrapper;
//	COMM_HEADER		header;
//	CMD_FMT_COMMON	type;
	LRI_COMM_WRAPPER	wrapper;
	uint8_t		flagSendFwd;
	uint16_t	cmdFormat;
	COMM_HEADER		header;
	CMD_FMT_COMMON	type;
	union
	{
		CMD_FMT_10  command;
		CMD_FMT_18  initFileWrite;
		CMD_FMT_19  writeFile;
		CMD_FMT_1A  deleteFile;
		CMD_FMT_1B  readFile;
		CMD_FMT_1C  getFileListDetailed;
		CMD_FMT_1E  consoleInput;
		CMD_FMT_31  getFileList;
	};
}PYLD_MGR_FILE_RX_BUFFER, *PPYLD_MGR_FILE_RX_BUFFER;

typedef struct _ACK_PYLD_POWER_NOTIFICATION_RECORD_
{
	uint16_t	address;
	uint8_t		boardID;
	uint8_t		state;
	uint8_t		delayOff;
	uint8_t		delayOn;
}ACK_PYLD_POWER_NOTIFICATION_RECORD, *PACK_PYLD_POWER_NOTIFICATION_RECORD;

// Supported Level 2 Packet Types
#define RCV_CMD					0x0A

// Supported Command Structure Types
#define FMT_RCV_CMD				0x10

// Supported Level 1 Commands
#define FILE_INIT_WRITE				0x9000
#define FILE_WRITE_BLOCK			0x9001
#define FILE_DELETE					0x9002
#define FILE_READ_BLOCK				0x9003
#define FILE_GET_DETAIL				0x9004
#define CMD_SELECT_PROGRAM		0x9005
#define FILE_GET_INFO				0x9008

#define CMD_WRITE_CNSL_CMD_ASCII	0x9100
#define CMD_WRITE_CNSL_CMD_BINARY	0x9101

// Structure of array of program selections
typedef struct _FT_PROGSEL_ITEM_
{
	uint8_t		operation;					// 0: setting fallback image, 1: setting tentative selected image, 2: setting both
	uint32_t	fileID;						// the file ID being selected
	uint16_t	boardAddress;				// the board address for which to assocate an entry
	uint16_t	spare;						// (not used)
}FT_PROGSEL_ITEM, *PFT_PROGSEL_ITEM;

typedef struct _PIB_IRIDIUM_DATA_XMIT_
{
	LRI_COMM_WRAPPER 						headers;
	LRI_GENERIC_ACK							ackInfo;
	LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER	iridiumInfo;
}PIB_IRIDIUM_DATA_XMIT, *PPIB_IRIDIUM_DATA_XMIT;

typedef struct _PIB_IRIDIUM_DATA_XMIT_EXT
{
	LRI_COMM_WRAPPER 							headers;
	LRI_GENERIC_ACK								ackInfo;
	LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_EXT	iridiumInfo;
}PIB_IRIDIUM_DATA_XMIT_EXT, *PPIB_IRIDIUM_DATA_XMIT_EXT;

typedef struct _PIB_DATA_FORWARD_MESSAGE_
{
	LRI_COMM_WRAPPER 							headers;
	LRI_GENERIC_ACK								ackInfo;
	LRI_FORWARD_INFO							fwdInfo;
	LRI_IRIDIUM_DATA_REQUEST_ACK_WRAPPER_EXT	iridiumInfo;
}PIB_DATA_FORWARD_MESSAGE, *PPIB_DATA_FORWARD_MESSAGE;


#define MAX_FILE_SIZE_IN	256
#define MAX_FILE_SIZE_OUT	1024

typedef struct _CONSOLE_CMD_FORMAT_
{
	uint16_t	cmdSrcAddress;
	uint8_t		functionCode;
	uint16_t	cmdSize;
	uint32_t	id;
	char		cmd[MAX_FILE_SIZE_IN];
}CONSOLE_CMD_FORMAT, *PCONSOLE_CMD_FORMAT;

#define ACK_CONSOLE_DATA	0x3D
#define NACK_CONSOLE_DATA	0x26




typedef struct _ACK_FILE_LIST_COMMON_HEADER_
{
	uint16_t	storageControllerAddress;	// storage controller address from request
	uint16_t	offset;				// number of files reported before this
	uint8_t		lastReport;			// 0 = not last report, 0xFF = last report
	uint16_t	numFiles;			// number of files in this message
}ACK_FILE_LIST_COMMON_HEADER, *PACK_FILE_LIST_COMMON_HEADER;

typedef struct _ACK_FILE_LIST_RECORD_
{
	char		fileName[11];		// padded file name
	uint32_t	fileID;				// ID of file
	uint32_t	fileSize;			// size of file
	uint8_t		fileAttributes;		// attributes of file
}ACK_FILE_LIST_RECORD, *PACK_FILE_LIST_RECORD;

typedef struct _ACK_FILE_LIST_
{
	ACK_FILE_LIST_COMMON_HEADER common;
	ACK_FILE_LIST_RECORD records[1];
	uint16_t	crc;
}ACK_FILE_LIST, *PACK_FILE_LIST;

typedef struct _ACK_FILE_LIST_DETAILED_RECORD_
{
	char		fileName[11];		// padded file name
	uint32_t	fileID;				// ID of file
	uint32_t	fileSize;			// size of file
	DATE_TIME	creationDate;		// creation date from file
	DATE_TIME	modifiedDate;		// modified date from file
	uint8_t		fileAttributes;		// attributes of file
	uint16_t	providedCRC;		// CRC provided at initialization
	MD5			providedMD5;		// MD5 provided at initialization
	uint16_t	calculatedCRC;		// CRC calculated at last check
	MD5			calculatedMD5;		// MD5 calculated at last check
}ACK_FILE_LIST_DETAILED_RECORD, *PACK_FILE_LIST_DETAILED_RECORD;

typedef struct _ACK_FILE_LIST_DETAILED_
{
	ACK_FILE_LIST_COMMON_HEADER common;
	ACK_FILE_LIST_DETAILED_RECORD records[1];
	uint16_t	crc;
}ACK_FILE_LIST_DETAILED, *PACK_FILE_LIST_DETAILED;

typedef struct _ACK_NEW_FILE_AVAILABLE_
{
	uint16_t	storageControllerAddress;	// storage controller reporting new file
	char		fileName[11];		// padded file name
	uint32_t	fileSize;			// size of file
	DATE_TIME	creationDate;		// creation date from file
	DATE_TIME	modifiedDate;		// modified date from file
	uint8_t		fileAttributes;		// attributes of file
	uint16_t	providedCRC;		// CRC provided at initialization
	MD5			providedMD5;		// MD5 provided at initialization
	uint16_t	calculatedCRC;		// CRC calculated at last check
	MD5			calculatedMD5;		// MD5 calculated at last check
	uint16_t	crc;
}ACK_NEW_FILE_AVAILABLE, *PACK_NEW_FILE_AVAILABLE;

typedef struct _FS_REPORT_
{
	LRI_COMM_WRAPPER 		headers;
	LRI_GENERIC_ACK			ackInfo;
	uint8_t					type;
	union
	{
		ACK_NEW_FILE_AVAILABLE	newFile;
		ACK_FILE_LIST			fileSummary;
		ACK_FILE_LIST_DETAILED	fileDetail;
	};
}FS_REPORT, *PFS_REPORT;

typedef struct _CONSOLE_ACK_
{
	uint8_t		format;
	uint8_t		disposition;
	uint16_t	len;
}CONSOLE_ACK, *PCONSOLE_ACK;

typedef struct _CONSOLE_NACK_
{
	uint16_t	numDispositions;
	uint8_t		disposition[1];
}CONSOLE_NACK, *PCONSOLE_NACK;

typedef struct _CONSOLE_ACK_XMIT_
{
	PIB_IRIDIUM_DATA_XMIT_EXT	comm;
	union
	{
		CONSOLE_ACK		consoleAck;
		CONSOLE_NACK	consoleNack;
	};
}CONSOLE_ACK_XMIT, *PCONSOLE_ACK_XMIT;

typedef struct _CONSOLE_ACK_XMIT_2_
{
	PIB_DATA_FORWARD_MESSAGE	comm;
	union
	{
		CONSOLE_ACK		consoleAck;
		CONSOLE_NACK	consoleNack;
	};
}CONSOLE_ACK_XMIT_2, *PCONSOLE_ACK_XMIT_2;

uint8_t SendDebugMsg(PDEBUG_OUTPUT_INFO pDbgInfo);

uint8_t FloatCommsParseCommand(char command, char* myCommand, char* response);

#define MAX_TOKEN_SEPARATORS 20

#endif	//_FLOAT_COMMS_H_
