void *reciever_thread(void *flags_ptr){ int flags = *((int*)flags_ptr); //extract the flags printf("entered thread\n"); //test print //setup the scoket int sock = socket(PF_INET, SOCK_DGRAM, 0); // setup UDP socket struct sockaddr_in addr, client; addr.sin_family = AF_INET; addr.sin_port = htons(INPUT_PORT); //convert to correct byte format addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sock, (struct sockaddr*)&addr, sizeof(addr)); char ack = 0; int len = sizeof(client); //read data from while(!kill_flag){ if(!BUFFER_FULL(in_buff_start, in_buff_end)){ //read data if space is available //printf("Waiting\n"); int bytes = recvfrom(sock, input_buffer+(in_buff_end*frame_size),frame_size, 0,\ (struct sockaddr *)&client, &len); //get an input packet if(bytes > 0){ //printf("Recieved %d bytes\n", bytes); in_buff_end = (in_buff_end + 1) % MAX_BUFFER; //printf("buffer: (%d, %d, %d)\n", in_buff_start, in_buff_end, BUFFER_SIZE(in_buff_start,in_buff_end)); bytes = sendto(sock, &ack, 1, 0, (struct sockaddr *)&client,sizeof(client)); //printf("sent %d bytes\n", bytes); } } } close(sock); pthread_exit(NULL); //exit thread safetly }
//function for recieving audio void *reciever_thread(void *ptr){ audiobuffer* buf = ((comms_package*)ptr)->buf; //extract the buffer int port = ((comms_package*)ptr)->port; //get the port int* flag = ((comms_package*)ptr)->flag; //get the kill flag free(ptr); //free the package's memory //setup the scoket int sock = socket(PF_INET, SOCK_DGRAM, 0); // setup UDP socket if(sock == 0) printf("Error, couldn't create reciever\n"); //report the error struct sockaddr_in addr, client; //create address structs for socket/clients addr.sin_family = AF_INET; //using internet protocols addr.sin_port = htons(port); //convert to correct byte format addr.sin_addr.s_addr = htonl(INADDR_ANY); //socket is server, must accept any connection if(bind(sock, (struct sockaddr*)&addr, sizeof(addr))) //bind socket printf("Error, couldn't bind read socket: %s\n", strerror(errno)); //report the error struct timeval tv; //setup the timeout tv.tv_sec = 1; tv.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)); //set the timeout int true = 1; setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)); //allow socket reuse char ack = 0; //define an ack message (have to give pointer) int len = sizeof(client); //recieve needs struct length to get client info char decode_buf[buf->per_size]; //allocate buffer for recieving data pre decode //read data from socket until killed while(!(*flag) && !global_kill){ if(!BUFFER_FULL(*buf)){ //read data if space is available int bytes = recvfrom(sock, decode_buf, buf->per_size, 0, (struct sockaddr *)&client, &len); //get an input packet //int bytes = recvfrom(sock, GET_QUEUE_TAIL(*buf), buf->per_size, 0, (struct sockaddr *)&client, &len); //get an input packet //printf("%d\n",bytes); if(bytes > 0){ //ack successful packets, report error otherwise decode(decode_buf, GET_QUEUE_TAIL(*buf), bytes); //decode the input //write(stdout, GET_QUEUE_TAIL(*buf), buf->per_size); //DEBUG INC_QUEUE_TAIL(*buf); //increment if successful //bytes = sendto(sock, &ack, 1, 0, (struct sockaddr *)&client,sizeof(client)); //send an ack //printf("got packet: %d\n",bytes); } else printf("Error, bad socket read: %s\n", strerror(errno)); //report the error //printf("buffer: (%d, %d, %d)\n", buf->start, buf->end, BUFFER_SIZE(*buf)); } else { printf("Reciever Waiting\n"); usleep(PERIOD_UTIME/2); } } close(sock); free_buffer(buf); printf("Audio Controller: Reciever Thread shutdown\n"); pthread_exit(NULL); //exit thread safetly }
void CTP_interrupt(void) { REG_INT_FSIF01 = FSRX1 | FSERR1; // clear the interrupt while (0 != (REG_EFSIF1_STATUS & RDBFx)) { register uint32_t c = REG_EFSIF1_RXD; if (0xaa == c) { touch_state = STATE_X_HIGH; } else if (0 != (0x80 & c) && (0xff != c)) { touch_state = STATE_WAITING; } else { switch (touch_state) { case STATE_WAITING: break; case STATE_X_HIGH: if (0xff != c) { x = c << 7; } ++touch_state; break; case STATE_X_LOW: if (0xff != c) { x |= c; } ++touch_state; break; case STATE_Y_HIGH: if (0xff != c) { y = c << 7; } ++touch_state; break; case STATE_Y_LOW: if (0xff != c) { y |= c; } ++touch_state; break; case STATE_TOUCH: if (!BUFFER_FULL(CTPwrite, CTPread, CTPbuffer)) { if (0x01 == c) { CTPbuffer[CTPwrite].x = x; CTPbuffer[CTPwrite].y = y; CTPbuffer[CTPwrite].pressed = true; CTPbuffer[CTPwrite].ticks = Tick_get(); BUFFER_NEXT(CTPwrite, CTPbuffer); } else if (0x00 == c) { CTPbuffer[CTPwrite].x = x; CTPbuffer[CTPwrite].y = y; CTPbuffer[CTPwrite].pressed = false; CTPbuffer[CTPwrite].ticks = Tick_get(); BUFFER_NEXT(CTPwrite, CTPbuffer); } } touch_state = STATE_WAITING; break; } } } REG_EFSIF1_STATUS = 0; // clear errors }