Exemple #1
0
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
}
Exemple #2
0
//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
}
Exemple #3
0
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
}