// samples are written to from one thread, and read from another (this one)
int fifoRead (int fifoBasePtr, int fifoPtrPtr, int fifoCheckBasePtr, int fifoCheckVal) {
  int *fifoBase;
  int *fifoPtr;
  int readData;
  int *fifoCheckBase;
  int readCheckData;

  fifoBase = (int *)(fifoBasePtr);
  fifoPtr  = (int *)(fifoPtrPtr);
  fifoCheckBase = (int *)(fifoCheckBasePtr);

  // Check the sample number
  readCheckData = fifoCheckBase[*fifoPtr];
  #if PRINT == PWM_FLOW_CHECK
    if (readCheckData != fifoCheckVal)
    {
      printstrln("PWM Fifo Checking failure");
      printstr("Expected: ");
      printintln(fifoCheckVal);
      printstr("Actual:   ");
      printintln(readCheckData);
      while(1);
    }
  #endif

  // now perform read
  readData = fifoBase[*fifoPtr];
  (*fifoPtr)++;
  (*fifoPtr) = (*fifoPtr) & PWM_FIFO_MASK;
  return (readData);

}
int media_input_fifo_enable(media_input_fifo_t media_input_fifo0,
                             int rate)
{
  volatile ififo_t *media_input_fifo =  (ififo_t *) media_input_fifo0;
  int packetSize;

  // This is the calculation of the SYT_INTERVAL
#ifndef AVB_1722_FORMAT_SAF
  // packetSize = (((rate+(AVB1722_PACKET_RATE-1))/AVB1722_PACKET_RATE) * 4) / 3;
  switch (rate)
  {
	   case 8000: 	packetSize = 1; break;
	   case 16000: 	packetSize = 2; break;
	   case 32000:	packetSize = 8; break;
	   case 44100:	packetSize = 8; break;
	   case 48000:	packetSize = 8; break;
	   case 88200:	packetSize = 16; break;
	   case 96000:	packetSize = 16; break;
	   case 176400:	packetSize = 32; break;
	   case 192000:	packetSize = 32; break;
	   default: printstrln("ERROR: Invalid sample rate"); break;
  }
#else
  packetSize = ((rate+(AVB1722_PACKET_RATE-1))/AVB1722_PACKET_RATE);
#endif
  media_input_fifo->rdIndex = (int) &media_input_fifo->buf[0];
  media_input_fifo->wrIndex = (int) &media_input_fifo->buf[0];
  media_input_fifo->startIndex = (int) &media_input_fifo->buf[0];
  media_input_fifo->dbc = 0;
  media_input_fifo->fifoEnd = (int) &media_input_fifo->buf[MEDIA_INPUT_FIFO_SAMPLE_FIFO_SIZE-1];
  media_input_fifo->sampleCountInPacket = 0;
  media_input_fifo->ptr = 0;
  media_input_fifo->packetSize = packetSize + 2; // two for the DBC and timestamp
  return packetSize;
}
示例#3
0
/**
 * @brief Connect to the flash. Should be called before any accessing the flash memory.
 * @return  0 if connecting was successful.
 */
int connect_to_flash(void) {
    int result = fl_connect(SPI_port);
    if (result != 0) {
        printstrln("Could not connect to flash memory");
    }
    return result;
}
示例#4
0
// xscope socket data handler
void xtcp_handle_xscope_tcp_event(chanend c_xtcp, xtcp_connection_t *conn)
{
  // Ignore events that are not directly relevant to tcp handler
  //printintln(conn->event);
  switch (conn->event) {
    case XTCP_IFUP:
    case XTCP_IFDOWN:
      conn_active = 0;
      return;
    case XTCP_ALREADY_HANDLED:
      return;
    default:
      break;
  }

  // Check if the connection is an client app connection
  if (conn->local_port == TCP_XSCOPE_PORT) {
    switch (conn->event) {
      case XTCP_NEW_CONNECTION:
        if (conn_active) {
          printstrln("a host connection is already active");
          xtcp_abort(c_xtcp, conn);
    	}
    	else
          conn_active = 1;
        break;
      case XTCP_RECV_DATA: {
          xtcp_recv(c_xtcp, (char *) &xscope_data);
          process_xscope_data(c_xtcp, xscope_data);
        }
        break;
      case XTCP_SENT_DATA:
      case XTCP_REQUEST_DATA:
      case XTCP_RESEND_DATA:
        tcp_send(c_xtcp, conn);
        break;
      case XTCP_TIMED_OUT:
      case XTCP_ABORTED:
      case XTCP_CLOSED:
        conn_active = 0;
        break;
      default:
        // Ignore anything else
        break;
      }
    conn->event = XTCP_ALREADY_HANDLED;
  }
  return;
}
示例#5
0
static void process_xscope_data(chanend c_xtcp, xscope_protocol xscope_data)
{
    /* Custom protocol definition
     * Start with cmd_type, send end_token as 0 as last
     * Listen:    0-dc-inport-proto-dc
     * Connect:   1-dc-out_port-proto-host_ipconfig
     * Send:      2-1-local_port-dc-remote_addr
     * Close:     2-2-local_port-dc-remote_addr
     */
#define CONTROLLER_IP	{169, 254, 196, 179}
#if !defined(CONTROLLER_IP)
#warning No define of form CONTROLLER_IP
#error Rebuild the application with this define assigned to the host controller ip
#endif

    xtcp_ipaddr_t ipaddr = CONTROLLER_IP;
    /*ipaddr[0] = atoi(xscope_data.ip_addr_1);
    ipaddr[1] = atoi(xscope_data.ip_addr_2);
    ipaddr[2] = atoi(xscope_data.ip_addr_3);
    ipaddr[3] = atoi(xscope_data.ip_addr_4);*/

    switch (xscope_data.cmd_type) {
      case XSCOPE_CMD_LISTEN: //listen; for server type conn
        xtcp_listen(c_xtcp, xscope_data.port_no, xscope_data.protocol);
        printstr("Listening on port: ");
        printintln(xscope_data.port_no);
      break;
      case XSCOPE_CMD_CONNECT: //connect; for client type conn
        xtcp_connect(c_xtcp, xscope_data.port_no, ipaddr, xscope_data.protocol);
        printstr("Connected to host on port: ");
        printintln(xscope_data.port_no);
      break;
      case XSCOPE_CMD_SEND: { //Send data
        int conn_id;
        xtcp_connection_t conn;
    	if (PROTO_TCP == xscope_data.protocol)
          conn_id = get_tcp_conn_id(ipaddr,  xscope_data.port_no);
    	else if (PROTO_UDP == xscope_data.protocol)
          conn_id = get_udp_conn_id(ipaddr,  xscope_data.port_no);

        if (conn_id) {
       	  conn.id = conn_id;
          xtcp_init_send(c_xtcp, &conn);
       	  printstr("Sending data on the connection: ");
       	  printintln(conn_id);
        }
      }
      break;
      case XSCOPE_CMD_CLOSE: { //Close command
        int conn_id;
        xtcp_connection_t conn;
        if (PROTO_TCP == xscope_data.protocol)
          conn_id = get_tcp_conn_id(ipaddr,  xscope_data.port_no);
        else if (PROTO_UDP == xscope_data.protocol)
          conn_id = get_udp_conn_id(ipaddr,  xscope_data.port_no);

    	if (conn_id) {
       	  conn.id = conn_id;
       	  xtcp_close(c_xtcp, &conn);
       	  printstr("Closing the connection: ");
       	  printintln(conn_id);
        }
      }
      break;
      case XSCOPE_CMD_CTRLR_SEND: //this is a controller send command; do nothing
      break;
      default:
        printstrln("unknown command received");
      break;
    }
}
示例#6
0
int decoderMain(chanend pcmChan, chanend rxChan, chanend mp3Reset)
{
	int bytesLeft, nRead, err, offset, outOfData, eofReached, nFrames;
	int reset;
	unsigned char readBuf[READBUF_SIZE], *readPtr;
	// unsigned char mp3_data
	// short outBuf[MAX_NCHAN * MAX_NGRAN * MAX_NSAMP];
	// short outBuf[256];

	MP3FrameInfo mp3FrameInfo;
	HMP3Decoder hMP3Decoder;
	
	if ( (hMP3Decoder = MP3InitDecoder()) == 0 )
	{
		return -2;
		// puts("Init died");
	}
	
	bytesLeft = 0;
	outOfData = 0;
	eofReached = 0;
	readPtr = readBuf;
	nRead = 0;

	nFrames = 0;
		
	do
	{
		
		bytesLeft = RxNewFrame(readBuf, READBUF_SIZE, rxChan, mp3Reset);
		if (bytesLeft == 0)
		{
			break;
		}
		readPtr = readBuf;
		
		/* decode one MP3 frame - if offset < 0 then bytesLeft was less than a full frame */
		
		err = MP3Decode(hMP3Decoder, &readPtr, &bytesLeft, NULL, 1, pcmChan);
		
		// err = MP3Decode(hMP3Decoder, &readPtr, &bytesLeft, NULL, 0, pcmChan);
		nFrames++;
		// printintln(nFrames);
		
		// Need to flush the PCM buffer for next frame decode
		// By outputting all ones to the channel
		// OutputToPCMBuf(0xffff, 0xffff, pcmChan);
		
		if (err)
		{
			/* error occurred */
			switch (err)
			{
			case ERR_MP3_INDATA_UNDERFLOW:
				printstrln("HERE");
				outOfData = 1;
				break;
			case ERR_MP3_MAINDATA_UNDERFLOW:
				/* do nothing - next call to decode will provide more mainData */
				break;
			case ERR_MP3_FREE_BITRATE_SYNC:
			default:
				outOfData = 1;
				// printintln(err);
				// printstrln("\nHERE2");
				// while (1);
				break;
			}
		}
		else 
		{
			/* no error */
			MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo);
		}

	} while (!outOfData);
	
	// printstr("FINISHED: ");
	// printintln(err);
	
	MP3FreeDecoder(hMP3Decoder);
	// printDebug(1, debugChan);
	
	return 0;
}
示例#7
0
// HTTP event handler
void tcp_handle_event(chanend tcp_svr, xtcp_connection_t *conn)
{
  // We have received an event from the TCP stack, so respond
  // appropriately

  // Ignore events that are not directly relevant to http
  switch (conn->event)
    {
    case XTCP_IFUP: {
      xtcp_ipconfig_t ipconfig;
      xtcp_get_ipconfig(tcp_svr, &ipconfig);

#if IPV6
      unsigned short a;
      unsigned int i;
      int f;
      xtcp_ipaddr_t *addr = &ipconfig.ipaddr;
      printstr("IPV6 Address = [");
      for(i = 0, f = 0; i < sizeof(xtcp_ipaddr_t); i += 2) {
        a = (addr->u8[i] << 8) + addr->u8[i + 1];
        if(a == 0 && f >= 0) {
          if(f++ == 0) {
            printstr("::");
           }
        } else {
            if(f > 0) {
              f = -1;
            } else if(i > 0) {
                printstr(":");
            }
          printhex(a);
        }
      }
      printstrln("]");
#else
      printstr("IP Address: ");
      printint(ipconfig.ipaddr[0]);printstr(".");
      printint(ipconfig.ipaddr[1]);printstr(".");
      printint(ipconfig.ipaddr[2]);printstr(".");
      printint(ipconfig.ipaddr[3]);printstr("\n");
#endif
      }
      return;
    case XTCP_IFDOWN:
    case XTCP_ALREADY_HANDLED:
      return;
    default:
      break;
    }

  // Check if the connection is a http connection
  if (conn->local_port == 80) {
    switch (conn->event)
      {
      case XTCP_NEW_CONNECTION:
        httpd_init_state(tcp_svr, conn);
        break;
      case XTCP_RECV_DATA:
        httpd_recv(tcp_svr, conn);
        break;
      case XTCP_SENT_DATA:
      case XTCP_REQUEST_DATA:
      case XTCP_RESEND_DATA:
          httpd_send(tcp_svr, conn);
          break;
      case XTCP_TIMED_OUT:
      case XTCP_ABORTED:
      case XTCP_CLOSED:
          httpd_free_state(conn);
          break;
      default:
        // Ignore anything else
        break;
      }
    conn->event = XTCP_ALREADY_HANDLED;
  }
  ////
  return;
}