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.
551 lines
11 KiB
551 lines
11 KiB
#include "bsp_oid.h"
|
|
#include "intrins.h"
|
|
#include "../msp/uart0.h"
|
|
#include "../msp/uart3.h"
|
|
#include <stdio.h>
|
|
#include "../ctask/task.h"
|
|
#include "../ctask/tick.h"
|
|
#include "../app/app_task_speech.h"
|
|
#include "../bsp/bsp_WT2605B.h"
|
|
#include "../bsp/bsp_wifi.h"
|
|
|
|
/******************************************************************************************************
|
|
变量定义
|
|
*******************************************************************************************************/
|
|
AppDevice eAppDevice = ePointRead_2000A;
|
|
Ts_OID_ ts_oid;
|
|
uint8_t TransCmd[7];
|
|
#if 0
|
|
#define MAIN_Fosc (12459260L/4)
|
|
#define D_DELAY_10US 10
|
|
#define D_DELAY_ROD_80US 80
|
|
#else
|
|
#define MAIN_Fosc (12459260L/2)
|
|
#define D_DELAY_10US 20
|
|
#define D_DELAY_ROD_80US 160
|
|
#endif
|
|
|
|
//========================================================================
|
|
// 函数: void delay_ms(uint8_t ms)
|
|
// 描述: 延时函数。
|
|
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
|
|
// 返回: none.
|
|
// 版本: VER1.0
|
|
// 日期: 2021-3-9
|
|
// 备注:
|
|
//========================================================================
|
|
void delay_ms(uint8_t ms)
|
|
{
|
|
uint16_t i;
|
|
do{
|
|
i = MAIN_Fosc / 10000L;
|
|
while(--i); //10T per loop
|
|
}while(--ms);
|
|
}
|
|
void delay_us(uint8_t us)
|
|
{
|
|
// uint16_t i;
|
|
do{
|
|
// i = MAIN_Fosc / 10000000L;
|
|
// i = 1;///5 10 150u 1---50us
|
|
/// while(--i); //10T per loop
|
|
}while(--us);
|
|
}
|
|
|
|
void L0_oid_SendCmd(uint8_t Cmd)
|
|
{
|
|
uint8_t i;
|
|
LD_Oid_SDIO_OUT();
|
|
LD_Oid_SCK_HIGH();
|
|
LD_Oid_SDIO_HIGH(); // Write control bit
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
delay_us(D_DELAY_10US);
|
|
|
|
for(i=0;i<8;i++)
|
|
{
|
|
LD_Oid_SCK_HIGH();
|
|
if(Cmd & 0x80)
|
|
{
|
|
LD_Oid_SDIO_HIGH();
|
|
}
|
|
else
|
|
{
|
|
LD_Oid_SDIO_LOW();
|
|
}
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
|
|
#if 0
|
|
if(i == 7)
|
|
{
|
|
LD_Oid_SDIO_IN();
|
|
}
|
|
#endif
|
|
delay_us(D_DELAY_10US);
|
|
Cmd <<= 1;
|
|
}
|
|
delay_us(D_DELAY_ROD_80US);
|
|
LD_Oid_SDIO_IN();
|
|
}
|
|
|
|
uint16_t L0_oid_RecvAck16(void)
|
|
{
|
|
uint8_t i;
|
|
uint16_t AckValue;
|
|
AckValue = 0;
|
|
LD_Oid_SDIO_OUT();
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_HIGH();
|
|
LD_Oid_SDIO_LOW();
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
delay_us(D_DELAY_10US);
|
|
|
|
for(i = 0; i < 16; i++)
|
|
{
|
|
LD_Oid_SCK_HIGH();
|
|
LD_Oid_SDIO_IN()
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
if(OID_DET)
|
|
{
|
|
AckValue +=1;
|
|
}
|
|
if(i < 15)
|
|
{
|
|
AckValue <<= 1;
|
|
}
|
|
delay_us(D_DELAY_10US);
|
|
}
|
|
delay_us(D_DELAY_ROD_80US);
|
|
|
|
return AckValue;
|
|
}
|
|
|
|
void L0_oid_Recv64(void)
|
|
{
|
|
uint8_t i;
|
|
Lc_memset8bits(ts_oid.rec.d, 0, 8);
|
|
LD_Oid_SDIO_OUT();
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_HIGH();
|
|
LD_Oid_SDIO_LOW();
|
|
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SDIO_IN()
|
|
|
|
for(i = 0; i < 64; i++)
|
|
{
|
|
LD_Oid_SCK_HIGH();
|
|
delay_us(D_DELAY_10US);
|
|
LD_Oid_SCK_LOW();
|
|
|
|
ts_oid.rec.d[i/8] <<= 1;
|
|
|
|
if(OID_DET)
|
|
{
|
|
ts_oid.rec.d[i/8] |= 1;
|
|
}
|
|
else
|
|
{
|
|
ts_oid.rec.d[i/8] &= 0xfe;
|
|
}
|
|
delay_us(D_DELAY_10US);
|
|
}
|
|
|
|
ts_oid.time = D_sys_now;
|
|
delay_us(D_DELAY_ROD_80US);
|
|
|
|
return;
|
|
}
|
|
|
|
uint8_t L1_oid_TransCmd(uint8_t Cmd)
|
|
{
|
|
uint8_t TxCmd;///,det_busy;
|
|
uint32_t RxAckCnt = 0;
|
|
|
|
while(!OID_DET)
|
|
{
|
|
L0_oid_Recv64();
|
|
L1_print_rcv("\r\n busy: RD=");
|
|
}
|
|
TxCmd = Cmd;
|
|
L0_oid_SendCmd(TxCmd);
|
|
LD_Oid_SCK_LOW();
|
|
delay_us(10);
|
|
#define D_oid_waitrcv_delay 100000
|
|
while(OID_DET)
|
|
{
|
|
/// L1_oid_RecvOptData();
|
|
RxAckCnt ++;
|
|
if(RxAckCnt > D_oid_waitrcv_delay)
|
|
{
|
|
|
|
L0_uart0_sendstr("\r\nno rec");
|
|
L0_uart0_uchex(Cmd);
|
|
break;
|
|
}
|
|
}
|
|
if(RxAckCnt <= D_oid_waitrcv_delay)
|
|
{
|
|
TxCmd = (uint8_t)L0_oid_RecvAck16();
|
|
TxCmd -= 1;
|
|
if(TxCmd == Cmd)
|
|
{
|
|
L0_uart0_sendstr("\r\nCmd=");
|
|
L0_uart0_uchex(Cmd);L0_uart0_uc('-');
|
|
L0_uart0_uchex(TxCmd);
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t L1_oidReadRegister (uint16_t Data1)
|
|
{
|
|
uint8_t i,Ret;
|
|
uint32_t uxReturn;
|
|
|
|
TransCmd[0] = 0x74;
|
|
TransCmd[1] = 3;
|
|
TransCmd[2] = Data1 >> 8;
|
|
TransCmd[3] = Data1 & 0x00FF;
|
|
TransCmd[4] = (TransCmd[1] + TransCmd[2] + TransCmd[3]) & 0xFF;
|
|
|
|
for(i=0;i<5;i++)
|
|
{
|
|
Ret = L1_oid_TransCmd(TransCmd[i]);
|
|
if(Ret == 0)
|
|
{
|
|
return 0x5FFFFFFF;
|
|
}
|
|
}
|
|
|
|
i = 0;
|
|
while(1)
|
|
{
|
|
if(!OID_DET)
|
|
{
|
|
L0_oid_Recv64();
|
|
//uxReturn = RecvData[1];
|
|
uxReturn = ts_oid.rec.d32[1];
|
|
uxReturn &= 0xFFFF;
|
|
return uxReturn;
|
|
}
|
|
delay_us(100);
|
|
i += 1;
|
|
if(i >= 20) // check 100ms
|
|
{
|
|
return 0x2FFFFFFF;
|
|
}
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************************
|
|
Function:
|
|
Input:
|
|
Output:
|
|
*******************************************************************************************************/
|
|
uint8_t Write_Register(uint16_t Data1,uint16_t Data2)
|
|
{
|
|
uint8_t Ret,i;
|
|
uint16_t j;
|
|
Ret = 1;
|
|
|
|
TransCmd[0] = 0X73;
|
|
TransCmd[1] = 0x05;
|
|
j = Data1>>8;
|
|
TransCmd[2] = (uint8_t)j;
|
|
j = Data1;
|
|
TransCmd[3] = (uint8_t)j;
|
|
j = Data2>>8;
|
|
TransCmd[4] = (uint8_t)j;
|
|
j = Data2;
|
|
TransCmd[5] = (uint8_t)j;
|
|
TransCmd[6] = (TransCmd[1] + TransCmd[2] + TransCmd[3] + TransCmd[4] + TransCmd[5]);
|
|
|
|
for(i=0;i<7;i++)
|
|
{
|
|
Ret = L1_oid_TransCmd(TransCmd[i]);
|
|
if(Ret == 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
return Ret;
|
|
}
|
|
|
|
void L1_print_rcv(char *str)
|
|
{
|
|
L0_uart0_sendstr(str);
|
|
}
|
|
|
|
vU16 Lc_dec_us100(vU16 pint,u8 pdec)
|
|
{
|
|
pint *= 100;
|
|
if(pdec&0x80)///负数
|
|
{
|
|
pdec &= 0x7f;
|
|
pint -= 100;
|
|
}else
|
|
{
|
|
}
|
|
pdec *= 100;
|
|
pdec /= 128;
|
|
pint += (vU16)pdec;
|
|
return pint;
|
|
}
|
|
|
|
void L2_oid_ParseF1(void) //解析
|
|
{
|
|
uint16_t u16i = 0;
|
|
uint32_t u32t[2] = 0;
|
|
// L1_print_rcv("\r\n F1=");
|
|
ts_oid.oid_type = ts_oid.rec.d[0];
|
|
|
|
L1_Oid_Rec_PRINT();
|
|
|
|
if(ts_oid.rec.d[0] == 0x00) // 4
|
|
{/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分
|
|
///组成,整数部分 14bit,小数部分 8bit
|
|
G.pen_t = 0;
|
|
ts_oid.last_time = s_nos_tick.t_1s;
|
|
ts_oid.Xint = ts_oid.rec.d16[3] & 0x3fff;
|
|
|
|
if(ts_oid.Xint < 300)///取决于图片 fixme: cc //0E87 --- 3719
|
|
{
|
|
L0_uart0_sendstr("ts_oid.Xint < 300");
|
|
ts_oid.oid_x = 1;
|
|
|
|
u32t[0] = ts_oid.rec.d32[0];
|
|
u32t[1] = ts_oid.rec.d32[1];
|
|
|
|
ts_oid.angle = (vU16)(u32t[0]>>13); //45-32= 13
|
|
ts_oid.angle &= 0x01ff; //53-45+1=8
|
|
///36-43
|
|
ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4);
|
|
///28 35
|
|
ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4);
|
|
|
|
u32t[1] >>= 14;
|
|
ts_oid.Yint = (vU16)u32t[1];
|
|
ts_oid.Yint &= 0x3fff;
|
|
#if 0
|
|
if(ts_oid.Xdec&0x80)
|
|
{
|
|
ts_oid.x -= 1.0;
|
|
}
|
|
|
|
|
|
|
|
ts_oid.Xdec&=0x7f;
|
|
ts_oid.x = (float)ts_oid.Xdec;
|
|
ts_oid.x /= 128.0;
|
|
if(ts_oid.Xdec&0x80)
|
|
{
|
|
ts_oid.x -= 1.0;
|
|
}
|
|
ts_oid.x += ts_oid.Xint;
|
|
|
|
ts_oid.Ydec&=0x7f;
|
|
ts_oid.y = (float)ts_oid.Ydec;
|
|
ts_oid.y /= 128.0;
|
|
if(ts_oid.Ydec&0x80)
|
|
{
|
|
ts_oid.y -= 1.0;
|
|
}
|
|
ts_oid.y += ts_oid.Yint;
|
|
|
|
#else
|
|
ts_oid.X100 = Lc_dec_us100(ts_oid.Xint,ts_oid.Xdec);
|
|
ts_oid.Y100 = Lc_dec_us100(ts_oid.Yint,ts_oid.Ydec);
|
|
|
|
|
|
#endif
|
|
//数据存储到寄存器
|
|
printf(" 1111111 %hd %hd %hd ",
|
|
ts_oid.X100,ts_oid.Y100,
|
|
ts_oid.angle);
|
|
}
|
|
else
|
|
{
|
|
ts_oid.oid_type = 0;
|
|
L0_uart0_uc(';');
|
|
}
|
|
}
|
|
else if(ts_oid.rec.d[0] == 0x40)///手写
|
|
{
|
|
ts_oid.oid_p = 1;
|
|
ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF;
|
|
printf(" 2222222 %ld %x ",ts_oid.gCode,(int)ts_oid.gCode);
|
|
L0_uart0_ulhex(ts_oid.gCode);
|
|
}
|
|
else
|
|
{
|
|
ts_oid.oid_type = 0;
|
|
L0_uart0_uc(',');
|
|
}
|
|
}
|
|
void L2_oid_status(void)
|
|
{
|
|
if(G.oid_x)
|
|
{
|
|
if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0)
|
|
{
|
|
G.pen_down = 1;
|
|
//L0_uart2_sendstr("123");
|
|
}
|
|
else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0)
|
|
{
|
|
G.pen_hold = 1;
|
|
//L0_uart2_sendstr("456");
|
|
}
|
|
}
|
|
}
|
|
|
|
uint8_t L1_OID_WakeUp(void)
|
|
{
|
|
uint32_t i = 0;
|
|
LD_Oid_SCK_LOW();
|
|
delay_ms(2);
|
|
LD_Oid_SCK_HIGH();
|
|
delay_ms(30);
|
|
LD_Oid_SCK_LOW();
|
|
L0_uart0_sendstr(" 44 ");
|
|
|
|
while(1)
|
|
{
|
|
delay_ms(10);
|
|
i += 1;
|
|
if(i >= 400) // 400*5ms = 2s
|
|
{
|
|
L0_uart0_sendstr(" !!out!! ");
|
|
return 0;
|
|
}
|
|
if(!OID_DET)
|
|
{
|
|
L0_oid_Recv64();
|
|
L1_print_rcv("\r\n WakeUpOID get=");
|
|
if(ts_oid.rec.d[7] == 0xf8)
|
|
{
|
|
///use
|
|
L0_uart0_sendstr(" ok\r\n");
|
|
return 1;//ucCheckVersionAndInit(eAppDevice);
|
|
}
|
|
else
|
|
{
|
|
L0_uart0_sendstr("\r\nno?? OIDCMD_POWER_ON \r\n");
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/******************************************************************************************************
|
|
Function:
|
|
Input:
|
|
Output:
|
|
*******************************************************************************************************/
|
|
void L0_Oid_Init(void)
|
|
{
|
|
LD_Oid_DIO_INIT();
|
|
L0_uart0_sendstr("\r\nL1_OID_WakeUp3 ");
|
|
L1_OID_WakeUp();
|
|
L0_uart0_sendstr("666666");
|
|
|
|
Write_Register(0x0D63,0x80); //cc 好像数据分辨率有区别 此项不要改动 6 REG(0xD63) = 0x80 打开解码。此命令错误改为如下命令。
|
|
|
|
L1_oid_TransCmd(USERCMD_20FPS);//cc 必须添加
|
|
L1_oid_TransCmd(USERCMD_EN_ANGLE);//cc 必须添加
|
|
L1_oid_TransCmd(USERCMD_EN_POSITION);//cc 必须添加
|
|
|
|
printf("\r\n L0_Oid_Init finish\r\n");
|
|
|
|
L1_Oid_readoid();
|
|
|
|
ts_oid.ok = 0;
|
|
}
|
|
|
|
void L1_Oid_readoid(void)
|
|
{
|
|
if(!OID_DET)
|
|
{
|
|
// L2_WT2605B_Broadcast(&audio_game_correct);
|
|
ts_oid.pre_x = ts_oid.X100;
|
|
ts_oid.pre_y = ts_oid.Y100;
|
|
L0_oid_Recv64(); //ts_oid.rec.d[i/8] <<= 1;
|
|
L2_oid_ParseF1();
|
|
ts_oid.ok = 1;
|
|
//L2_oid_status();
|
|
}
|
|
// else if((s_nos_tick.t_1s - ts_oid.last_time >= 5) && (G.pen_t == 0))
|
|
// {
|
|
// G.pen_up = 1;
|
|
// G.pen_t =1;
|
|
// L0_uart0_sendstr("789789aabbcc");
|
|
// }
|
|
// else if((G.pen_t == 0))
|
|
// {
|
|
// G.pen_up = 1;
|
|
// G.pen_t =1;
|
|
// L0_uart0_sendstr("789789aabbcc");
|
|
// }
|
|
}
|
|
|
|
void L1_Oid_Rec_PRINT(void)
|
|
{
|
|
// d[7]
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[0] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[0]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[1] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[1]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[2] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[2]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[3] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[3]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[4] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[4]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[5] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[5]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[6] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[6]);
|
|
L0_uart0_0d0a();
|
|
L0_uart0_sendstr("ts_oid.rec.d[7] = ");
|
|
L0_uart0_uchex(ts_oid.rec.d[7]);
|
|
L0_uart0_0d0a();
|
|
// // d16
|
|
// L0_uart0_sendstr("ts_oid.rec.d16[0] = ");
|
|
// L0_uart0_ushex(ts_oid.rec.d16[0]);
|
|
// L0_uart0_0d0a();
|
|
// L0_uart0_sendstr("ts_oid.rec.d16[1] = ");
|
|
// L0_uart0_ushex(ts_oid.rec.d16[1]);
|
|
// L0_uart0_0d0a();
|
|
// L0_uart0_sendstr("ts_oid.rec.d16[2] = ");
|
|
// L0_uart0_ushex(ts_oid.rec.d16[2]);
|
|
// L0_uart0_0d0a();
|
|
// L0_uart0_sendstr("ts_oid.rec.d16[3] = ");
|
|
// L0_uart0_ushex(ts_oid.rec.d16[3]);
|
|
// L0_uart0_0d0a();
|
|
// // d32
|
|
// L0_uart0_sendstr("ts_oid.rec.d32[0] = ");
|
|
// L0_uart0_ulhex(ts_oid.rec.d32[0]);
|
|
// L0_uart0_0d0a();
|
|
// L0_uart0_sendstr("ts_oid.rec.d32[1] = ");
|
|
// L0_uart0_ulhex(ts_oid.rec.d32[1]);
|
|
// L0_uart0_0d0a();
|
|
// // oid_type
|
|
// L0_uart0_sendstr("ts_oid.oid_type = ");
|
|
// L0_uart0_uchex(ts_oid.oid_type);
|
|
// L0_uart0_0d0a();
|
|
|
|
}
|
|
|
|
|