/* * (c) 2011 Siegen, Germany by Nils Faerber * * license GPL */ #include #include #include #include #include #include #include #include #include #include "metawatch_protocol.h" #include "crc16ccitt.h" void dump_frame(unsigned char *frame, int len) { int i; for (i=0; i= 0) && (tlen > 0)) tlen -= ret; if (tlen == 0 && ret >= 0) return 0; else return ret; } void mw_set_rtc(int mw_fd, unsigned char clk1224, unsigned char date_fmt) { time_t mtime; struct tm mtm; unsigned short year; unsigned char data[32]; mtime = time(NULL); localtime_r(&mtime, &mtm); year = mtm.tm_year + 1900; data[0] = (year & 0x0f00) >> 8; data[1] = (year & 0x00ff); data[2] = mtm.tm_mon + 1; data[3] = mtm.tm_mday; data[4] = mtm.tm_wday; data[5] = mtm.tm_hour; data[6] = mtm.tm_min; data[7] = mtm.tm_sec; data[8] = clk1224; data[9] = date_fmt; mw_send_packet(mw_fd, MW_SET_REAL_TIME_CLOCK, 0, data, 10); } 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; } int main(int argc, char **argv) { int mw_fd; if (argc != 2) { fprintf(stderr, "Usage:\n\t%s \n", argv[0]); return 1; }; crc16ccitt_init(); mw_fd = open(argv[1], O_RDWR); if (mw_fd < 0) { perror("open"); return 1; }; menu(mw_fd); fsync(mw_fd); close(mw_fd); return 0; };