
#ifndef __EXTENDBOARDS_H__
#define	__EXTENDBOARDS_H__

//------------------------------------------------------------------------------------

// 管理主控通过控制总线控制的外围板卡

//------------------------------------------------------------------------------------

#include "corecontrol.h"
#include "headcontrol.h"
#include "colorcontrol.h"
#include "extiocontrol.h"
#include "sewhdcontrol.h"
#include "transdata.h"
#include "operator.h"

//------------------------------------------------------------------------------------

#define	BN_ID_CORE_1		0x01
#define	BN_ID_CORE_2		0x02
#define	BN_ID_CORE_3		0x03

//------------------------------------------------------------------------------------

#ifndef MAX_SUPPORT_CORE
#define	MAX_SUPPORT_CORE		1
#endif

#ifndef CUR_COREBOARD_ID
#define CUR_COREBOARD_ID		BN_ID_CORE_1
#endif

#ifndef CUR_CORE_IDX
#define	CUR_CORE_IDX			0
#endif

//------------------------------------------------------------------------------------

#ifndef RD_HEAD_PARA_NUM
#define RD_HEAD_PARA_NUM	0
#endif

#ifndef MAX_SUPPORT_HEAD
#define MAX_SUPPORT_HEAD	0
#endif

//------------------------------------------------

#ifndef MAX_SUPPORT_SEWHD
#define MAX_SUPPORT_SEWHD	0
#endif

#ifndef MAX_SUPPORT_COLOR
#define MAX_SUPPORT_COLOR		0
#endif

#ifndef MAX_SUPPORT_EXTIO
#define MAX_SUPPORT_EXTIO		0
#endif

#ifndef HEAD_NODEID_BASE
#define HEAD_NODEID_BASE		21			// 机头板起始ID
#endif

#ifndef COLOR_NODEID_BASE
#define COLOR_NODEID_BASE		18			// 换色板起始ID
#endif

#ifndef EXTIO_NODEID_BASE
#define EXTIO_NODEID_BASE		2			// IO扩展板起始ID
#endif

#ifndef SEWHD_NODEID_BASE
#define SEWHD_NODEID_BASE		21			// 机头板起始ID
#endif
//------------------------------------------------------------------------------------
#define BOARD_PARA_SIZE		256	// 暂定256个字节(一个参数块的大小)

//------------------------------------------------------------------------------------
void InitBoardsList(void);
void InitExtendBoards(void);
void InputsTask(void);
void OutputsTask(void);
void ExtendBoardTask(void);

//------------------------------------------------------------------------------------

CoreControl * GetCoreFromList(u8 id);
HeadControl * GetHeadFromList(u8 id);
ColorControl * GetColorFromList(u8 id);
ExtIOControl * GetExtIOFromList(u8 id);

int GetCurBoardID(void);

//------------------------------------------------------------------------------------
#if (MAX_SUPPORT_CORE > 0)

int IsNewControlCommand(void);
void RequestExStatus(void);

#endif

//------------------------------------------------------------------------------------

void StartBoardUpdate(u8 protocol, u8 nodetype, u8 nodeid);
void SetBoardNvPara(int protocolType, int nodetype, int nodeId, u8 parablockID, u8 paraID, s32 paraVal);

//------------------------------------------------------------------------------------
#if (MAX_SUPPORT_HEAD > 0)
// 遍历功能相关
void EnterTraverse(void);
int TraverseSingleNode(u8 traNodeType, u8 traNodeId);					// 总线遍历
int CurNodeTraverseAlready(u32 nodeid);
void ExitTravers(void);														// 退出遍历
void InquireBusSta(int idx);

u32 GetHeadStatus(int idx);
void CleanHeadStatus(int idx);
void RequestHeadsStatus(void);

void RequestHeadsVersion(void);
void RequestAHeadNvPara(int idx);

void SendHeadAngCmd(int idx, u8 para1, u16 para2, u8 para3);
void SetHeadNvParaCmd(int nodetype, int idx, u8 parablockid, u8 paraid, s32 paraval);

u16 GetHeadPotValue(int idx);
int GetHeadCurrentNeele(int idx);
#endif

#if (MAX_SUPPORT_COLOR > 0)

void RequestColorsVersion(void);
void RequestAColorNvPara(int idx);

void SendColorCtrlCmd(int idx, u8 subcmd, u8 para1, u8 para2);	// 换色板控制命令
void SetColorNvParaCmd(int idx, u8 parablockid, u8 paraid, s32 paraval);
void SendColorParaCmd(int idx, u8 para1);

void CleanColorSta(int idx);
u16 GetColorStatus(int idx);
u16 GetColorPotValue(int idx);
int GetColorCurrentNeele(int idx);
void RequestColorsStatus(void);

#endif

#if (MAX_SUPPORT_EXTIO > 0)
u16 GetExtIOStatus(int idx);
void CleanExtIOStatus(int idx);
void RequestExtIOsStatus(void);

void RequestExtIOsVersion(void);

void SetExtOutputOn(int idx, u16 bit);
void SetExtOutputOff(int idx, u16 bit);

#endif

#if (MAX_SUPPORT_SEWHD > 0)
void RequestSewHeadsStatus(void);
void RequestSewHeadsVersion(void);
u16 GetSewHeadStatus(int idx);
void SendSewHeadCtrlCmd(int idx, u8 subcmd, u8 para1, u8 para2);
void CleanSewHeadSta(int idx);
#endif

#if (RD_HEAD_PARA_NUM > 0)

int ReceiveBoardNvParaProc(CanRxMsg rxMsg, int id, u8 nodetype);
u8* GetBoardNvPara(int id);

#endif

void ParaDataFromOperToCan(u8 protocol, OperPacket * pPkt, BoardFilePacketCtrl * pBoard);
void SendPacketDataWithCanFrame(u32 exid, BoardFilePacketCtrl * pBoard);

s32 GetHeadPara(void);

//------------------------------------------------------------------------------------

#endif /* __EXTENDBOARDS_H__ */
