+void process_cmd(char *cmdline, int clinep, int mw_fd)
+{
+ fprintf(stderr, "command: '%s'\n", cmdline);
+
+ if (strncmp(cmdline, "quit", 4) == 0) {
+ close(mw_fd);
+ exit(0);
+ }
+
+ if (strncmp(cmdline, "srtc", 4) == 0) {
+ fprintf(stderr, "Setting RTC from system time...");
+ mw_set_rtc(mw_fd, MW_RTC_CLOCK_24HR, MW_RTC_DATE_DDMM);
+ fprintf(stderr, "OK\n");
+ }
+}
+
+int menu(int mw_fd)
+{
+ fd_set mfds;
+ struct termios tconfd;
+ char cmdline[128];
+ unsigned char msg_buf[64];
+ unsigned char clinep = 0;
+ int rcvd;
+
+ tcgetattr(0, &tconfd);
+ cfmakeraw(&tconfd);
+ tconfd.c_oflag |= ONLCR | OPOST;
+ tconfd.c_lflag |= ISIG;
+ tcsetattr(0, TCSANOW, &tconfd);
+ FD_ZERO(&mfds);
+ FD_SET(0, &mfds);
+ FD_SET(mw_fd, &mfds);
+
+ memset(cmdline, 0, 128);
+
+ do {
+ rcvd = 0;
+ if (select(mw_fd+1, &mfds, NULL, NULL, NULL) > 0) {
+ if (FD_ISSET(mw_fd, &mfds)) {
+ rcvd = read(mw_fd, msg_buf, 64);
+ printf("read %d bytes:\n", rcvd);
+ if (rcvd > 0) {
+ dump_frame(msg_buf, rcvd);
+ // decode_message(mw_fd, msg_buf, rcvd);
+ }
+ };
+ if (FD_ISSET(0, &mfds)) {
+ rcvd = read(0, (cmdline+clinep), 1);
+ if (rcvd > 0) {
+ if (cmdline[clinep] == '\r') {
+ printf("\n");
+ cmdline[clinep--] = '\0';
+ process_cmd(cmdline, clinep, mw_fd);
+ clinep = 0;
+ memset(cmdline, 0, 128);
+ } else {
+ clinep++;
+ if (clinep > 75)
+ clinep = 75;
+ printf("\r> %s", cmdline);
+ fflush(stdout);
+ }
+ }
+ };
+ } else
+ break;
+ FD_ZERO(&mfds);
+ FD_SET(0, &mfds);
+ FD_SET(mw_fd, &mfds);
+ } while (rcvd > 0);
+
+ return 0;
+}
+