//----------------------------------------------------------------------------------
// <copyright file="pib.h" company="LiquidRobotics">
//	Copyright (c) Liquid Robotics Corporation.  All rights reserved.
// </copyright>
//
// <summary>
// 	Prototypes and definitions for pib.c, which contains routines for controlling
//  features of the payload interfadce board
// </summary>
//
// <owner>Mike Cookson</owner>
//---------------------------------------------------------------------------------

#ifndef __PIB_H__
# define __PIB_H__

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>

// valid_pib_module(modNum) tests if the parameterized personality module number 
// is within range
# define valid_pib_module(modNum) 			(((modNum) >= 1) && (modNum <= 3))

// pib_module_mask(modNum) returns bit mask for a given module number; this mask
// is used by the macros below to affect bits in PORTL and to test the results
// in PORTK
# define pib_module_mask(modNum)			(8 << (modNum))

// pib_module_configure(modNum) sets the PORTL and PORTK configurations so that they
// can be used power/un-power personality modules and test for a power OK response
# define pib_module_configure(modNum) 		(DDRK &= ~pib_module_mask((modNum)), DDRL |= pib_module_mask((modNum)))

// pib_module_power_on(modNum) enables power to a given personality module (assumes
// pib_module_configure has already been invoked)
# define pib_module_power_on(modNum)		(PORTL |= pib_module_mask((modNum)))

// pib_module_power_off(modNum) disables power to a given personality module (assumes
// pib_module_configure has already been invoked)
# define pib_module_power_off(modNum)		(PORTL &= ~pib_module_mask((modNum)))

// pib_module_is_powered(modNum) tests for power OK from a given personality module;
// for example:
//
//		pib_module_configure(1);
//		pib_module_power_on(1);
//
//		if (pib_module_power_OK(1))
//		{
//			success case ...
//		}
//
//		else
//		{
//			failure case ...
//		}
# define pib_module_power_OK(modNum)		( !!(PINK & pib_module_mask((modNum))) )

// Function Prototypes

void DisableAllPIBModules();
BOOLEAN EnablePIBModule(uint8_t pibNum, BOOLEAN enablePIB, BOOLEAN detectEnable);


//Prototypes for EEPROM read and write functions
uint8_t EepromReadByte(void* eepromAddr, void* pData);
uint8_t EepromReadWord(void* eepromAddr, void* pData);
uint8_t EepromReadBlock(void* eepromAddr, void* pData, uint16_t length);

uint8_t EepromWriteByteSigned(void* eepromAddr, int8_t data);
uint8_t EepromWriteByteUnSigned(void* eepromAddr, uint8_t data);
uint8_t EepromWriteWordSigned(void* eepromAddr, int16_t data);
uint8_t EepromWriteWordUnSigned(void* eepromAddr, uint16_t data);
uint8_t EepromWriteBlock(void* eepromAddr, void* pData, uint16_t length);


//Generic Hi-Byte/Lo-Byte macros
#define MAKEWORD(a, b)      ((uint16_t)(((uint8_t)(((uint32_t)(a)) & 0xff)) | ((uint16_t)((uint8_t)(((uint32_t)(b)) & 0xff))) << 8))
#define MAKELONG(a, b)      ((uint32_t)(((uint16_t)(((uint32_t)(a)) & 0xffff)) | ((uint32_t)((uint16_t)(((uint32_t)(b)) & 0xffff))) << 16))
#define LOWORD(l)           ((uint16_t)(((uint32_t)(l)) & 0xffff))
#define HIWORD(l)           ((uint16_t)((((uint32_t)(l)) >> 16) & 0xffff))
#define LOBYTE(w)           ((uint8_t)(((uint32_t)(w)) & 0xff))
#define HIBYTE(w)           ((uint8_t)((((uint32_t)(w)) >> 8) & 0xff))

//Common Command Parser (not sensor specific parameters though)
char getCommand(char** myCommand, prog_char* cmdListLong_P, uint8_t cmdSize, uint8_t numCmds, prog_char* cmdList_P, char* pParserList);

#endif
