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.
 
 
 
 

555 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"
#include "../app/task_appstatus.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)
{
R.Operation_time = D_sys_now;
// 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();
}