目录
一、函数的使用
1.显示系统
1.1 mmap函数
2.输入系统
2.1 ts_setup()函数
2.2 ts_read()函数
2.3 socket()函数
2.4 bind()函数
2.5 recvfrom()函数
2.6 inet_aton()函数
2.7 sendto()函数
2.8 pthread_create()函数
2.9 pthread_cond_signal()函数
2.10 pthread_mutex_lockl()函数
3.文字系统
3.1 笛卡尔坐标系转换为LCD坐标系
3.2 atol()函数
二、错误记录
三、改进
3.1 按钮文字
3.2 支持配置文件的command
课程链接
一、函数的使用
1.显示系统
1.1 mmap函数
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
- 入参:
- addr: 入参,如果这个地址为null那么内核将自己为你指定一个地址,如果不为null,将使用这个地址作为映射区的起始地址;
- length: 映射区的大小(<=文件的大小);
- prot: 访问属性,一般用PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE;
- flags:这个参数是确定映射的更新是否对映射相同区域的其他进程可见,以及是否对基础文件进行更新;
- MAP_SHARED: 共享此映射,映射的更新对映射相同区域的其他进程可见;
- MAP_PRIVATE: 创建写时专用拷贝映射,映射的更新对映射的其他进程不可见,相同的文件,并且不会传递到基 础文件。 我们一般用MAP_SHARED,这两个权限是限制内存的,而不限制文件;
- fd: 被映射的文件句柄;
- offset: 默认为0,表示映射文件全部。偏移未知,需要时4K的整数倍。
- 返回值:
- 成功:被映射的首地址;
- 失败:MAP_FAILED (void *)-1。
2.输入系统
2.1 ts_setup()函数
struct tsdev *ts_setup(const char *dev_name, int nonblock)
- 入参:
-
dev_name:指定了触摸屏的设备节点,当 dev_name 设置为 NULL 时, ts_setup()函数内部会读取TSLIB_TSDEVICE 环境变量, 获取该环境变量的内容以得知触摸屏的设备节点;
-
nonblock:表示是否以非阻塞方式打开触摸屏设备。
-
- 返回值:
- 成功,返回一个 struct tsdev *指针, 指向触摸屏设备句柄;
- 失败,将返回 NULL。
2.2 ts_read()函数
struct ts_sample {
int x; //X 坐标
int y; //Y 坐标
unsigned int pressure; //按压力大小
struct timeval tv; //时间
};
int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr);
- 入参:
-
ts :指向一个触摸屏设备句柄;
-
samp:指向一个 struct ts_sample 对象;
-
nr :表示对一个触摸点的采样数
-
2.3 socket()函数
int socket(int domain, int type, int protocol);
- 入参:
-
domin : 用于指定一个通信域,这将选择将用于通信的协议族;
-
type:参数 type 指定套接字的类型;
-
protocol :参数 protocol 通常设置为 0,表示为给定的通信域和套接字类型选择默认协议。
-
- 返回值:
- 成功,返回用于文件 I/O 的文件描述符;
- 失败,会返回-1。
2.4 bind()函数
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 入参:
-
sockfd : 一个已打开的套接字的描述符;
-
addr:是一个指针,指向一个 struct sockaddr 类型变量,但是一般使用下面结构体;
struct sockaddr_in { sa_family_t sin_family; /* 协议族 */ in_port_t sin_port; /* 端口号 */ struct in_addr sin_addr; /* IP 地址 */ unsigned char sin_zero[8]; };
-
addrlen:指定了 addr 所指向的结构体对应的字节长度。
-
- 返回值:
- 成功,返回0;
- 失败,返回-1。
2.5 recvfrom()函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
- 入参:
-
sockfd:一个已打开的套接字的描述符;
-
buf:一个指针,指向用于存放接收到的数据的缓冲区;
-
len:缓冲区的大小(以字节为单位)。
-
flags:控制接收行为的标志,通常可以设置为0;
-
src_addr:一个指针,指向一个
sockaddr
结构,用于保存发送数据的源地址。 -
addrlen:一个值-结果参数。开始时,它应该设置为
src_addr
缓冲区的大小。当recvfrom()
返回时,该值会被修改为实际地址的长度(以字节为单位)。
-
- 返回值:
- 在成功的情况下,
recvfrom()
返回接收到的字节数。 - 如果没有数据可读或套接字已经关闭,那么返回值为0。
- 出错时,返回
-1
,并设置全局变量errno
以指示错误类型。
- 在成功的情况下,
2.6 inet_aton()函数
int inet_aton(const char *cp, struct in_addr *inp);
- 入参:
-
cp:网络主机地址ip(如192.168.1.10)为二进制数值;
-
inp:存储在struct in_addr结构中;
-
- 返回值:
- 成功,返回非0;
- 出错时,返回0。
2.7 sendto()函数
1 int sendto(int s, const void *buf, int len, unsigned int flags,
2 const struct sockaddr *to, int tolen);
- 入参:
-
s: socket描述符;
-
buf:UDP数据报缓存区(包含待发送数据);
-
len: UDP数据报的长度;
-
flags:调用方式标志位(一般设置为0);
-
to: 指向接收数据的主机地址信息的结构体(sockaddr_in需类型转换);
-
tolen:to所指结构体的长度;
-
- 返回值:
- 成功则返回实际传送出去的字符数;
- 失败返回-1,错误原因会存于errno 中。
2.8 pthread_create()函数
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
- 入参:
-
thread:用于存储新线程标识符的变量;
-
attr:用于设置新线程属性的指针,通常可以传入
NULL
以使用默认属性; -
start_routine: 新线程的入口函数,是线程执行的起点;
-
arg:传递给入口函数
start_routine
的参数.
-
- 返回值:
- 若线程创建成功,返回0。
- 若线程创建失败,返回非0的错误码。
2.9 pthread_cond_signal()函数
int pthread_cond_signal(pthread_cond_t *cond);
- 入参:
-
cond:条件变量
-
- 返回值:
- 成功:返回0;
- 失败:返回非0。
2.10 pthread_mutex_lockl()函数
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 入参:
-
mutex
:是一个指向互斥锁变量的指针。
-
- 返回值:
- 成功:返回0;
- 失败:返回非0。
3.文字系统
3.1 笛卡尔坐标系转换为LCD坐标系:
LCD_y = LCD垂直高 - 笛卡尔_y;
LCD_x = LCDx;
3.2 atol()函数
long atol(const char *nptr);
atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
返回转换后的长整型数。
atol()与使用strtol(nptr,(char**)NULL,10);结果相同。
二、错误记录
对于while循环中的赋值要谨慎,不然就会出现段错误
上面的代码中
g_DispDevs = pTmp;
应该为
g_DispDefault = pTmp;
三、改进
3.1 按钮文字
计算文字大小
1.找出name最长的Button
1.以font_size = 100,算出它的外框
1.把文字的外框缩放为Button的外框
1.反算出font_size,只取0.80,避免文字过于接近边界
计算文字外框
static int FreetypeGetStringRegionCar(char *str, PRegionCartesian ptRegionCartesian)
算出第一个字符的origin
3.2 支持配置文件的command
sprintf()函数:用来作格式化的输出。
#include <stdio.h> //头文件
int sprintf(char* str, const char* format, ...);
- 入参:
-
str:指向要写入的字符串的指针。
-
format:包含格式控制符的字符串,用于指定输出的格式。
-
...:可变参数列表,根据格式化字符串中指定的格式进行输出
-
system()
函数:
在Linux系统中,system()
是一个标准C库函数,用于执行一个系统命令或者shell脚本。调用该函数之后,程序将启动一个新的Shell进程来运行指定的命令,并且等待命令执行完毕返回结果。
int system(const char *command)
- 入参:
-
command:要执行的命令
-
课程链接
8-3_改进_支持配置文件的command_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1it4y1Q75z/?p=33&vd_source=3a9afee9fda50350a1c881b4325e007d