/** * @brief serial init * @param none * @return return 0 : time out\n * return -1 : error\n * return N: file description */ int serial_init(int serial_num) { int fd; int ret; char buffer[100]; fd = open_serial_port(0); if(fd < 0) { perror("com opened error\n"); goto FAILED; } if((ret = set_serial_port_speed(fd, 115200)) < 0) { perror("set speed failed\r\n"); goto FAILED; } if((ret = set_serial_port_ctrl_flag(fd,8 ,1 ,'N')) < 0) { perror("set priority failed\r\n"); goto FAILED; } return fd; FAILED: close(fd); return -1; }
int init() { int result = open_serial_port(port_name); pthread_create(&serial_reader, NULL, serial_reader_func, NULL); hard_reset_to_user_code(); return result; }
int main(int argc, char **argv) { if (argc < 3) { usage(); exit(1); } char *port_name = argv[1]; char *file_name = argv[2]; if (open_serial_port(port_name) < 0) { return (1); } if (!download_begin(file_name)) { return 1; } while (!programming_done) { handle_port_input(); } close_serial_port(); return 0; }
int open_rfcomm(char *mac){ /* Bluetooth RFCOMMプロファイル接続を行います。 macは文字列が入ります。以下のような18バイト17文字の構成としてください。 char mac[] = "xx:xx:xx:xx:xx:xx"; // xxは2桁の16進数 ※セキュリティ対策のため、書式が異なると実行されません。 */ char s[64]; int i=0,ret=-1; if( strlen(mac) == 17){ // セキュリティチェック sprintf(s,"sudo /usr/bin/rfcomm connect /dev/rfcomm %s &",mac); for(i=2;i<17;i+=3) mac[i]=':'; // セキュリティ対策 for(i=0;i<17;i+=3){ if(isxdigit(mac[i])==0 || isxdigit(mac[i+1])==0 ) break; } // セキュリティチェック(16進数) } if(i==18){ printf("[%s]\n",s); system(s); for(i=0;i<15;i++){ sleep(1); // printf("( %d sec.) \n\x1b\x5b\x41",14-i); ret=open_serial_port(); if(ret >= 0) break; } }else fprintf(stderr,"Invalid Mac Address ERROR (i=%d,%c%c)\n",i,mac[i],mac[i+1]); return ret; }
int main(){ char s[32]; // 文字データ用 int len=0; // 文字長 char c; // 文字入力用の文字変数 int ctrl=0; // 制御用 0:先頭, -1~-3:「-」入力数 // 1:コマンド, 2:プログラム printf("Ichigo Term for Raspberry Pi\n"); if(open_serial_port() <= 0){ printf("UART OPEN ERROR\n"); return -1; } printf("CONNECTED\nHit '---' to exit.\nTX-> "); write(ComFd, "\x1b\x10 CLS\n", 7); // IchigoJamの画面制御 while(1){ if( kbhit() ){ c=getchar(); // キーボードからの文字入力 s[len]=c; // 入力文字を保持 if(len < 31) len++; // 最大長未満のときに文字長に1を加算 write(ComFd, &c, 1 ); // IchigoJamへ送信 if( ctrl<=0 && c =='-' ){ // 先頭かつ入力された文字が「-」の時 ctrl--; // ctrl値を1減算 if(ctrl <= -3) break; // 「-」が3回入力された場合に終了 }else if(ctrl==0){ if(isdigit(c)) ctrl=2; else ctrl=1; // 先頭に数値でプログラムと判定し、 } // そうで無い時はコマンド入力と判定 if(c=='\n'){ // 入力文字が改行の時 if(ctrl==2 || len==1) printf("TX-> "); // 無入力とプログラム入力時 ctrl=0; // 入力文字状態を「先頭」にセット len=0; usleep(250000); // 250msの(IchigoJam処理)待ち時間 } usleep(25000); // 25msの(IchigoJam処理)待ち時間 } c=read_serial_port(); // シリアルからデータを受信 if(c){ printf("\nRX<- "); // 受信を識別するための表示 while(c){ if( isprint(c) ) printf("%c",c); // 表示可能な文字の時に表示する if( c=='\n' ) printf("\n "); // 改行時に改行と5文字インデントする if( c=='\t' ) printf(", "); // タブの時にカンマで区切る c=read_serial_port(); // シリアルからデータを受信 } s[len]='\0'; printf("\nTX-> %s",s); // キーボードの入力待ち表示 } } printf("\nDONE\n"); close_serial_port(); return 0; }
gint do_timer(gpointer data) { if (port_timeout && --port_timeout == 0) { open_serial_port(gtk_entry_get_text(GTK_ENTRY(port_entry))); } if (baud_timeout && --baud_timeout == 0) { change_baud(gtk_entry_get_text(GTK_ENTRY( GTK_COMBO(baud_combo)->entry))); } if (download_in_progress) { download_timer(); } return TRUE; }
void ZigbeeSerialportService::connecting_serial_port() { if (open_serial_port() == -1) { if (net_) { ACE_Time_Value timeout; timeout.sec(5); net_->schedule_timer(this, 0, timeout); } } else { notify_serialport_connected(); } }
int init_uart_port(char * port) { if (!port) return FALSE; // 打开串口 g_fd = open_serial_port(port); if (g_fd == -1) { perror("open serial failed!\n"); return FALSE; } // 设置串口属性 set_speed(g_fd, UART_DEFAULT_BAUDRATE); if (set_parity(g_fd, 8, 1, 'N') == FALSE) //8位数据,非两位的停止位,不使用奇偶校验 ,不允许输入奇偶校验 { perror("set parity failed!\n"); return FALSE; } return TRUE; }
static int connect_device(const char *file) { int result; fprintf(stdout, TTY_NONE "Connect \"%s\"...", file); if ((result = open_serial_port(file))) return result; if ((result = reset_device(1))) return result; if ((result = handshake_device())) return result; device_buffer[0] = 0x00; if ((result = device_request(1))) return result; if ((result = device_response(13))) return result; device_version = device_buffer[1]; device_erase_command = device_buffer[8]; fprintf(stdout, TTY_NONE "V%1X.%1X...", device_version >> 4, device_version & 0x0F); device_buffer[0] = 0x02; if ((result = device_request(1))) return result; if ((result = device_response(3))) return result; if ((result = select_device(device_buffer[1] << 8 | device_buffer[2]))) return result; return DONE; }
int main(void) { pthread_t tid[2]; int t_error; struct MHD_Daemon *daemon; // Register signal and signal handler signal(SIGINT, signal_callback_handler); open_serial_port(); kill_power_led(); // start serial listener t_error = pthread_create(&tid[0], NULL, serial_read, NULL); fprintf(stderr, "Starting serial read thread\n"); if (0 != t_error) fprintf(stderr, "Couldn't run thread number %d, errno %d\n", 0, t_error); // start stdin_listener t_error = pthread_create(&tid[1], NULL, read_stdin, NULL); fprintf(stderr, "Starting stdin read thread\n"); if (0 != t_error) fprintf(stderr, "Couldn't run thread number %d, errno %d\n", 1, t_error); // start http daemon fprintf(stderr, "Starting httpd daemon\n"); //daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY, HTTPD_PORT, NULL, NULL, daemon = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION, HTTPD_PORT, NULL, NULL, &httpd_callback, NULL, MHD_OPTION_END); if (NULL == daemon) error("ERROR starting httpd"); // ..join a thread until backgrounding is implemented pthread_join(tid[0], NULL); return 0; }
int main(int argc, char** argv) { #ifdef DEBUG printf("Debug mode\n"); #endif printf("Opening port...\n"); SerialPort maestro; open_serial_port(&maestro, "/dev/ttyACM0"); printf("Port open with fd: %d\n", maestro.file_descriptor); unsigned const char data[] = "012341234"; printf("Sending %d bytes... ", (int)sizeof(data)); bool result; result = write_bytes(&maestro, data, sizeof(data)); if (result) { printf("Success\n"); } else { printf("Failure\n"); } printf("Closing port...\n"); close_serial_port(&maestro); printf("Port closed.\n"); return 0; }
/** Main function which starts the service, this will be an blocking function.If any error is there it returns immediately. * Returns immediately on error, else will be an blocking function. * @param port serial device port name. * @return error status of <b>open()</b> or <b>tcsetattr()</b>. * @note This is an blocking function, so it should be called from different thread. * * */ int gecko_start_serial_service(char * port) { init_serial_lock(); struct sigaction saio; saio.sa_handler = signal_callback_handler; sigemptyset(&saio.sa_mask); saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGINT, &saio, NULL); //char * port = "/dev/ttyUSB0"; LOGGER(LOG_DEBUG,"Using port %s", port); int fd = open_serial_port(port); if (fd == -1) { LOGGER(LOG_ERR,"error in open device %s",port); return EXIT_FAILURE; } if (configure_serial_port(fd) != -1) { if(LOG_LEVEL==LOG_DEBUG) read_display_current_configuration(fd); serial_write(fd, START_SCAN); LOGGER(LOG_DEBUG,"send start scan command to serial device\n"); start_serial_reader_thread(fd); } else { LOGGER(LOG_CRIT,"Error in opening serial port\n"); perror("error in configuring port"); } return EXIT_SUCCESS; }
void create_window(int *argc, char ***argv) { GList *gtk_baud_list=NULL; int i; gtk_init(argc, argv); firmware_label = gtk_label_new("Firmware:"); gtk_label_set_justify(GTK_LABEL(firmware_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(firmware_label); firmware_entry = gtk_entry_new(); gtk_widget_set_usize(firmware_entry, 110, 0); gtk_entry_set_text(GTK_ENTRY(firmware_entry), file_setting()); gtk_widget_show(firmware_entry); program_button = gtk_button_new_with_label("Program Now"); if (file_exists(file_setting())) { gtk_widget_set_sensitive(program_button, TRUE); } else { gtk_widget_set_sensitive(program_button, FALSE); } gtk_widget_show(program_button); line1_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(line1_hbox), firmware_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(line1_hbox), firmware_entry, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(line1_hbox), program_button, FALSE, FALSE, 2); gtk_widget_show(line1_hbox); port_label = gtk_label_new("Port:"); gtk_label_set_justify(GTK_LABEL(port_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(port_label); port_entry = gtk_entry_new(); gtk_widget_set_usize(port_entry, 80, 0); gtk_entry_set_text(GTK_ENTRY(port_entry), port_setting()); open_serial_port(port_setting()); gtk_widget_show(port_entry); baud_label = gtk_label_new("Baud:"); gtk_label_set_justify(GTK_LABEL(baud_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(baud_label); baud_combo = gtk_combo_new(); for (i=0; baud_list[i] != NULL; i++) { gtk_baud_list = g_list_append(gtk_baud_list, baud_list[i]); } gtk_combo_set_popdown_strings(GTK_COMBO(baud_combo), gtk_baud_list); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(baud_combo)->entry), FALSE); gtk_widget_set_usize(baud_combo, 75, 0); for (i=0; baud_list[i] != NULL; i++) { if (strcmp(baud_list[i], baud_setting()) == 0) { gtk_list_select_item(GTK_LIST(GTK_COMBO(baud_combo)->list), i); break; } } gtk_widget_show(baud_combo); line2_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(line2_hbox), port_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(line2_hbox), port_entry, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(line2_hbox), baud_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(line2_hbox), baud_combo, FALSE, FALSE, 2); gtk_widget_show(line2_hbox); crystal_label = gtk_label_new("Crystal:"); gtk_label_set_justify(GTK_LABEL(crystal_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(crystal_label); crystal_entry = gtk_entry_new(); gtk_widget_set_usize(crystal_entry, 80, 0); gtk_entry_set_text(GTK_ENTRY(crystal_entry), crystal_setting()); gtk_widget_show(crystal_entry); mhz_label = gtk_label_new("(MHz)"); gtk_label_set_justify(GTK_LABEL(mhz_label), GTK_JUSTIFY_LEFT); gtk_widget_show(mhz_label); line3_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(line3_hbox), crystal_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(line3_hbox), crystal_entry, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(line3_hbox), mhz_label, FALSE, FALSE, 2); gtk_widget_show(line3_hbox); reboot_button = gtk_button_new_with_label("Reboot"); gtk_widget_set_sensitive(reboot_button, TRUE); gtk_widget_show(reboot_button); bootloader_button = gtk_button_new_with_label("Booloader"); gtk_widget_show(bootloader_button); quit_button = gtk_button_new_with_label("Quit"); gtk_widget_show(quit_button); line4_hbox = gtk_hbox_new(TRUE, 2); gtk_box_pack_start(GTK_BOX(line4_hbox), reboot_button, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(line4_hbox), bootloader_button, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(line4_hbox), quit_button, TRUE, TRUE, 2); gtk_widget_show(line4_hbox); main_vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), line1_hbox, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), line2_hbox, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), line3_hbox, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), line4_hbox, TRUE, TRUE, 2); gtk_widget_show(main_vbox); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(GTK_CONTAINER(main_window), main_vbox); gtk_widget_show(main_window); }
int main(int argc, char *argv[]) { int tty_handle; unsigned char ch; int n; fd_set readfds; struct timeval to; int select_status; int char_delay = DEFAULT_CHAR_DELAY_uS; // struct termios old_tio, new_tio; const char port_str[]="-p"; const char baud_str[]="-b"; const char help_str[]="-h"; const char buffer_str[]="-n"; const char file_str[] = "-f"; const char delay_str[] = "-d"; unsigned int baudrate = DEFAULT_BAUD; char serialport[80] = DEFAULT_SERIAL_PORT; FILE *sf = NULL; char sendfile[80] = ""; int i; int status; signal(SIGINT, CtrlC_Handler); tcgetattr(STDIN_FILENO,&old_tio); new_tio=old_tio; new_tio.c_lflag &= ~(ECHO|ICANON); // Argument Parsing for (i=1;i<argc;i++) { if (!strcmp(argv[i],help_str)) { print_help(); exit(0); } else if (!strcmp(argv[i],port_str)) { sprintf(serialport,"%s",argv[i+1]); i++; } else if (!strcmp(argv[i],baud_str)) { baudrate = atoi(argv[i+1]); i++; } else if (!strcmp(argv[i],buffer_str)) { new_tio.c_lflag |= ICANON; } else if (!strcmp(argv[i],file_str)) { sprintf(sendfile,"%s",argv[i+1]); sf = fopen(sendfile,"r"); i++; } else if (!strcmp(argv[i],delay_str)) { char_delay = atoi(argv[i+1]); i++; if (!((char_delay>0)&&(char_delay<1000000))) { printf("Error: Invalid delay value - %s\n",delay_str); exit(1); } } else { printf("Error: bad option %s\n",argv[i]); printf("\"SerialT -h\" for list of options\n"); exit(0); } } if ((tty_handle = open_serial_port(serialport,baudrate)) == -1) { printf ("Error -> Could not open %s\n",serialport); exit(1); } tcsetattr(STDIN_FILENO,TCSANOW,&new_tio); while (1) { // Select Command Preparation FD_ZERO(&readfds); // clear the read file descriptor set g FD_SET(STDIN_FILENO,&readfds); // listen for stdin in the read desciptor set FD_SET(tty_handle,&readfds); // listen for stdin in the read desciptor set to.tv_sec = SELECT_TIMEOUT/1000000; // timeout seconds = 1s (total timeout = 1.5uS) to.tv_usec = SELECT_TIMEOUT%1000000; // timeout usec = .5s if (sf) { if (fread(&ch,1,1,sf)) { status=write(tty_handle,&ch,1); // send the character out the tty port if (status!=1) { printf("Error: Failed to write %c\n",ch); } tcdrain(tty_handle); // wait for the character to go usleep(char_delay); // delay between characters, give goofy some time to process chars } } // wait here until one of the selectors becomes active select_status=select(tty_handle+1,&readfds,(fd_set *)0,(fd_set *)0,&to); if (select_status==-1); // Select Error else if (select_status==0); // Select Timeout else { // Descriptor is ready for one of the members // Check to see which descriptor is active // STDIN Handler if (FD_ISSET(STDIN_FILENO,&readfds)) { if ((n=read(STDIN_FILENO,&ch,1))!=0) { status=write(tty_handle,&ch,1); // send the character out the tty port if (status!=1) { printf("Error: Failed to write %c\n",ch); } tcdrain(tty_handle); // wait for the character to go usleep(char_delay); // delay between characters, give goofy some time to process chars } } // Serial Port Handler if (FD_ISSET(tty_handle,&readfds)) { if ((n=read(tty_handle,&ch,1))!=0) { // grab the data from the tty if ((ch>=' ')&&(ch<='~')){ printf("%c",ch); } else if ((ch==0x0d)||(ch==0x0a)) { printf("\n"); } else { printf("\\x%02x",ch); } fflush(stdout); } } } } // Restore Terminal Parameters tcsetattr(STDIN_FILENO,TCSANOW,&old_tio); }
int main(int argc, const char* argv[]) { pid_t server_child = 0; int fd; int res = 0, status; struct sigaction sigchildAction; tio_param sParam [] = { {"D:", "DURATION", "Duration"}, { "m:", "PORTSPEED", "Prot speed"}, { "s:", "SENDPACKSLENGTH", "Send pack length"}, { "d", "SERVERMODE", "Server mode" }, { "l", "CLIENTMODE", "Client mode" }, { "L", "CLIENTSERVERMODE", "Client/Server mode" }, {NULL, NULL, NULL} }; sigchildAction.sa_handler = termination_signal; sigchildAction.sa_flags = SA_NOCLDSTOP; sigemptyset(&(sigchildAction.sa_mask)); sigaddset(&(sigchildAction.sa_mask),SIGTERM); if (sigaction(SIGTERM, &sigchildAction, NULL)) { perror("Signal SIGTERM registration failed"); return -1; } if (sigaction(SIGINT, &sigchildAction, NULL)) { perror("Signal SIGINT registration failed"); return -1; } // Инициализация tio и разбор входных параметров командной строки tioInit( "alpha", "RS232 test", sParam, argc, argv); if (write_configuration(&config)) { fputs("Congiguration read error\n", stderr); return -1; } fd = open_serial_port( tio_argv[0], tioGetDefL( "PORTSPEED", 115200 )); if (fd < 0) { return -1; } config.outputDevice = fd; if ( tioGetL( "CLIENTSERVERMODE" ) > 0 ) { server_child = fork(); } if ((server_child == 0) && (tioGetL( "CLIENTSERVERMODE" ) || tioGetL( "SERVERMODE" ) ) ) { if (server_process(&config)) { return -1; } } else if ( tioGetL( "CLIENTSERVERMODE" ) || tioGetL( "CLIENTMODE" )) res = client_process(&config); else { DEBUGMSG("Undefined target action"); return -1; } if (server_child != 0) waitpid(server_child, &status, WNOHANG); // Завершение работы библиотеки tio tioFinish(0); return (int)(res || status); /*return 0;*/ }
int main (int argc, char *argv[]) { int x, y; struct input_event ev[2]; struct input_event ev_button[2]; struct input_event ev_sync; if (argc < 2) { printf("Usage: %s serial-device [uinput-device]\n",argv[0]); exit(-1); } open_serial_port (argv[1]); // Open serial port set_serial_ops (); //configure serial port optionS // configure uinput if (argc > 3) setup_uinput_dev(argv[2]); else setup_uinput(); // Try 5 times to initialize screen: int n = 1; printf ("Attempting to initialize screen...\n"); while (initialize_panel ()) { n++; if (n > 5) { printf ("Too many failures, exiting\n"); exit (1); } } // input sync signal: memset (&ev_sync, 0, sizeof (struct input_event)); ev_sync.type = EV_SYN; ev_sync.code = 0; ev_sync.value = 0; // button press signals: memset (&ev_button, 0, sizeof (ev_button)); ev_button[0].type = EV_KEY; ev_button[0].code = BTN_LEFT; ev_button[0].value = 0; ev_button[1].type = EV_KEY; ev_button[1].code = BTN_LEFT; ev_button[1].value = 1; struct timeval tv_start_click; struct timeval tv_current; char click_state = 0; char first_click = 0; unsigned char buffer[4]; while (1) { // Should have select timeout, because finger down garantees many results.. struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; fd_set serial; FD_ZERO (&serial); FD_SET (fd_serial, &serial); // Use select to use timeout... if (select(fd_serial+1,&serial,NULL,NULL,&tv) < 1) { first_click=0; click_state =0; if (write(fd_uinput, &ev_button[click_state],sizeof (struct input_event)) < 0) die ("error: write"); // Sync if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); continue; } read (fd_serial, &buffer, sizeof (buffer)); if ((buffer[0] < 0xFD) || (buffer[3] != 0xFF)) { // Correct missed packets... if ((buffer[1] >= 0xFD) && (buffer[1] < 0xFF)) read(fd_serial, &buffer,3); if ((buffer[2] >= 0xFD) && (buffer[2] < 0xFF)) read(fd_serial, &buffer,2); if ((buffer[3] >= 0xFD) && (buffer[3] < 0xFF)) read(fd_serial, &buffer,1); continue; // make sure its a valid position command. } x = (int) ((buffer[1]) * 1024.0 / 0x5F); // max is 5F y = (int) ((buffer[2]) * 1024.0 / 0x48); // max is 48 int old_click_state = click_state; if (buffer[0] == 0xFD) click_state = 0; else click_state = 1; // If this is the first panel event, track time for no-drag timer if (click_state != old_click_state && click_state == 1) { first_click = 1; gettimeofday(&tv_start_click,NULL); } else first_click=0; // load X,Y into input_events memset (ev, 0, sizeof (ev)); //resets object ev[0].type = EV_ABS; ev[0].code = ABS_X; ev[0].value = x; ev[1].type = EV_ABS; ev[1].code = ABS_Y; ev[1].value = y; // send X,Y gettimeofday(&tv_current,NULL); // Only move to posision of click for first while - prevents accidental dragging. if (time_elapsed_ms(&tv_start_click,&tv_current,500) || first_click) { if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); } // clicking if (click_state != old_click_state) { if (write(fd_uinput, &ev_button[click_state],sizeof (struct input_event)) < 0) die ("error: write"); } // Sync if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error: write"); } // while 1 if (ioctl (fd_uinput, UI_DEV_DESTROY) < 0) die ("error: ioctl"); close (fd_uinput); return 0; }
int init_multiplex(const char *tty_dev) { return open_serial_port(tty_dev); }
int main(int argc, char **argv) { close_fds(); daemon(0, 0); open_log_file(); get_lock(); create_pipe(); int serial_fd = open_serial_port(); write (serial_fd, "$$$ALL,OFF\r", 11); usleep(200000); write (serial_fd, "$$$SPEED80\r", 11); //printf("STARTED - awaiting connections\n"); int listen_fd = listen_network(); char msg[256]; int msg_len; while (1) { msg_len = get_msg(listen_fd, msg, sizeof(msg) - 1); msg[msg_len] = '\0'; //printf("Msg:|%s|\n", msg); int batch; char *ptr = msg; while(msg_len) { batch = (msg_len > MAX_BATCH_SIZE ? MAX_BATCH_SIZE : msg_len); char c; int i, led_width = 0; for (i = 0; i < batch; i++) { c = *(ptr + i); if (c == 10) { led_width += 4; *(ptr + i) = ' '; } else if (c < 32) led_width += 0; else if (c > 128) led_width += 0; else if (c == 128) // Big empty square. led_width += 8; else if (c == 176) // temp symbol. led_width += 2; else if (strchr("ABCDEFGHKLMNOPQRSTUVWXYZmvwxz", c)) led_width += 6; else if (strchr("abcdefghknopqrsuyJ<>", c)) led_width += 5; else if (strchr(" 1I\"()jt[]`", c)) led_width += 4; else if (strchr(",.:;", c)) led_width += 3; else if (strchr("!il'", c)) led_width += 2; else { led_width += 6; } } write(serial_fd, ptr, batch); msg_len -= batch; ptr += batch; assert(msg_len >= 0); assert(ptr <= msg + sizeof(msg)); usleep(LED_HOLD_TIME * led_width); } } // Pause the scroll. //write(serial_fd, "$$$", 3); //write(serial_fd, "\r\r", 2); exit(0); }