static void * uart_send_worker(void * arg) { message_t * message ; struct timeval now; while(1) { while(queue_dequeue(context->send_queue,(void **)&message) != 0) { usleep(1000); continue; } gettimeofday(&now,NULL); if((now.tv_sec - message->stamp.tv_sec) > 10) { free_message(message); continue; } LOG_DEBUG("############################[%s] data:%p, length:%d", __func__, message->data, message->length); view_message(message); //此串口需要串口化 uart_dev_t * dev = (uart_dev_t *)message->dev; if(dev->flags & SERIALIZE_MASK) { if(pthread_mutex_trylock(&dev->serial_lock) == 0) { raw_uart_send(dev->fd, message); free_message(message); } else { queue_enqueue(context->send_queue,message); } } else { raw_uart_send(dev->fd, message); free_message(message); } usleep(1000); } return NULL; }
void * socket_uart_recv_manager(void * arg) { int listen_fd = open_server_socket(UNIX_SOCKET_UART_RECV); pthread_t real_recv; int result = pthread_create(&real_recv, NULL, uart_recv_worker, NULL); assert(result == 0); socklen_t len = -1; struct sockaddr_un clt_addr; int com_fd = -1; while(1) { len = sizeof(clt_addr); com_fd = accept(listen_fd,(struct sockaddr*)&clt_addr,&len); if(com_fd < 0) { perror("cannot accept client connect request"); close(listen_fd); unlink(UNIX_SOCKET_UART_SEND); exit(-1); } int n = 0; uint8_t recv_buf[MAX_BUFSIZ]; if( (n = read(com_fd,recv_buf,sizeof(recv_buf))) < 0) { LOG_ERROR("[%s] Read Error\n",__func__); } if(is_invalid_message((char *)recv_buf, n)) { process_message_invalid_message(com_fd); close(com_fd); } else { message_t * message = deserialized_message(recv_buf,n); #if 0 LOG_DEBUG("XXXXXXXXXXXXXXXXXXXXXXXXXXXX"); view_message(message); LOG_DEBUG("____________________________"); #endif uart_dev_t * dev = get_dev_by_name(message->name); if(dev == NULL) { process_message_invalid_name(com_fd, message->name); close(com_fd); } else { struct timeval now; gettimeofday(&now,NULL); message_t * fit = NULL; socket_recv_handler * process_socket_recv = get_socket_recv_handler_by_protocol(dev->protocol); process_socket_recv->func(dev, message, &fit); if((fit == NULL)) { process_message_not_fit(com_fd); } else if((now.tv_sec - fit->stamp.tv_sec) > 10) { free_message(fit); process_message_not_fit(com_fd); } else { process_message_fitted(com_fd, fit); } free_message(message); close(com_fd); } } } return NULL; }
static int keypress(Screen *this_screen, int cur_key){ switch (cur_key) { case KEY_Betty: case KEY_Menu: popup( "A All\n playlists\n\n" "B Current\n playlist\n\n" "C Search\n\n" "D \n\n" "i Info", 0, keypress_popup); break; case KEY_Exit: show_screen(TRACKLIST_SCREEN); break; case KEY_A: show_screen(PLAYLIST_SCREEN); break; case KEY_B: show_screen(TRACKLIST_SCREEN); break; case KEY_C: show_screen(SEARCH_SCREEN); break; case KEY_Info: popup("Red = Stop\n" "Green = Play\n" "Yellow = Pause\n" "PiP = Random\n" "A/B = Repeat\n" "16:9 = Single\n" "\xB1 = Seek Back\n" "\xB0 = Seek FWD\n" "\xB2 = Next Song\n" "\xB3 = Prev. Song\n" "TV = Version", 0, keypress_info_popup); break; case KEY_Left: user_wants_time_add(-10); break; case KEY_Right: user_wants_time_add(+10); break; case KEY_Up: case KEY_Pminus: user_wants_song(PREV_SONG); break; case KEY_Down: case KEY_Pplus: user_wants_song(NEXT_SONG); break; case KEY_Red: user_wants_state(STOP); break; case KEY_Green: user_wants_state(PLAY); break; case KEY_Yellow: user_toggle_pause(); break; case KEY_PiP: user_toggle_random(); break; case KEY_AB: user_toggle_repeat(); break; case KEY_16_9: user_toggle_single(); break; case KEY_VTX1: user_wants_script(1); break; case KEY_VTX3: user_wants_script(2); break; case KEY_TV: view_message(" McBetty\n\n" "Version "VERSION"\n\n\n" " (c) 2010\n H. Raap", 5 * TICKS_PER_SEC); break; default: return cur_key; // we could not handle key }; return NO_KEY; };