📄 ctrl0.c
字号:
#include "cmd.h"#include "tty.h"#include "ctrl.h"#include <sys/poll.h>#include <signal.h>#define V 10int fd;struct termios tio;char buf[16];char rbuf[16];inline void msend(void *buf, int n) { int t; if ((t = write(fd, buf, n)) != n) { if (t == -1) perror("write"); else fprintf(stderr, "write error %d\n", t); exit(-1); }}inline void cleanup() { buf[0] = STOP; write(fd, buf, 1); tcsetattr(0, TCSANOW, &tio); printf("\nclean up\n");}int main() { // init ttys if ((fd = ttys_init(0)) < 0) { return -1; } // init ctrl if (ctrl_init(fd) < 0) { return -1; } // init tty (key control) tty_set(&tio); // clean up at exit if (atexit(cleanup)) { fprintf(stderr, "atexit error\n"); return -1; } // clean up at ^c exit if (signal(SIGINT, exit) == SIG_ERR) { fprintf(stderr, "signal error\n"); return -1; } struct pollfd ufds[2] = {{0, POLLIN}, {fd, POLLIN}}; unsigned char sn = 1; unsigned char bsn = 1; int res_n = 0; for (;;) { if (poll(ufds, 2, -1) <= 0) { fprintf(stderr, "poll error\n"); exit(-1); } if (ufds[1].revents & POLLIN) { int n; if ((n = read(fd, rbuf + res_n, sizeof(rbuf) - res_n)) == -1) { perror("read"); exit(-1); } n += res_n; res_n = 0; int i = 1; for (;;) { int type = rbuf[i] & 0xc0; int k = rbuf[i] & 0x3f; if (k > 7) { fprintf(stderr, "echo len too long\n"); print_buf(rbuf, n); exit(-1); } if (i + k >= n + 2) { // current len not enough printf("notice: complex \n"); print_buf(rbuf, n); res_n = n + 1 - i; copy_buf(rbuf, rbuf+i-1, res_n); printf("move trailing %d bytes\n", res_n); print_buf(rbuf, res_n); break; } switch (k) { case 2: if (type != 0) { fprintf(stderr, "echo error 2\n"); print_buf(rbuf, n); exit(-1); } printf("echo 2: %x\n", sn); break; case 4: if (rbuf[i-1] != sn || type != 0) { fprintf(stderr, "echo error 4\n"); print_buf(rbuf, n); exit(-1); } printf("echo 4: %x v1=%d v2=%d\n", sn, rbuf[i+1], rbuf[i+2]); break; case 5: printf("IR: %x\n", sn); //printf("IR: %d %d %d %d\n", rbuf[i+1], rbuf[i+2], rbuf[i+3], rbuf[i+4]); break; case 6: if (!(type == 0 || type == M_RD)) { fprintf(stderr, "echo error 6\n"); print_buf(rbuf, n); exit(-1); } if (type == M_RD) { printf("RD: %x\n", sn); //printf("RD: %d %d %d %d\n", rbuf[i+1], rbuf[i+2], rbuf[i+3], rbuf[i+4]); } else { bsn = sn; printf("echo 6: %x\n", sn); //printf("clear: %d %d %d %d\n", rbuf[i+1], rbuf[i+2], rbuf[i+3], rbuf[i+4]); } break; case 7: if (type != 0) { fprintf(stderr, "echo error 7\n"); print_buf(rbuf, n); exit(-1); } bsn = sn; printf("echo 7: %x\n", sn); //printf("dirty: %d %d %d %d\n", rbuf[i+2], rbuf[i+3], rbuf[i+4], rbuf[i+5]); break; default: printf("what is this?\n"); print_buf(rbuf, n); exit(-1); } i += k; if (i > n) break; else if (i == n) { // trailing 1 res_n = 1; rbuf[0] = rbuf[n-1]; break; } } } if (ufds[0].revents & POLLIN) { char c; if (read(0, &c, 1) != 1) { fprintf(stderr, "read error\n"); exit(-1); } switch (c) { case 4: case 'q': exit(0); case 'p': case ' ': printf("stop\n"); buf[0] = STOP; msend(buf, 1); break; case 'k': printf("k\n"); buf[0] = HEAD2; buf[1] = V; buf[2] = V; buf[3] = AA; msend(buf, 4); ++sn; break; case 'j': printf("j\n"); buf[0] = HEAD2; buf[1] = -V; buf[2] = -V; buf[3] = AA; msend(buf, 4); ++sn; break; case 'h': printf("h\n"); buf[0] = HEAD2; buf[1] = -V; buf[2] = V; buf[3] = AA; msend(buf, 4); ++sn; break; case 'l': printf("l\n"); buf[0] = HEAD2; buf[1] = V; buf[2] = -V; buf[3] = AA; msend(buf, 4); ++sn; break; case 'r': printf("r\n"); buf[0] = RV; msend(buf, 1); ++sn; break; case 'i': printf("i\n"); buf[0] = IR; msend(buf, 1); ++sn; break; default: printf("key undefined: %c\n", c); } } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -