You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
9.8 KiB

////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "../app/task_game.h"
#include "../bsp/bsp_oid.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../msp/uart3.h"
#include "../bsp/bsp_WT2605B.h"
// 系统不识别的码:无效码 0x3FFF,0x0000
// 支持码:本游戏支持的
// 正确码和错误码:单个游戏内的
// 游戏标识码
// 游戏内容码
S_TASK_GAME _s_task_game;
#define GAME_OID_ZBT 0x3133
#define GAME_OID_SHERT 0x3142
#define GAME_OID_ZMG 0x3152
#define EEROR_OID 0x3FFF //无效码
#define GAME_MAX_SECONDS 600
void L3_task_game_init(void)
{
U8 i = 0;
U8 j = 0;
L1_task_init(&_s_task_game.task);
L3_task_s_go(_s_task_game,D_task_init);
_s_task_game.read_oid = 0;
_s_task_game.error_oid = EEROR_OID;
_s_task_game.game_maxseconds = GAME_MAX_SECONDS;
for (i = 0; i < game_num_max; i++)
{
_s_task_game.game_info[i].game_oid = 0;
for (j = 0; j < game_supported_oid_max; j++)
{
_s_task_game.game_info[i].game_supported_oid[j].oid = 0;
_s_task_game.game_info[i].game_supported_oid[j].yes_or_no = 1;
_s_task_game.game_info[i].game_supported_oid[j].point_audio = NULL;
_s_task_game.game_info[i].game_supported_oid[j].handled = 0;
}
}
_s_task_game.game_info[0].game_oid = GAME_OID_ZBT;
_s_task_game.game_info[0].game_audio = &audio_game_different;
_s_task_game.game_info[0].game_supported_oid[0].oid = 0x3135;
_s_task_game.game_info[0].game_supported_oid[1].oid = 0x3136;
_s_task_game.game_info[0].game_supported_oid[2].oid = 0x3137;
_s_task_game.game_info[0].game_supported_oid[3].oid = 0x3138;
_s_task_game.game_info[0].game_supported_oid[4].oid = 0x3178;
_s_task_game.game_info[0].game_supported_oid[4].yes_or_no = 0;
_s_task_game.game_info[0].game_order = 0;
_s_task_game.game_info[0].game_order_index = 0;
_s_task_game.game_info[0].game_timeout_seconds = 600;
_s_task_game.game_info[0].game_score = 0;
_s_task_game.game_info[1].game_oid = GAME_OID_SHERT;
_s_task_game.game_info[1].game_audio = &audio_game_shulte;
_s_task_game.game_info[1].game_supported_oid[0].oid = 0x3144;
_s_task_game.game_info[1].game_supported_oid[1].oid = 0x3145;
_s_task_game.game_info[1].game_supported_oid[2].oid = 0x3146;
_s_task_game.game_info[1].game_supported_oid[3].oid = 0x3147;
_s_task_game.game_info[1].game_supported_oid[4].oid = 0x3148;
_s_task_game.game_info[1].game_supported_oid[5].oid = 0x3149;
_s_task_game.game_info[1].game_supported_oid[6].oid = 0x314A;
_s_task_game.game_info[1].game_supported_oid[7].oid = 0x314C;
_s_task_game.game_info[1].game_supported_oid[8].oid = 0x314D;
_s_task_game.game_info[1].game_supported_oid[9].oid = 0x314E;
_s_task_game.game_info[1].game_supported_oid[10].oid = 0x3159;
_s_task_game.game_info[1].game_supported_oid[11].oid = 0x315A;
_s_task_game.game_info[1].game_supported_oid[12].oid = 0x315B;
_s_task_game.game_info[1].game_supported_oid[13].oid = 0x315C;
_s_task_game.game_info[1].game_supported_oid[14].oid = 0x315D;
_s_task_game.game_info[1].game_supported_oid[15].oid = 0x315E;
_s_task_game.game_info[1].game_supported_oid[16].oid = 0x3167;
_s_task_game.game_info[1].game_supported_oid[17].oid = 0x3168;
_s_task_game.game_info[1].game_supported_oid[18].oid = 0x3169;
_s_task_game.game_info[1].game_supported_oid[19].oid = 0x316A;
_s_task_game.game_info[1].game_supported_oid[20].oid = 0x316B;
_s_task_game.game_info[1].game_supported_oid[21].oid = 0x316C;
_s_task_game.game_info[1].game_supported_oid[22].oid = 0x3175;
_s_task_game.game_info[1].game_supported_oid[23].oid = 0x3176;
_s_task_game.game_info[1].game_supported_oid[24].oid = 0x3177;
_s_task_game.game_info[1].game_supported_oid[25].oid = 0x3179;
_s_task_game.game_info[1].game_supported_oid[25].yes_or_no = 0;
_s_task_game.game_info[1].game_order = 1;
_s_task_game.game_info[1].game_order_index = 0;
_s_task_game.game_info[1].game_timeout_seconds = 600;
_s_task_game.game_info[1].game_score = 0;
_s_task_game.game_info[2].game_oid = GAME_OID_ZMG;
_s_task_game.game_info[2].game_audio = &audio_game_maze;
_s_task_game.game_info[2].game_supported_oid[0].oid = 0x4E85;
_s_task_game.game_info[2].game_supported_oid[1].oid = 0x4E86;
_s_task_game.game_info[2].game_supported_oid[2].oid = 0x4E88;
_s_task_game.game_info[2].game_supported_oid[3].oid = 0x4E89;
_s_task_game.game_info[2].game_supported_oid[4].oid = 0x4E9A;
_s_task_game.game_info[2].game_supported_oid[5].oid = 0x317A;
_s_task_game.game_info[2].game_supported_oid[5].yes_or_no = 0;
_s_task_game.game_info[2].game_order = 1;
_s_task_game.game_info[2].game_order_index = 0;
_s_task_game.game_info[2].game_timeout_seconds = 600;
_s_task_game.game_info[2].game_score = 0;
_s_task_game.game_info_index = -1;
_s_task_game.game_point_index = -1;
_s_task_game.start_seconds = 0;
_s_task_game.eeror_times = 0;
}
#define D_task_READ_OID 0x50
#define D_task_GAME_SWITCH 0x51
#define D_task_GAME_PLAY 0x52
#define D_task_GAME_COMPLETED 0x53
void L3_task_game_handler(S_TASK_GAME *s)
{
TTSS_Task_init()
L2_task_go(D_task_READ_OID);
TTSS_Task_step(D_task_READ_OID)
L1_Oid_readoid();
if (ts_oid.ok == 1)
{
ts_oid.ok = 0;
s->read_oid = ts_oid.rec.d16[3];
if (s->read_oid != EEROR_OID && s->read_oid != 0x0000)
{
L2_task_go_Tdelay(D_task_GAME_SWITCH,D_Tdelay_100ms);
}
}
TTSS_Task_step(D_task_GAME_SWITCH)
U8 i = 0;
U8 j = 0;
for (i = 0; i < game_num_max; i++)
{
//目前仅支持3个游戏,其余游戏均初始化为0
if (s->game_info[i].game_oid == 0)
{
break;
}
if (s->game_info[i].game_oid == s->read_oid)
{
s->game_info_index = i;
s->eeror_times = 0;
s->start_seconds = s_nos_tick.t_1s;
for (j = 0; j < game_supported_oid_max; j++)
{
s->game_info[s->game_info_index].game_supported_oid[j].handled = 0;
}
L2_WT2605B_Broadcast(s->game_info[i].game_audio);
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms);
return;
}
}
if (s->game_info_index == -1)
{
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms);
}
else
{
L2_task_go_Tdelay(D_task_GAME_PLAY,D_Tdelay_100ms);
}
TTSS_Task_step(D_task_GAME_PLAY)
U8 i = 0,j = 0;
for (i = 0; i < game_supported_oid_max; i++)
{
POINT_INFO* p = &_s_task_game.game_info[_s_task_game.game_info_index].game_supported_oid[i];
if (p->oid == 0)
{
break;
}
if (s->read_oid == p->oid)
{
//错误码
if (p->yes_or_no == 0)
{
s->eeror_times++;
L0_uart0_sendstr("eeror_times = ");
L0_uart0_uchex(s->eeror_times);
if (p->point_audio == NULL)
{
L2_WT2605B_Broadcast(&audio_game_error);
}
else
{
L2_WT2605B_Broadcast(p->point_audio);
}
}
//正确码
else
{
//未处理
if (p->handled == 0)
{
p->handled = 1;
s->game_point_index = i;
//正确提示声音放在判断是否完成中
L2_task_go_Tdelay(D_task_GAME_COMPLETED,D_Tdelay_100ms);
return;
}
}
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms);
return;
}
}
L0_uart0_sendstr("It's not supported oid, please try again.");
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms);
TTSS_Task_step(D_task_GAME_COMPLETED)
U8 completed = 1; //假设已完成
U8 i = 0;
for (i = 0; i < game_supported_oid_max; i++)
{
POINT_INFO* p = &_s_task_game.game_info[_s_task_game.game_info_index].game_supported_oid[i];
if (p->oid != 0 && p->yes_or_no == 1 && p->handled == 0)
{
completed = 0;
break;
}
}
if (completed == 1)
{
// 游戏结束,没有要进行的游戏
s->game_info_index = -1;
L0_uart0_sendstr("It's completed.");
// 游戏完成
L2_WT2605B_Broadcast(&audio_game_complete);
}
else
{
if (s->game_info[s->game_info_index].game_supported_oid[s->game_point_index].point_audio == NULL)
{
L2_WT2605B_Broadcast(&audio_game_correct);
}
else
{
L2_WT2605B_Broadcast(s->game_info[s->game_info_index].game_supported_oid[s->game_point_index].point_audio);
}
}
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_2s);
TTSS_Task_end();
}
#if 0
//NFC协议:60 20 00 07 10 02 04 00 99 83 33 4E 36
//起始帧:60
//设备ID:20
//数据长度:00 07
//命令:10
//数据:02 04 00 99 83 33 4E
//校验:36 从起始帧到数据字段 [60 20 00 07 10 02 04 00 99 83 33 4E] 的所有字节的依次异或值
void parse_nfc_pkg()
{
TPC_NFC *p = (TPC_NFC *) ts_uart[uNum3].r.buf;
p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
if(p->head == 0x60 && 1 /*count_ocr() */)
{
U16 num = (U16)p->num[0] << 8 | p->num[1];
//只读取0x10的协议
if(p->cmd == 0x10 && num == 0x07){
//1.判定NFC卡号是否符合规则
//2.保存NFC卡号到寄存器
R.nfc.nfc_no[0] = p->buf[num-2];
R.nfc.nfc_no[1] = p->buf[num-1];
//3.设定授权标志
R.auth_flag |= 0x01;
//4.打印日志
print_nfc_pkg(p);
}
}
}
void print_nfc_pkg(TPC_NFC *p)
{
L0_uart0_sendstr("\r\n--------- Recv NFC --------\r\n");
L0_uart0_sendstr("id : ");
L0_uart0_uchex(p->slaveId);
L0_uart0_0d0a();
L0_uart0_sendstr("num: ");
L0_uart0_uchex(p->num[0]);
L0_uart0_uchex(p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("cmd: ");
L0_uart0_uchex(p->cmd);
L0_uart0_0d0a();
L0_uart0_sendstr("no : ");
L0_uart0_sendArrayHex(p->buf, (U16)p->num[0] << 8 | p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("ocr: ");
L0_uart0_uchex(p->buf[(U16)p->num[0] << 8 | p->num[1]]);
L0_uart0_0d0a();
}
#endif