#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" /****************************************************************************************************** 变量定义 *******************************************************************************************************/ AppDevice eAppDevice = ePointRead_2000A; ///volatile uint32_t RecvData[3]; Ts_OID_ ts_oid; uint8_t TransCmd[7]; ///#define MAIN_Fosc 11059260L #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); } /****************************************************************************************************** Function: Input: Output: *******************************************************************************************************/ 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; // L0_uart0_sendstr("\r\n w cmd="); /// L0_uart0_uchex(Cmd); // 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); /******** // Lc_delay_ms(1); L0_uart0_ulhex(RecvData[0]); // Lc_delay_ms(1); L0_uart0_uc(0x09); L0_uart0_ulhex(RecvData[1]); L0_uart0_uc(0x09); **********/ /// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09); /// // L0_uart0_sendArrayHex(ts_oid.rec.d,8); ///L2_oid_ParseF1(); } /****************************************************************************************************** Function: Input: Output: BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 666655555555554444444444333333333322222222221111111111 3210987654321098765432109876543210987654321098765432109876543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 U16[0] U16[1] U16[2] U16[3] 111111 111111 111111 111111 5432109876543210543210987654321054321098765432105432109876543210 666655555555554444444444333333333322222222221111111111 3210987654321098765432109876543210987654321098765432109876543210 u32[0] u32[1] 3322222222221111111111 3322222222221111111111 1098765432109876543210987654321010987654321098765432109876543210 666655555555554444444444333333333322222222221111111111 3210987654321098765432109876543210987654321098765432109876543210 U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45 U8 Ydec; //小数部分43–36 1111 0010b (Y decimal) U8 Xdec; //小数部分35–28 0111 0100b (X decimal) U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) *******************************************************************************************************/ 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]; R.game.type = ts_oid.rec.d[6]; R.game.dat = ts_oid.rec.d[7]; L0_uart0_sendstr("R.game.type = "); L0_uart0_uchex(R.game.type); L0_uart0_0d0a(); L0_uart0_sendstr("R.game.dat = "); L0_uart0_uchex(R.game.dat); L0_uart0_0d0a(); // R.oid.type = ts_oid.rec.d[6]; // R.oid.dat = ts_oid.rec.d[7]; 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 0 // 测试oid,led,喇叭联动 if(ts_oid.rec.d16[3] == 0x4E85) { L0_uart3_sendArray((U8 *)&audio_SchulteGrid,9); LED1 = ~LED1; } if(ts_oid.rec.d16[3] == 0x4E86) { L0_uart3_sendArray((U8 *)&audio_up,9); LED2 = ~LED2; } if(ts_oid.rec.d16[3] == 0x4E87) { L0_uart3_sendArray((U8 *)&audio_down,9); LED3 = ~LED3; } if(ts_oid.rec.d16[3] == 0x4E88) { L0_uart3_sendArray((U8 *)&audio_zmg,9); LED4 = ~LED4; } #endif if(ts_oid.Xint < 300)///取决于图片 fixme: cc //0E87 --- 3719 { 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); #ifdef docsdfads C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105 C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103 C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106 C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105 C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105 A0 23 80 57 (12800.4500,142.5156) 105 A0 23 80 57 C0 23 40 5A A0 23 00 5D 30 22 C0 61 E0 22 80 64 1010 0000 0010 0011 1000 0000 0101 0111 3322 2222 2222 1111 1111 11 1098 7654 3210 9876 5432 1098 7654 3210 #endif 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(" %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)///手写 { //// 普通码(bit61=0) //// Bit60:码是否有效(1:无效码;0:有效码) //// Bit59~Bit28:保留 /// Bit27~Bit0:有效数据 /// G.oid_p = 1; ts_oid.oid_p = 1; ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF; /// R.oid3_order = (int)ts_oid.gCode *100; printf(" %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(); /****************************************************************************************************** 5430C2000A/3000A点读应用初始化设置 顺序 命令设置 备注 1 single command 0x4D 关闭解码 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4 3 single command 0x36 关闭手写码侦测 4 "REG(0x0DAD) = 4250 //设置AE Target REG(0x0DB1) = 4000 //设置AE LOW REG(0x0DAF) = 4000 //设置AE LOW REG(0x0DB0) = 4500 //设置AE HIGH REG(0x0DAE) = 4500 //设置AE HIGH REG(0x1641) = 0xA0 //设置dot filter REG(0x0D6A) = 0x3F //此项不要改动 REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。 设置AE Range和dot filter。 AE_LOW < AE_Target = 2)&& (G.pen_t == 0)) { G.pen_up = 1; G.pen_t =1; L0_uart0_sendstr("789"); } /// delay_us(100); } void L1_Oid_Rec_PRINT(void) { // d[7] 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(); } #if 0 step1 if(!OID_DET) { L0_oid_Recv64(); step2 L2_oid_ParseF1(); step 3 状态 ///#ifdef doc980808 验证算法的正确性 unsigned char s[64]= { 1 , // 0 1 , // 1 1 , // 2 1 , // 3 1 , // 4 1 , // 5 1 , // 6 1 , // 7 xxxx 1 , // 8 1 , // 9 1 , // 10 1 , // 11 1 , // 12 1 , // 13 1 , // 14 1 , // 15 xxxx 1 , // 16 1 , // 17 1 , // 18 1 , // 19 1 , // 20 1 , // 21 1 , // 22 1 , // 23 xxxx 1 , // 24 1 , // 25 1 , // 26 1 , // 27 1 , // 28 1 , // 29 1 , // 30 1 , // 31 xxxx 1 , // 32 1 , // 33 1 , // 34 1 , // 35 1 , // 36 1 , // 37 1 , // 38 1 , // 39 xxxx 1 , // 40 1 , // 41 1 , // 42 1 , // 43 1 , // 44 1 , // 45 1 , // 46 1 , // 47 xxxx 1 , // 48 1 , // 49 1 , // 50 1 , // 51 1 , // 52 1 , // 53 1 , // 54 1 , // 55 xxxx 1 , // 56 1 , // 57 1 , // 58 1 , // 59 1 , // 60 1 , // 61 1 , // 62 1 // 63 xxxx }; int x =0; int i; void t(void) {RecvData[0] = 0;RecvData[1] = 0; for(i = 0; i < 64; i++) { if(s[63-i]) { if(i < 32) { RecvData[0] += 1; } if(i>=32 && i<64) { RecvData[1] += 1; } } if(i < 31) { RecvData[0] <<= 1; } if( i >31 && i < 63) { RecvData[1] <<= 1; } } for(i = 0; i < 64; i++) { ts_oid.d[i/8] <<= 1; if(s[63-i]) { ts_oid.d[i/8] |= 1; } else { ts_oid.d[i/8] &= 0xfe; } } i =5; } #endif