#include "bsp_oid.h" #include "intrins.h" #include "../msp/uart0.h" #include "../msp/uart3.h" #include #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/app_config.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.Operate_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(); }