前言

本章介绍如何实现迪文屏与飞凌OKT507的uart事件通信。

代码

从上到下是uart_example.c、dwin.c、dwin.h、makefile

#include "dwin.h"#include     <stdio.h>
#include     <stdlib.h>
#include     <unistd.h>
#include     <sys/types.h>
#include     <sys/stat.h>
#include     <fcntl.h>
#include     <termios.h>
#include     <errno.h>
#include     <sys/time.h>
#include     <string.h>
#include     <getopt.h>
#include    "stdbool.h"// #include "dwin.h"
// #include "//delay.h"
#define uint8_t u_int8_t
#define bool _Boolextern void u8_to_char(uint8_t * , char ** );
extern int judge_dwin_cmd(uint8_t ** );
extern int get_len(uint8_t *cmd_u8);
extern dwin_event_flag uart_judge_dwin_event(i_dwin_cmd * cmd);
extern i_dwin_cmd temp_cmd_recv;
extern dwin_event_key event_key_list[EVENT_KEY_NUM_MAX];
extern dwin_event_key_spec event_key_spec[EVENT_KEY_SPEC_NUM_MAX];// extern char* u8_to_char(uint8_t * );extern c_dwin_cmd cmd_recv_char; // from dwin
extern c_dwin_cmd cmd_send_char; // send to dwin
extern dwin_event_flag c_judge_dwin_event(c_dwin_cmd * cmd);
extern void c_dwin_cmd_analysis(char * in,c_dwin_cmd *cmd);
extern void c_print_cmd(c_dwin_cmd *cmd);
// extern void print_uint8(uint8_t * in);
// #define false FALSE
// #define true TRUE/* E53模块中* UART0_RX_M0 -> GPIO0_B6* UART0_TX_M0 -> GPIO0_B7*/
#define UART_ID                 0#define UART_RECV_LEN           1024
#define BUF_RX_MAX 512
#define LEN_CHAR_TEMP 17c_dwin_cmd cmd_char;int search_str_end(uint8_t *str_z, int count)
{int temp_zero = 1;int temp_count = count -1;  // 有效字符11个,12个是0x00printf("init count = %d, temp_count = %d\n",count,temp_count);uint8_t *str_temp1 = str_z;while(1){printf("str = [%02X], temp_zero = [%d], temp_count = [%d]\n",*str_temp1,temp_zero,temp_count);// if find 10 zero, will return countif(*str_temp1 != 0x00){printf("value = %02X, %ld\n",*str_temp1,str_temp1-str_z);temp_count += temp_zero;str_temp1++;temp_zero = 1;}else{temp_zero++;printf("value = %02X, %ld\n",*str_temp1,str_temp1-str_z);}if(temp_zero > 10)break;}printf("init count = %d, temp_count = %d\n",count,temp_count);return temp_count;
}int my_strlen(uint8_t *str)
{printf("enter my_strlen");uint8_t *str_temp = str;// assert(str);int count = 0;// while (*str != '\0') // this will ignore 0x00while (*str_temp != '\0'){printf("value = %02X, %ld\n",*str_temp,str_temp-str);count++;str_temp++;}// has found 0x00, str end. but uart data may contents 0x00 .. 0x00// so, need to judge next valuecount = search_str_end(str_temp-1,count);// int temp_count = count;// for(int i=0;i<10;i++)// {//     if(*str_temp =='\0')//     {//         temp_count++;//         str_temp++;//         // printf("temp_count = %d\n",temp_count);//     }//     else//         break;// }// // printf("temp_count = %d,count=%d\n",temp_count,count);// if(temp_count == count+10)//     printf("search 10 0x00 \n");// else// {//     printf("has find 0x00 \n");//     printf("end1 temp_count = %d,count=%d\n",temp_count,count);//     return temp_count;// }// printf("end 2 temp_count = %d,count=%d\n",temp_count,count);return count;
}int judge_char(uint8_t * str)
{if (str != NULL){// not emptyprintf("enter judge_char");if (my_strlen(str) != 0) {// not '\0'return 1;            }elsereturn 0;}elsereturn -1;
}// unsigned int uart_init(void)
// {//     unsigned int ret;
//     UartAttribute attr;//     LzUartDeinit(UART_ID);//     attr.baudRate = 115200;
//     attr.dataBits = UART_DATA_BIT_8;
//     attr.pad = FLOW_CTRL_NONE;
//     attr.parity = UART_PARITY_NONE;
//     attr.rxBlock = UART_BLOCK_STATE_NONE_BLOCK;
//     attr.stopBits = UART_STOP_BIT_1;
//     attr.txBlock = UART_BLOCK_STATE_NONE_BLOCK;//     // 使用UART0
//     PinctrlSet(GPIO0_PB6, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
//     PinctrlSet(GPIO0_PB7, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);//     ret = LzUartInit(UART_ID, &attr);
//     if (ret <0)
//     {//         printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
//         return 1;
//     }//     return 0;
// }void func_uart_write(uint8_t * str, int fd)
{printf("enter func_uart_write");unsigned int ret;// printf("Youkai : %s, %d: uart write!\n", __FILE__, __LINE__);// plus 3 due to dwin has head1/2/lenret = write(fd, str, *(str+2));if (ret <0){printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);return;}//delay(100);
}// void print_uint8(uint8_t * in)
// {//     printf("----temp: len[%d]\t[",*(in+2));
//     for(int i =0;i< 8;i++)
//     {//         printf("%02X",*(in+i));
//     }
//     printf("]\n");
// }void uint8_2_char(uint8_t * in,char * out, int cp_len)
{// printf("----temp: len[%d]\t[",*(in+2));printf("raw uint8_t data[");int cmd_len=*(in+2)+3;char tmp[3];memset(tmp,0x00,3);for(int i =0;i< cp_len;i++){printf("%02X",*(in+i));sprintf(tmp,"%02X",*(in+i));strcat(out,tmp);memset(tmp,0x00,3);}printf("]\n");
}void main(void)
{int fd;int nread;char buf_rx[BUF_RX_MAX+1];int n=0,i=0;// char* dev  = NULL;char dev[]  = "/dev/ttyS5";struct termios oldtio,newtio;speed_t speed = B115200;int next_option,havearg = 0,flow = 0;/*  打开串口 */fd = open(dev, O_RDWR | O_NONBLOCK| O_NOCTTY | O_NDELAY); if (fd < 0)    {printf("Can't Open Serial Port!\n");exit(0);    }printf("Welcome to uart buf_tx\n");//save to oldtiotcgetattr(fd,&oldtio);bzero(&newtio,sizeof(newtio));newtio.c_cflag = speed|CS8|CLOCAL|CREAD;newtio.c_cflag &= ~CSTOPB;newtio.c_cflag &= ~PARENB;newtio.c_iflag = IGNPAR;  newtio.c_oflag = 0;// newtio.c_cc[VTIME]=10;tcflush(fd,TCIFLUSH);  tcsetattr(fd,TCSANOW,&newtio);  tcgetattr(fd,&oldtio);memset(buf_rx,0,BUF_RX_MAX+1);char buf_tx[100]="forlinx_uart_test.1234567890...";printf("Send buf_tx data:\n[%s] [%ld]\n",buf_tx,strlen(buf_tx));write(fd, buf_tx, strlen(buf_tx));fd_set rd;int flag_rx=0;bool flag_rx1= false;bool flag_rx2 = false;bool flag_print=true;int cmd_len=0;uint8_t str_send[UART_RECV_LEN] = "HelloWorld!\n";char str_send_char[513] = "";uint8_t recv_int8[UART_RECV_LEN];char recv_char[UART_RECV_LEN];uint8_t recv_int8_t[9];char recv_char_t[LEN_CHAR_TEMP];char *recv_char_p=NULL;// char **recv_char_addr=&recv_char;// status set true, will allow to send uart msg from xiaolinpai to dwinbool status_uart_send = false;init_dwin_status();// dwin_cmd_init_send();// i_dwin_cmd * p_cmd_send = &cmd_send;// dwin_cmd_init_send(p_cmd_send);// ------------------- test uint8 to char -------------------uint8_t xxx[]={0X5A,0XA5,0X05,0X82,0X10,0X00,0X00,0X01};// u8_2_char(xxx);char *yyy=(char *)malloc(get_len(recv_int8));u8_to_char(xxx,&yyy);// yyy = (char *)u8_to_char(xxx);printf("yyy = %s\n",yyy);// ------------------- test uint8 to char -------------------printf("enter while\n");printf("youkai\n");while (1){// ----------------- uart write -----------------// if(status_uart_send == true)// {//     printf("enter send uart\n");//     // judge if str_send is empty//     // int temp = -1;//     // temp = judge_char(str_send);//     // if(temp == 1)//     if(*str_send != 0x00)//     {//         printf("func_uart_write before\n");//         func_uart_write(str_send,fd);//         printf("func_uart_write end\n");//     }//     memset(str_send,0x00,259);//     // if send ok, //     // status_uart_send = false;// }//delay(100);// // printf("Youkai : %s, %d: uart write!\n", __FILE__, __LINE__);// ret = write(UART_ID, str_send, my_strlen(str_send));// if (ret <0)// {//     printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);//     return;// }// ----------------- uart read -----------------memset(recv_int8_t,0x00,UART_RECV_LEN);int nread = read(fd, recv_int8_t, UART_RECV_LEN);if (nread >  0){// 接收到的是字符串 "5AA5" 4// printf("temp: len[%ld]\t[%s]\n",strlen(recv_int8_t),recv_int8_t);// 接收到的是十六进制数 0x5AA5 2// printf(">>>>%d,,%d\n",*recv_int8_t,*(recv_int8_t+1));if(*recv_int8_t==0x5a && *(recv_int8_t+1)==0xa5){cmd_len=*(recv_int8_t+2)+3;cmd_len=2*cmd_len ;printf("\ncmd len = %d\n",cmd_len);// if(recv_char_p == NULL)// {  //     recv_char_p=(char*)malloc(cmd_len+1);// }}// printf("uart read= %d\n",nread);// sprintf(recv_char_t,"%02X",recv_int8_t);memset(recv_char_t,0x00,LEN_CHAR_TEMP);uint8_2_char(recv_int8_t,recv_char_t, nread);// u8_to_char(recv_int8_t,&recv_char_t);// printf("recv_char_t = [%s]\n",recv_char_t);strcat(recv_char,recv_char_t);// strcat(recv_char_p,recv_char_t);printf("recv_char = [%s]\n",recv_char);// // 获取长度,16进制传输// int temp_len_i=get_len(recv_int8);// printf("temp_len=%d\n",temp_len_i);// printf("temp: len[%02x]\t[",*(recv_int8_t+2),recv_int8_t);// 收到数据设置状态flag_rx1=true;flag_rx2=true;}else if(nread < 0 ){printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, nread);return;}if(nread == 0){// 判断传输停止if(flag_rx1==true&&flag_rx2==true){flag_rx2=false;}else if(flag_rx1==true&&flag_rx2==false){flag_rx1=false;printf("judge 1\n");if(strlen(recv_char)>0){printf("strlen = %ld _ cmd_len=%d\n",strlen(recv_char),cmd_len);if(strlen(recv_char)==cmd_len)// if(strlen(recv_char_p)==cmd_len){printf(">>>recv_cmd_char = [%s]\n",recv_char);// printf(">>>recv_cmd_char = [%s]\n",recv_char_p);// c_judge_dwin_event(&cmd_recv_char);// c_dwin_cmd_analysis(&recv_char_p,&cmd_recv_char);c_dwin_cmd_analysis(recv_char,&cmd_recv_char);// c_print_cmd(&cmd_recv_char);// free(recv_char_p);tcflush(fd, TCIOFLUSH);}memset(recv_char,0x00,UART_RECV_LEN);}}}}close(fd);return;
}

#include "dwin.h"// DATA FORMAT: head  + date len + write/read + addr + read_len / write_value
//              5A A5 +          +    82/83   + 3000 +    01    /     3132
// ps: date_len = write/read(1) + addr(2) + read_len / write_value(1/2)
// date_len is the number bytes of end date_len
#define DWIN_CMD_HEAD_1  0x5A//{0x5A,0XA5}//"\x5A\xA5"
#define DWIN_CMD_HEAD_2  0xA5
#define DWIN_CMD_WRITE   0x82
#define DWIN_CMD_READ    0x83#define DWIN_CMD_OK "5AA503824F4B\0"#define DWIN_CMD_POINT_HEAD1 0
#define DWIN_CMD_POINT_HEAD2 1
#define DWIN_CMD_POINT_LEN 2
#define DWIN_CMD_POINT_WR 3
#define DWIN_CMD_POINT_ADDR1 4
#define DWIN_CMD_POINT_ADDR2 5
#define DWIN_CMD_POINT_VALUE 6// -------------------- data --------------------
// case 1
// malloc char menber to save dwincmd by char format
// char * dwin_cmd_char_temp;// case 2
char dwin_cmd_char_temp[DWIN_CMD_CHAR_MAX];
uint8_t dwin_cmd_u8_temp[DWIN_CMD_U8_MAX];
char * dwin_cmd_char_value;
char temp_c[3];i_dwin_cmd temp_cmd_recv; // from dwin
i_dwin_cmd temp_cmd_send; // send to dwinc_dwin_cmd cmd_recv_char; // from dwin
c_dwin_cmd cmd_send_char; // send to dwindwin_event_key event_key_list[EVENT_KEY_NUM_MAX]={// {//     event_flag, event_name,//     event_status,//     event_addr, event_flag_name,//     event_ops1, enent_ops1// },{EVENT_FLAG_AUDIO_RECORD, "record",EVENT_FLAG_STATUS_STOP,"1503", "EVENT_FLAG_AUDIO_RECORD",func_open_record,   func_close_record},{EVENT_FLAG_CAM_SCAN,    "cam",EVENT_FLAG_STATUS_STOP,"1504", "EVENT_FLAG_CAM_SCAN",func_open_cam,      func_close_cam},{EVENT_FLAG_NFC_SCAN,    "nfc",EVENT_FLAG_STATUS_STOP, "1505", "EVENT_FLAG_NFC_SCAN",func_open_nfc,      func_close_nfc},{EVENT_FLAG_UNKOWN,  "unknow",EVENT_FLAG_STATUS_STOP,"0000" , "EVENT_FLAG_UNKOWN"}
};dwin_event_key_spec event_key_spec[EVENT_KEY_SPEC_NUM_MAX]=
{// special event, just one ops// {//     event_key, event_name,//     event_ops// },{"1502010012",  "search",func_search},// ...{EVENT_KEY_SPEC_VALUE,  "end", func_spec_end}
};// -------------------- event func --------------------// function
void func_open_record()
{printf("--- func_record_open\n");return;
}void func_close_record()
{printf("--- func_close_record\n");return;
}// function
void func_open_cam()
{printf("--- func_cam_open\n");return;
}void func_close_cam()
{printf("--- func_close_cam\n");return;
}// function
void func_open_nfc()
{printf("--- func_nfc_open\n");return;
}void func_close_nfc()
{printf("--- func_close_nfc\n");return;
}void func_search()
{printf("--- func_search\n");return;
}void func_spec_end()
{printf("--- func_spec_end\n");return;
}
// void (*func)();// -------------------- dwin func --------------------void init_dwin_status()
{printf("set all status stop\n");dwin_event_key  * temp_key;temp_key = &event_key_list[0];for(int i =0; temp_key->flag != EVENT_FLAG_UNKOWN; i++){temp_key = &event_key_list[i];temp_key->status = EVENT_FLAG_STATUS_STOP;}return;
}//---------------------------------------------------------
//  FOR uint8_t data  0x5AA5..
//
//
//
//---------------------------------------------------------// cmd save as uint_8
void i_dwin_cmd_clear(i_dwin_cmd * cmd)
{cmd->head[0]=DWIN_CMD_HEAD_1;cmd->head[1]=DWIN_CMD_HEAD_2;cmd->len = 0x00;cmd->wr = 0x00;cmd->addr[0] = 0x00;cmd->addr[1] = 0x00;cmd->value = NULL;if(cmd->cmd_u8 != NULL){free(cmd->cmd_u8);cmd->cmd_u8 = NULL;}if(cmd->cmd_char != NULL){free(cmd->cmd_char);cmd->cmd_char = NULL;}// memset(cmd->cmd_u8,0x00,DWIN_CMD_LEN_U8_MAX);// cmd->cmd_char = NULL;return;
}void dwin_cmd_init_send()
{i_dwin_cmd_clear(&temp_cmd_recv);temp_cmd_recv.wr = DWIN_CMD_WRITE;temp_cmd_recv.cmd_char = NULL;temp_cmd_recv.cmd_u8 = NULL;// memset(temp_cmd_recv.cmd_char,0x00,DWIN_CMD_CHAR_MAX);// memset(temp_cmd_recv.cmd_u8,0x00,DWIN_CMD_LEN_U8_MAX);return;
}// TOTO
// analysis u8 cmd to save in cmd
void uart_dwin_cmd_analysis(uint8_t *in_u8_raw)
{// 1. judge cmd is dwin headuint8_t *cmd_temp = in_u8_raw;if(*(cmd_temp+DWIN_CMD_POINT_HEAD1) == DWIN_CMD_HEAD_1 && *(cmd_temp+DWIN_CMD_POINT_HEAD2)== DWIN_CMD_HEAD_2){printf("this is dwin cmd\n");i_dwin_cmd_clear(&temp_cmd_recv);// 1. save cmd msgtemp_cmd_recv.len = *(cmd_temp + DWIN_CMD_POINT_LEN);temp_cmd_recv.wr = *(cmd_temp + DWIN_CMD_POINT_WR);temp_cmd_recv.addr[0] = *(cmd_temp + DWIN_CMD_POINT_ADDR1);temp_cmd_recv.addr[1] = *(cmd_temp + DWIN_CMD_POINT_ADDR2);temp_cmd_recv.value = cmd_temp + DWIN_CMD_POINT_VALUE;// temp_cmd_recv.cmd_u8 = dwin_cmd_u8_temp;// case1:// copy_u8_2_u8(cmd_temp);//case2:temp_cmd_recv.cmd_u8 = u8_to_u8(in_u8_raw);// print_dwin_cmd(temp_cmd_recv);// uint8_t to char , save in cmd struct// case1:// temp_cmd_recv.cmd_char = dwin_cmd_char_temp;// memset(temp_cmd_recv.cmd_char,0x00,DWIN_CMD_CHAR_MAX);//case2:char *temp_c=NULL;u8_to_char(in_u8_raw,&temp_c);if(temp_c!= NULL)temp_cmd_recv.cmd_char = temp_c;elseprintf("temp_c is null");printf("temp_cmd_recv.cmd_char");// dwin_cmd_uint8_t2char(temp_cmd_recv);// printf("dwin cmd char = %s\n",temp_cmd_recv.cmd_char);// 2. event judgeuart_judge_dwin_event(&temp_cmd_recv);printf("uart_judge_dwin_event");}return;
}// TOTO
dwin_event_flag uart_judge_dwin_event(i_dwin_cmd * cmd)
{printf("\nenter uart_judge_dwin_event\n");// print_dwin_cmd(*cmd);printf("cmd str = %s\n",cmd->cmd_char);// 1. judge okif(strcmp(cmd->cmd_char,DWIN_CMD_OK) == 0){printf("recv ok\n");// get ok, stop send// status_uart_send = false;return EVENT_FLAG_OK;} // 2. judge eventprintf("\nenter uart_judge_dwin_event\n");dwin_event_key * temp_value ;temp_value = &event_key_list[0];for(int i = 0; temp_value->flag != EVENT_FLAG_UNKOWN ; i++){// +8 choose add// printf("search=%s,key=%s\n",cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE ,temp_value.key);// can't use strcmp, due to uart data may have double 0x00if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE, temp_value->key) != NULL){printf("searched key= %s, value=%d, name=%s\n",temp_value->key,temp_value->flag,temp_value->flag_name);if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_VALUE_VALUE, "010001") != NULL){printf("status set open\n");if(temp_value->open != NULL ){temp_value->open();temp_value->status = EVENT_FLAG_STATUS_ING;printf("%s status change: stop -> ing\n",temp_value->event_name);}}if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_VALUE_VALUE, "010000") != NULL){printf("status set close\n");if(temp_value->close != NULL ){temp_value->close();temp_value->status = EVENT_FLAG_STATUS_STOP;printf("%s status change: ing -> stop\n",temp_value->event_name);}}// change_dwin_status(temp_value->flag);// change_dwin_status_key(temp_value);printf("has find match key, event = [%s]\n\n",temp_value->event_name);return temp_value->flag;}temp_value = &event_key_list[i];}printf("hasn't find match key\n");searc_spec_event(cmd);return EVENT_FLAG_UNKOWN;
}void searc_spec_event(i_dwin_cmd * cmd)
{printf("search spec event\n");dwin_event_key_spec * temp_value ;temp_value = &event_key_spec[0];// printf("spec event key = %s\n",temp_value->key);for(int i = 0; strcmp(temp_value->key,EVENT_KEY_SPEC_VALUE) != 0 && i<EVENT_KEY_SPEC_NUM_MAX ; i++){// printf("spec event key = %s\n",temp_value->key);// printf("spec event value = %s\n",cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE);if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE, temp_value->key ) != NULL){temp_value->func();printf("find spec event: {value = %s,\tname = %s,\ttemp_value}\n",temp_value->key,temp_value->event_name);return;}temp_value = &event_key_spec[i];}printf("unfind spec key\n");return;
}// -------------------- basic func  --------------------char * uint8_t2char(uint8_t value)
{memset(temp_c,0x00,3);sprintf(temp_c, "%02X", value);// printf("temp_c = [%s]\n",temp_c);return temp_c;
}void print_dwin_cmd(i_dwin_cmd cmd)
{printf("len=%02X\n",cmd.len);printf("wr=%02X\n",cmd.wr);printf("addr=%02x_%02X\n",cmd.addr[0],cmd.addr[1]);printf("value=%s\n",cmd.cmd_char);return;
}// 串口数据从uint8转换位char,例如0x5AA5,转换为字符串”5AA5“,由2字节转换为4字节
// malloc buffer and return buffer addrvoid u8_to_char(uint8_t * in_u8, char ** out)
{uint8_t * temp_cmd_u8 = in_u8;int len_u8 = *(in_u8 + DWIN_CMD_POINT_LEN ) + 3; // +3 head12/lenint len_char = 2*len_u8 +1;     // +1 '\0'printf("cmd_u8 len_u8=%d,len_char=%d\n",len_u8,len_char);// printf("0\n");// *out = (char *)malloc(len_char);// printf("1\n");memset(*out,0x00,len_char);// printf("2\n");for(int i=0;i<len_u8;i++){// printf("i=%d\n",i);uint8_t temp_int8=*(in_u8+i);// printf("temp_int8 = %02x\n",temp_int8);uint8_t2char( temp_int8 );// printf("before strcat\n");strcat(*out,temp_c);// printf(">>end strcat\n");// temp_cmd_u8++;}// strcat(cmd_char_t,'\0');// *(temp_char + len_char -1) = '\0';printf("u8_to_char out = [%s] \n",*out);// printf("temp_char end\n");return;}uint8_t * u8_to_u8(uint8_t * in_u8)
{uint8_t * temp_in_u8 = in_u8;int len_u8 = *(in_u8 + DWIN_CMD_POINT_LEN) + 3;printf("cmd_u8 len_u8=%d\n",len_u8);uint8_t * temp_out_u8 = (uint8_t *)malloc(len_u8);for(int i=0;i<len_u8;i++){*(temp_out_u8 +i) = *(temp_in_u8 +i);}return temp_out_u8;
}// -------------------- delete func  --------------------void change_dwin_status_key(dwin_event_key *in_key)
{printf("change status \n");if(in_key->status == EVENT_FLAG_STATUS_ING){in_key->status = EVENT_FLAG_STATUS_STOP;printf("%s status change: ing -> stop\n",in_key->event_name);return;}else if(in_key->status == EVENT_FLAG_STATUS_STOP){in_key->status = EVENT_FLAG_STATUS_ING;printf("%s status change: stop -> ing\n",in_key->event_name);return;}elseprintf("error event_flag for %s\n",in_key->event_name);printf("unknown event\n");return;
}void save_cmd_u8(i_dwin_cmd * cmd)
{uint8_t * p = cmd->cmd_u8;*(p+DWIN_CMD_POINT_HEAD1) = cmd->head[0];*(p+DWIN_CMD_POINT_HEAD2 ) = cmd->head[1];*(p+DWIN_CMD_POINT_LEN ) = cmd->len;*(p+DWIN_CMD_POINT_WR ) = cmd->wr;*(p+DWIN_CMD_POINT_ADDR1 ) = cmd->addr[0];*(p+DWIN_CMD_POINT_ADDR2 ) = cmd->addr[1];return;// *(p+2)
}char * uint8_t2char_list(uint8_t * p_dwin_u8_value,int len)
{char * p_dwin_char_value = dwin_cmd_char_value;for(int i=0; i<len; i++){strcat(p_dwin_char_value,uint8_t2char(*p_dwin_u8_value));p_dwin_u8_value++;p_dwin_char_value = p_dwin_char_value + 2;}*(p_dwin_char_value +1 )= '\0';return dwin_cmd_char_value;
}int dwin_event_cmp(uint8_t * value ,uint8_t *match)
{uint8_t * p_value = value;uint8_t * p_match = match;for(int i=0;i<4;i++){if(*p_value == *p_match){p_value++;p_match++;}else{printf("dont match\n");return 0;}printf(" matched \n");return 1;}return 0;
}/*func1: uint8_t change to char0x5A A5 04 83 10 00 01"5AA50483100001"func2: judge uint8_tif(str[X] == 0x5A)
*/
char * dwin_cmd_uint8_t2char(i_dwin_cmd cmd)
{print_dwin_cmd(cmd);// case1: malloc// int cmd_len = cmd.len;// int malloc_len = (cmd_len + 3) *2 +1;// printf("malloc %d\n",malloc_len);// dwin_cmd_char_temp = (char*)malloc( malloc_len);// case2: char arraymemset(dwin_cmd_char_temp,0x00,DWIN_CMD_CHAR_MAX);// point to char value posdwin_cmd_char_value = dwin_cmd_char_temp + 2*DWIN_CMD_POINT_VALUE;// 1. head strcat(dwin_cmd_char_temp,"5AA5");// printf("dwin_cmd_char_temp = %s\n",dwin_cmd_char_temp);// 2. lenuint8_t2char(cmd.len);strcat(dwin_cmd_char_temp,temp_c);// 3. wruint8_t2char(cmd.wr);strcat(dwin_cmd_char_temp,temp_c);// 4. addruint8_t2char(cmd.addr[0]);strcat(dwin_cmd_char_temp,temp_c);uint8_t2char(cmd.addr[1]);strcat(dwin_cmd_char_temp,temp_c);// printf("dwin_cmd_char_temp = %s\n",dwin_cmd_char_temp);// 5. addruint8_t2char_list(cmd.value,cmd.len - 3);   // 3 due to addr(2) + wr(1)printf("dwin_cmd_char_temp = %s\n",dwin_cmd_char_temp);return dwin_cmd_char_temp;
}/*func1: uint8_t change to char0x5A A5 04 83 10 00 01"5AA50483100001"func2: judge uint8_tif(str[X] == 0x5A)
*/
void uart_recv_value_cut(uint8_t * recv_all)
{// dwin_cmd_sizeof = sizeof(recv_all);int dwin_cmd_sizeof = strlen(recv_all);//ERROR may: my_strlenprintf("dwin_cmd_sizeof = %d\n",dwin_cmd_sizeof);//p = (int*)malloc(sizeof(int) * n);char * dwin_cmd_charlist;dwin_cmd_charlist = (char*)malloc( dwin_cmd_sizeof *2 +1);memset(dwin_cmd_charlist,0x00,dwin_cmd_sizeof);for(int i = 0;i<dwin_cmd_sizeof;i++){printf("i = [ %d ]\n",i);uint8_t temp_uc = recv_all[i];char temp_c[3] = "00";//ERROR, may set 2 if(temp_uc != 0x00)sprintf(temp_c, "%02X", temp_uc);else{printf("uc is 0x00\n");// temp_c[0] = '0';// temp_c[1] = '0';// temp_c = "00";}printf("temp_c = [ %s ]\n",temp_c);strcat(dwin_cmd_charlist,temp_c);//strcat(dwin_cmd_charlist,'\0');}printf("dwin_cmd_charlist %s \n",dwin_cmd_charlist);printf("end display");// if(recv_all[0]==DWIN_CMD_HEAD_1 && recv_all[1]==DWIN_CMD_HEAD_2)// {//     printf("this is dwin cmd %s\n",(char)recv_all);//     dwin_cmd_len = recv_all[2];//     dwin_cmd_wr = recv_all[3];//     dwin_cmd_addr[0] = recv_all[4];//     dwin_cmd_addr[1] = recv_all[5];//     dwin_cmd_data_len = recv_all[6];//     dwin_cmd_data_value = recv_all+7;//     printf("dwin_cmd_len %02X\n",dwin_cmd_len);//     printf("dwin_cmd_wr %02X\n",dwin_cmd_wr);//     printf("dwin_cmd_addr[0] %02X\n",dwin_cmd_addr[0]);//     printf("dwin_cmd_addr[1] %02X\n",dwin_cmd_addr[1]);//     printf("dwin_cmd_data_len %02X\n",dwin_cmd_data_len);//     sprintf(dwin_cmd_charlist, "%02X", dwin_cmd_len);//     printf("dwin_cmd_charlist %s\n",dwin_cmd_charlist);//     // printf(" %x\n",);//     // printf(" %x\n",);//     // if(recv_all[0]==0x5A)// }free(dwin_cmd_charlist);printf("end func");return ;
}void copy_u8_2_u8(uint8_t * u8_raw)
{memset(dwin_cmd_u8_temp,0x00,DWIN_CMD_CHAR_MAX);uint8_t * p_raw = u8_raw;uint8_t * p_end = dwin_cmd_u8_temp;int len = *(u8_raw + DWIN_CMD_POINT_LEN) + 3;for(int i=0;i<len;i++){*(p_end +i) = *(p_raw +i);// p_raw++;// p_end++;}return;
}//---------------------------------------------------------
//  FOR char: "5AA5.."
//
//
//
//---------------------------------------------------------// ADD FOR LINUX DIWN
int judge_dwin_cmd(uint8_t **in_u8_raw)
{// 1. judge cmd is dwin headprintf("judge_dwin_cmd=[%s]\n",*in_u8_raw);uint8_t *cmd_temp = *in_u8_raw;if(*(cmd_temp+DWIN_CMD_POINT_HEAD1) == DWIN_CMD_HEAD_1 && *(cmd_temp+DWIN_CMD_POINT_HEAD2)== DWIN_CMD_HEAD_2){printf("this is dwin cmd\n");return 1;}elsereturn 0;
}int get_len(uint8_t *cmd_u8)
{int len = *(cmd_u8  + 2);// printf("len = %d\n",len);return len;
}// cmd save with char
void c_dwin_cmd_clear(c_dwin_cmd * cmd)
{printf("clear cmd value\n");strncpy(cmd->head,"5AA5",4);strncpy(cmd->len,"00",2);strncpy(cmd->wr,"83",2);strncpy(cmd->addr,"0000",4);cmd->value = NULL;cmd->cmd_char = NULL;// memset(cmd->cmd_u8,0x00,DWIN_CMD_LEN_U8_MAX);// cmd->cmd_char = NULL;return;
}void print_uint8(uint8_t * in)
{printf("----temp: len[%d]\t[",*(in+2));for(int i =0;i< 8;i++){printf("%02X",*(in+i));}printf("]\n");
}void c_print_cmd(c_dwin_cmd *cmd)
{printf("print cmd value\n");printf("head | len | wr | addr | value  | all\n");printf("%s | %s  | %s | %s | %s | %s\n",cmd->head,cmd->len,cmd->wr,cmd->addr,cmd->value,cmd->cmd_char);return;}void c_dwin_cmd_analysis(char * in,c_dwin_cmd *cmd)
{// 1. judge cmd is dwin headchar *cmd_temp = in;printf("this is dwin cmd\n");c_dwin_cmd_clear(cmd);// 1. save cmd msgprintf("save cmd value\n");// printf("len=%s\n",(in+C_CMD_POINT_LEN));strncpy(cmd->len,in+C_CMD_POINT_LEN,2);strncpy(cmd->wr,in+C_CMD_POINT_WR,2);strncpy(cmd->addr,in+C_CMD_POINT_ADDR,4);// strncpy(cmd->value,in+C_CMD_POINT_LEN,);cmd->value=(in+C_CMD_POINT_VALUE);cmd->cmd_char=in;c_print_cmd(cmd);// 2. event judgec_judge_dwin_event(cmd);return;
}void c_searc_spec_event(c_dwin_cmd * cmd)
{printf("search spec event\n");dwin_event_key_spec * temp_value ;temp_value = &event_key_spec[0];// printf("spec event key = %s\n",temp_value->key);for(int i = 0; strcmp(temp_value->key,EVENT_KEY_SPEC_VALUE) != 0 && i<EVENT_KEY_SPEC_NUM_MAX ; i++){// printf("spec event key = %s\n",temp_value->key);// printf("spec event value = %s\n",cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE);if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE, temp_value->key ) != NULL){temp_value->func();printf("find spec event, value = %s, name = %s\n",temp_value->key,temp_value->event_name);return;}temp_value = &event_key_spec[i];}printf("unfind spec key\n");return;
}dwin_event_flag c_judge_dwin_event(c_dwin_cmd * cmd)
{printf("\nenter c_judge_dwin_event\n");// print_dwin_cmd(*cmd);printf("cmd str = [%s]\n",(cmd->cmd_char));// 1. judge okif(strcmp((cmd->cmd_char),DWIN_CMD_OK) == 0){printf("recv ok\n");// get ok, stop send// status_uart_send = false;return EVENT_FLAG_OK;} // 2. judge eventprintf("\nenter c_judge_dwin_event\n");dwin_event_key * temp_value ;temp_value = &event_key_list[0];for(int i = 0; temp_value->flag != EVENT_FLAG_UNKOWN ; i++){// +8 choose add// printf("search=%s,key=%s\n",*(cmd->cmd_char) + DWIN_CMD_CHAR_ADDR_VALUE ,temp_value.key);// can't use strcmp, due to uart data may have double 0x00if(strstr((cmd->addr), temp_value->key) != NULL){printf("searched key= %s, value=%d, name=%s\n",temp_value->key,temp_value->flag,temp_value->flag_name);if(strstr((cmd->value) , "010001") != NULL){printf("status set open\n");if(temp_value->open != NULL ){temp_value->open();temp_value->status = EVENT_FLAG_STATUS_ING;printf("%s status change: stop -> ing\n",temp_value->event_name);}}if(strstr((cmd->cmd_char) , "010000") != NULL){printf("status set close\n");if(temp_value->close != NULL ){temp_value->close();temp_value->status = EVENT_FLAG_STATUS_STOP;printf("%s status change: ing -> stop\n",temp_value->event_name);}}// change_dwin_status(temp_value->flag);// change_dwin_status_key(temp_value);printf("has find match key, event = [%s]\n\n",temp_value->event_name);return temp_value->flag;}temp_value = &event_key_list[i];}printf("hasn't find match key\n");c_searc_spec_event(cmd);return EVENT_FLAG_UNKOWN;
}
#include "stddef.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#include "stdint.h"#define TRUE 1
#define FALSE 0
#define uint8_t u_int8_t
#define bool _Booltypedef enum{EVENT_FLAG_OK = 0X0,EVENT_FLAG_AUDIO_RECORD = 0x3,EVENT_FLAG_AUDIO_PLAY = 0x4,EVENT_FLAG_CAM_SCAN = 0x5,EVENT_FLAG_NFC_SCAN = 0x6,EVENT_FLAG_BOOK_SEARCH = 0x10,EVENT_FLAG_BOOK_INPUT = 0x11,EVENT_FLAG_UNKOWN = -1,
}dwin_event_flag;typedef enum{// EVENT_FLAG_STATUS_START = 0x0,EVENT_FLAG_STATUS_ING = TRUE,EVENT_FLAG_STATUS_STOP = FALSE,EVENT_FLAG_STATUS_ERROR = -1,
}dwin_event_flag_status;typedef enum{EVENT_TYPE_DWIN_SEND = 0x0,  // uart readEVENT_FLAG_DWIN_RECV = 0x1,  // uart write
}dwin_event_type;#define DWIN_CMD_LEN_U8_MAX 259typedef struct
{uint8_t head[2];uint8_t len;uint8_t wr;uint8_t addr[2];uint8_t * value;// uint8_t cmd_u8[DWIN_CMD_LEN_U8_MAX];uint8_t * cmd_u8;char * cmd_char;
}i_dwin_cmd;void uart_recv_value_cut(uint8_t * recv_all);
// dwin_event_flag uart_judge_dwin_event(char *str);
dwin_event_flag uart_judge_dwin_event(i_dwin_cmd * cmd);void print_dwin_cmd(i_dwin_cmd cmd);char * dwin_cmd_uint8_t2char(i_dwin_cmd cmd);char * uint8_t2char(uint8_t value);char * uint8_t2char_list(uint8_t * p_dwin_u8_value,int len);void change_dwin_status(dwin_event_flag event_flag);// UART recv/send judge dwin_event
#define EVENT_KEY_NUM_MAX 10
// #define EVENT_KEY_MAX -1// function
void func_open_record();
void func_close_record();
void func_open_cam();
void func_close_cam();
void func_open_nfc();
void func_close_nfc();#define EVENT_NAME_MAX 11
#define EVENT_FLAG_NAME_MAX 30
#define EVENT_KEY_VALUE_MAX 11   //"3000 0001"  is 8typedef struct
{dwin_event_flag flag;char event_name[EVENT_NAME_MAX];dwin_event_flag_status status;char key[EVENT_KEY_VALUE_MAX];   // key[0,3] addr key[4,7] valuechar flag_name[EVENT_FLAG_NAME_MAX];void (*open)();void (*close)();
}dwin_event_key;dwin_event_key event_key_list[EVENT_KEY_NUM_MAX];
// {//     // {//     //     event_flag, event_name,
//     //     event_status,
//     //     event_addr, event_flag_name,
//     //     event_ops1, enent_ops1
//     // },//     {//         EVENT_FLAG_AUDIO_RECORD, "record",
//         EVENT_FLAG_STATUS_STOP,
//         "1503", "EVENT_FLAG_AUDIO_RECORD",
//         func_open_record,   func_close_record
//     },//     {//         EVENT_FLAG_CAM_SCAN,    "cam",
//         EVENT_FLAG_STATUS_STOP,
//         "1504", "EVENT_FLAG_CAM_SCAN",
//         func_open_cam,      func_close_cam
//     },//     {//         EVENT_FLAG_NFC_SCAN,    "nfc",
//         EVENT_FLAG_STATUS_STOP,
//         "1505", "EVENT_FLAG_NFC_SCAN",
//         func_open_nfc,      func_close_nfc
//     },//     {//         EVENT_FLAG_UNKOWN,  "unknow",
//         EVENT_FLAG_STATUS_STOP,
//         "0000" , "EVENT_FLAG_UNKOWN"
//     }
// };typedef struct
{char key[EVENT_KEY_VALUE_MAX];   // key[0,3] addr key[4,7] valuechar event_name[EVENT_FLAG_NAME_MAX];void (*func)();
}dwin_event_key_spec;void func_search();
void func_spec_end();void searc_spec_event();#define EVENT_KEY_SPEC_VALUE "over"
#define EVENT_KEY_SPEC_NUM_MAX 20
dwin_event_key_spec event_key_spec[EVENT_KEY_SPEC_NUM_MAX];
// {//     // special event, just one ops
//     // {//     //     event_key, event_name,
//     //     event_ops
//     // },//     {//         "1502010012",  "search",
//         func_search
//     },
//     // ...//     {EVENT_KEY_SPEC_VALUE,  "end",
//         func_spec_end
//     }
// };void change_dwin_status_key(dwin_event_key *in_key);void change_cmd_send_status(dwin_event_flag temp_event_flag);// -------------------- basic func  --------------------void copy_u8_2_u8(uint8_t * u8_raw);void u8_to_char(uint8_t * in_u8, char ** out);uint8_t * u8_to_u8(uint8_t * in_u8);// -------------------- dwin func --------------------
void dwin_cmd_init_send();
void init_dwin_status();
void i_dwin_cmd_clear(i_dwin_cmd * cmd);// get u8 from example
void uart_dwin_cmd_analysis(uint8_t *str);void copy_u8_to_cmdu8(i_dwin_cmd *cmd, uint8_t * u8);//int my_strlen(uint8_t *str);// int search_str_end(uint8_t *str_z, int count);
// int my_strlen(uint8_t *str);
// int judge_char(uint8_t * str);#define DWIN_CMD_CHAR_ADDR_VALUE 8
#define DWIN_CMD_CHAR_VALUE_VALUE 12
#define DWIN_CMD_CHAR_MAX 513
#define DWIN_CMD_U8_MAX 256// add for char
#define C_CMD_POINT_HEAD 0
#define C_CMD_POINT_LEN 4
#define C_CMD_POINT_WR 6
#define C_CMD_POINT_ADDR 8
#define C_CMD_POINT_VALUE 12typedef struct
{char head[5];char len[3];char wr[3];char addr[5];char * value;char * cmd_char;
}c_dwin_cmd;int judge_dwin_cmd(uint8_t ** in_u8_raw);
int get_len(uint8_t *cmd_u8);void c_dwin_cmd_analysis(char * in,c_dwin_cmd *cmd);void c_dwin_cmd_clear(c_dwin_cmd * cmd);
dwin_event_flag c_judge_dwin_event(c_dwin_cmd * cmd);
void c_print_cmd(c_dwin_cmd *cmd);
void print_uint8(uint8_t * in);
#CC = aarch64-poky-linux-gcc -mcpu=cortex-a55 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.1.5/sysroots/aarch64-poky-linuxTARGET=t2_uartOBJS=t2_uart.oCFLAGS+=-c -Wall -g
LDFLAGS+= -lpthreadOPENSSL_DIR    = /home/share/forlinx/OKT507/pro/feiling_dwin/v3_event
INC_DIR =  dwin.h
SRC_DIR =  dwin.cDWIN = dwin# $(TARGET):$(OBJS)
#   $(CC) $^ $(LDFLAGS) -o $@  # %.o:%.c
#   $(CC) $^ $(CFLAGS) -o $@dwin_test:uart_example.c  $(SRC_DIR) $(INC_DIR)$(CC) $^ -o dwin_test# dwin.o:
#   $(CC)  $^ -o dwin.o# $CC t2_uart.c -o t2_uartclean:$(RM) *.o $(TARGET) -rinstall:install -m 0755 $(TARGET) ./

配置环境

【命令】export CC=aarch64-linux-gnu-gcc

编译

在对应目录直接输入make,会调用Makefile进行编译,最终生成dwin_test文件
【命令】make

传输

通过sftp将文件传输给设备OKT507

直接拖到右侧的远程站点即可。

运行

【OKT507】迪文屏事件相关推荐

  1. 22、T5L 迪文屏 C51开发之Hello World例程

    T5L 迪文屏 C51开发之Hello World例程 1.写在前面 2.例程功能简介 3.GUI界面设计 4.C51代码设计 1.写在前面   前面已经介绍了如何使用DGUS Tool软件来进行迪文 ...

  2. 30、T5L 迪文屏 C51开发之 ADC模数转换

    T5L 迪文屏 C51开发之 ADC模数转换 1.介绍 2.例程功能介绍 3.GUI界面设计 4.C51程序设计 1.介绍   T5L 芯片内部的 ADC 模数转换外设,有一点需要注意的是此 ADC ...

  3. 1、迪文屏基于T5L_C51开发手势6宫格解锁

    演示视频 1.概述 基于迪文屏DMG32240C028-03WTC屏的滑动手势6宫格解锁功能,该功能运用了触摸屏状态读取和坐标读取的功能(系统变量接口0x0016),绘图功能,需要配合变量图标显示等基 ...

  4. 分享:STM32与迪文屏交互,轻松实现一些简单的功能!

    最近,托朋友用STM32F103评估板和迪文屏做了交互(@田),没写多少代码,就实现了一些简单常用的功能,还是很简单的!今天跟大家分享一下: 一.评估板使用说明 1.功能 图1:整体效果图 图2:MC ...

  5. 一种迪文屏软件在线升级方法

    --来自迪文开发者论坛 开发自己的项目中遇到文件升级不方便的问题,因此设计了一个在线升级方案,可以有效解决如下问题: 1. 当产品已发出需要修复Bug时,无法在线修复. 2. 无法判断新老版本,当数据 ...

  6. STM32串口中断程序-迪文屏,

    STM32串口中断程序-迪文屏,串口接收准确数值 这几天一直在做原子开发板与迪文屏的通信,开发板向迪文屏写数据已经完成,但是从迪文屏读的数据总是无法返回开发板.原始及调试程序见下图: 在串口接收到从d ...

  7. 【资料分享】迪文屏使用经验分享

    DIWEN 写在前面的话 我的屏幕 显示图片 SD卡 FLASH分配 举例工程 Diwen ico生成工具 使用经验总结 写在前面的话 以下内容是本人在观看迪文科技在哔哩哔哩的教学视频所做的笔记 几乎 ...

  8. 迪文屏OS汇编代码开发-参数修改 保存 翻页(七)

    ; DWIN OS ;程序功能:上翻页,下翻页,参数修改,保存 ;软件环境: DWIN OS ASM Builder V1.5 ;硬件环境:DW K600+平台 ;变量 ;用户数据区地址从0x0600 ...

  9. 迪文屏的音乐播放文件配置

    针对T5L平台产品,WAE文件播放是通过生成软件将一个或多个WAV格式文件进行压缩,生成一个WAE文件(库),并将此文件存放在T5L的片内Flash中,开发者按需进行调用,最长可播放1024s.此功能 ...

最新文章

  1. TensorRT 加速性能分析
  2. 《移动项目实践》实验报告——Android Studio环境搭建
  3. 【笔记】顺序存储结构求二叉树深度
  4. VTK:图片之ImageAnisotropicDiffusion2D
  5. log4j日志文件 log4j.xml log4j.properties配置
  6. 数学建模(5)---煤矸石堆积问题
  7. Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据...
  8. java sctp_[编织消息框架][传输协议]sctp简单开发
  9. 使用Kotlin的Android AsyncTask
  10. 腾讯X5内核浏览器的使用
  11. c语言打印long double,C/C++printf输出int、long、longlong、double、longdouble、string等
  12. warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  13. 鸿蒙系统安兔兔,5摄镜头+鸿蒙系统!华为P40系列曝光
  14. 如何合并多个PDF文件?这几个小妙招快来码住吧
  15. 2022-2028年全球与中国印刷电路板材料行业产销需求与投资预测分析
  16. 软件测试工程师应届生工资,软件测试工程师薪水平均是什么水平?前景发展如何?...
  17. 软考成绩什么时候出?
  18. Golang底层原理剖析之上下文Context
  19. 在网页中调用iOS客户端
  20. GW1NSR-LV4CQN48GC6/I5 FPGA呼吸灯

热门文章

  1. Python之父加入微软:“我不是叛徒!”
  2. 2019年12月1号总结
  3. 凯撒加密的最简单的理解与实现(Java版)
  4. daemontools
  5. mysql 中文正则_MySQL
  6. 飞控简析-从入门到跑路 第三章姿态解算的比较
  7. 为了流量,何同学做了个“假B站”?
  8. QTP学习笔记之QTP基础知识总结整理
  9. nrf51822 --- 外部中断 (按键)
  10. 《老妈语录》 读后感