新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2019-2-28
- 在线时间
- 3 小时
|

楼主 |
发表于 2022-6-28 09:09:58
|
显示全部楼层
本帖最后由 jiaoyubo12 于 2022-6-28 09:50 编辑
static t_err a_01_GameCtrlMsg(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
register t_ureg_opt r;
register t_err err;
if(nBytes == 0) {
// 返回帧错误
return ERR_FrameError;
}
err = ERR_NONE;
r = pFrame->u08[0];
return err;
}
/* 0x02: a_OddsMsg: 押分赢分倍率回复 */
static t_err a_02_OddsMsg(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
return ERR_NONE;
}
/* 0x03: a_GameResult: 收到分机押分结束 */
static t_err a_03_GameResult(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
// SETBITs(g_PlayerWager[iPlayer].Flag, PLAYER_FLGMSK_WagerEnd);
return ERR_NONE;
}
/* 0x04: a_PlayerPoint: 收到分机回复本局赢利 */
static t_err a_04_PlayerWinBet(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
// SETBITs(g_PlayerWager[iPlayer].Flag, PLAYER_FLGMSK_Over);
return ERR_NONE;
}
/* 接收返回消息 */
/* 0x21: c_InitDataRequest:向主板请求初始数据 */
static t_err c_21_InitDataRequest(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
// 初始数据
register uint8 *pSend = (uint8 *)&SendBuf;
register t_ureg_opt i, j;
// register T_PlayerWager *pPlayerWager;
t_ureg_opt N;
t_err err;
// pPlayerWager = &g_PlayerWager[iPlayer];
// 发送第0段初始化数据
// ((T_FrmInitData0 *)pSend)->Seg = 0x00; // 第0段标记
// ((T_FrmInitData0 *)pSend)->WagerSec = g_Param.GambleParam.WagerSec; // 押分时长
// ((T_FrmInitData0 *)pSend)->WagerRate = pPlayerWager->WagerRateIndex; // 押分倍率
// ((T_FrmInitData0 *)pSend)->Stake = *((uint24 *)&pPlayerWager->Stake); // 赌金
// err = SendToPlayer(iPlayer, FRM_T_InitDataRequest, (t_frame *)pSend, sizeof(T_FrmInitData0));
// 发送后续各项押分值
i = 0;
j = 0;
while(i < BET_ITEMS)
{
// ((T_FrmInitData0 *)pSend)->Seg = ((BET_ITEMS+1)/2 << 4) | ((i >> 1) + 1); // 计算总段数(高四位),当前段号(低四位)
// N = sizeof(((T_FrmInitData1 *)pSend)->Seg);
for(j = 0; j< 2; j++)
{
// ((T_FrmInitData1 *)pSend)->Bet[j].index = i+1; // 项分项索引
// ((T_FrmInitData1 *)pSend)->Bet[j].Bet = pPlayerWager->Bet;// 第j项押分项值
// N += sizeof( ((T_FrmInitData1 *)pSend)->Bet[0] );
i++;
if(i == BET_ITEMS){
break; /* break: for(j = 0; j< 2; j++) */
}
}
// err = SendToPlayer(iPlayer, FRM_T_InitDataRequest, (t_frame *)pSend, nBytes);
}
// 设置分机初始化完成标志
// SETBITs(pPlayerWager->Flag, PLAYER_FLGMSK_InitOK);
return err;
}
typedef t_err t_frameHandler(register uint8, t_frame *, t_ureg_opt);
static const void *r_0x_HandlerTbl[] =
{NULL, a_01_GameCtrlMsg, a_02_OddsMsg, a_03_GameResult,
/* 0 1 2 3 */
a_04_PlayerWinBet
/* 4 5 6 7 */
/* 8 9 10 11 */
/* 12 13 14 15 */
};
static const void *r_2x_HandlerTbl[] =
{NULL, c_21_InitDataRequest, c_22_WagerEvent, c_23_WagerCtrlMsg,
/* 0 1 2 3 */
c_24_BetMsg, c_25_FuncKeyMsg1, NULL, NULL,
/* 4 5 6 7 */
NULL, NULL, c_2A_ErrorData
/* 8 9 A 11 */
/* 12 13 14 15 */
};
void CAN1_SWI_Handler (void)
{
#define _DbgCanMsg_ _DbgPrintf_
#define _DbgCanMsgLcd_ _DbgLcdPrintf_
// CAN接收到数据后先压入FIFO,然后触发该中断服务对应的软件中断
static T_CanFrame CanFrame = {0, };
t_err err;
//uint8 DstMAC;
register uint8 PlayerID;
register T_FRM_Type type;
register uint32 r;
register void *p;
// 清除中断
CAN1_SWI_ClrInt();
// 读取CAN帧
while(1)
{
_DbgCanMsg_(( "CAN.SWI:" ));
CanFrame.Data.u32[0] = 0x00000000;
CanFrame.Data.u32[1] = 0x00000000;
err = CAN_ReadFrame(&CanFrame);
if(err != QUEUE_OK)
{
break; /* break: while(1) */
}
r = CanFrame.IxR >> FRM_ID_LShitBITn;
/* 已由CAN进行硬件过滤,不用再判断
DstMAC = (r >> FRM_DST_MAC_BITn) & FRM_DST_MAC_Msk;
if(DstMAC != GET_LOAL_MAC())
{
break;
}*/
PlayerID = (r >> FRM_SRC_MAC_BITn) & FRM_SRC_MAC_Msk; /* SrcMAC已进行过滤,不用判断 */
PlayerID--; /* 转换为以零开始的index */
type = (r >> FRM_ID_TYPE_BITnL) & FRM_ID_TYPE_Msk;
_DbgCanMsg_(( "ID:%08X,[%u]:%02X,%02X %02X\r\n", r, PlayerID, type, CanFrame.Data.u08[0], CanFrame.Data.u08[1] ));
_DbgCanMsgLcd_(( 0,0, "ID[%u]:%02X ", PlayerID, type ));
_DbgCanMsgLcd_(( 1,0, "%02X %02X ", CanFrame.Data.u08[0], CanFrame.Data.u08[1] ));
if(PlayerID < FRM_PLAYER_MAC_BASE)
{
_DbgCanMsg_(( "CIdErr0!\r\n" ));
return;
}
PlayerID -= FRM_PLAYER_MAC_BASE;
if(PlayerID >= MAX_PLAYER)
{
_DbgCanMsg_(( "CIdErr1!\r\n" ));
return;
}
// if(type == FRM_T_WagerEvent)
// {
// // 押分消息优先处理
// err = c_22_WagerEvent(PlayerID, (t_frame *)&CanFrame.Data,
// CanFrame.DTxR & 0xFF);
// }
// else
{
p = NULL;
r = type & 0xF0;
type &= 0x0F;
if((r == 0x20) && (type < lenof(r_2x_HandlerTbl)))
{
p = r_2x_HandlerTbl;
}
else if((r == 0x20) && (type < lenof(r_0x_HandlerTbl)))
{
p = r_0x_HandlerTbl;
}
if(p != NULL)
{
err = ((t_frameHandler *)p)(PlayerID, (t_frame *)&CanFrame.Data,
CanFrame.DTxR & 0xFF);
}else{
err = ERR_UndefPlayerData;
}
}
}
}
|
|