Example #1
0
void fm_gets(unsigned char *s, unsigned long len)
{
  unsigned long head, tail;

  head = fm_head;
  tail = fm_tail;

  if(head != tail)
  {
    FM_CS_ENABLE();
    ssi_write(FM_READ);
    ssi_write(tail>>16);
    ssi_write(tail>>8);
    ssi_write(tail);
    ssi_wait();
    while(len--)
    {
      if(head != tail)
      {
        *s++ = ssi_readwrite(0xff);
        if(++tail >= fm_bytes)
        {
          tail = 0;
        }
      }
      else
      {
        break;
      }
    }
    FM_CS_DISABLE();
    fm_tail = tail;
  }
Example #2
0
static __x UREG GET_hook_DATA_RX(UREG len, UINT8 *data, GET_SOCK *s)
{
  UREG c;
  UREG state=s->state;
  UINT32 pWR;      
  UINT16 bl;
  pWR = MP3fifo_pWR; // Голова    
    
  if (state==_GET_BODY) // Заходим сюда - если идет прием тела
  {    
    if (PLAYER_STATE!=PLAYER_STATE_PLAYING) 
    {      
      if (PLAYER_STATE!=PLAYER_STATE_BUFFERING) LCD_fprintline(1,"Buffering");     
      PLAYER_STATE=PLAYER_STATE_BUFFERING;
    }
L_BODY:
  {
    UREG addr;
    FM_CS_ENABLE();   // Выбираем FRAM
    SPDR=FM_WREN;     // Разрешаем запись
    while (!(SPSR & (1<<SPIF)));               
    FM_CS_DISABLE();
    FM_CS_ENABLE();   // Выбираем FRAM
    SPDR=FM_WRITE;    // Операция - "запись"
    addr=(UREG)(pWR>>16);
    while (!(SPSR & (1<<SPIF)));
    SPDR=addr;  // Начальный адрес - голова [24..16]
    addr=(UREG)(pWR>>8);
    while (!(SPSR & (1<<SPIF)));       
    SPDR=addr;  // Начальный адрес - голова [15..8]
    addr=(UREG)(pWR);
    while (!(SPSR & (1<<SPIF)));
    SPDR=addr;    //Начальный адрес - голова [7..0]    
    while (!(SPSR & (1<<SPIF)));    
  }
L_BODY2:    
    //Быстрая обработка данных тела
    if (!len) goto GET_hook_DATA_RX_exit;
    bl=s->block_length; // "вспомним" размер блока мета-данных        
    do
    {            
      UREG c=*data++; //читаем очередной байт тела
      if (bl) //Только если мы знаем, что метаданные присутствуют
      {	
	if (!(--bl))
	{
	  //Блок закончился, в c - размер метаданных
          if (!c)                          // Длина метаданных 0 (их нет)
          {
//             META_len=0;
//             pMETA_buf=&META_buf[0];
             bl=s->metadata_interval;
             s->block_length=bl;
             continue;
          }
          s->state=state=_GET_METADATA;
          s->block_length=c*16;           // рассчитаем и запомним длину блока с мп3 данными
	  len--;
          LCD_putMETA(0,0); 
	  goto L_METADATA;                // идем на обработку метаданных
	}
      }      
        UREG f=0;
        SPDR = c; // Записали байт в FIFO      
        pWR += 1; // Сдвигаем голову        
        if (pWR > MP3fifo_pEND) f=1;
	while (!(SPSR & (1<<SPIF))); // wait SPI comm. finished 
	if (f) 
        {
          UREG addr;
          pWR=MP3fifo_pSTART; // дошли до крайней ячейки - надо перепрыгивать вниз                
          FM_CS_DISABLE();
          FM_CS_ENABLE();   // Выбираем FRAM
          SPDR=FM_WREN;     // Разрешаем запись
          while (!(SPSR & (1<<SPIF)));               
          FM_CS_DISABLE();
          FM_CS_ENABLE();   // Выбираем FRAM
          SPDR=FM_WRITE;    // Операция - "запись"
          addr=(UREG)(pWR>>16);
          while (!(SPSR & (1<<SPIF)));
          SPDR=addr;  // Начальный адрес - голова [24..16]
          addr=(UREG)(pWR>>8);
          while (!(SPSR & (1<<SPIF)));       
          SPDR=addr;  // Начальный адрес - голова [15..8]
          addr=(UREG)(pWR);          
          while (!(SPSR & (1<<SPIF)));
          SPDR=addr;    //Начальный адрес - голова [7..0]    
          while (!(SPSR & (1<<SPIF)));  
        }	
    }
    while(--len);
    s->block_length=bl;    

GET_hook_DATA_RX_exit:
    
    FM_CS_DISABLE();
    MP3fifo_pWR = pWR;        
    // Записали пакет
    // Теперь высчитываем оставшееся место в буфере FRAM 
    // Устанавливаем размер окна сокета равный числу свободных байт в буфере FRAM
    UINT32 freeFIFO=_MP3fifo_free();
    if (freeFIFO < TCP_MAX_DATA_LEN)
    {   
      // считаем что в FIFO места уже нет - обнуляем окно
      // соответственно можно начать играть в основном цикле
      GET_WINDOW_STATE=GET_WINDOW_STATE_ZERO;
      freeFIFO=0; 
      #ifdef CONSOLE_DEBUG
      _print_fstr("\r\nZEROWIN");
      #endif
    }    
    else if (freeFIFO>=SPEC_MAX_WIN) freeFIFO=SPEC_MAX_WIN;
//    else if (freeFIFO>=(0xFFFF-512)) freeFIFO=0xFFFF;
//    else freeFIFO+=512;
    s->sock.win=htons((UINT16)(freeFIFO)); // меняем размер окна
    return 0; // Данные тела кончились - выходим...
  }
  if (state==_GET_METADATA)
  {
  L_METADATA:
    //Быстрая обработка метаданных
    if (!len) goto GET_hook_DATA_RX_exit;//{FM_CS_DISABLE(); return 0;}
    bl=s->block_length;
    do
    {
      if (!(--bl))
      {
	//Блок закончился, в c - размер метаданных
	s->state=state=_GET_BODY;
	s->block_length=s->metadata_interval;
	len--;
	goto L_BODY2;
      }
      UREG c=*data++;
     //Тут можно накапливать байты метаданных, если надо
     //UDR=c; // выводим в консоль
//     if (META_len++<31) *pMETA_buf++=c;
     LCD_putMETA(1,c); 
    }
    while(--len);
    s->block_length=bl;
  }
  // Идет прием... 
  if (!len) goto GET_hook_DATA_RX_exit;//{FM_CS_DISABLE();return 0;}
  UREG pos=s->header_pos; // pos - текущая позиция в строке-заголовке
  // Пробежимся по заголовкам
  do 
  {
    c=*data++;
    switch(state)
    {
        case _GET_HEADER: 
        // Если сейчас идет прием заголовка (Header)  
          if (c==10) // поймали '\n'  (Конец строки)
          {      
            s->req[pos]=0;
            if (pos) // если позиция в строке не нулевая
            {       
              if (!stricmp_P(s->req,"icy-metaint")) // поймали укзатель длины блока метаданных?
              {
                //Размер блока между метаданными
                s->metadata_interval=a2i(s->req+12)+1; //Запомним размер блока метаданных (еще вычитываем байт длинны метаданных)
              }
              else if (!stricmp_P(s->req,"icy-br")) // поймали укзатель битрейта
              {
                //Битрейт
                LCD_putBR(s->req+7);
              }
            }   
            else // поймали \r\n (Конец заголовков, переключаемся на тело)
            {              
              //__no_operation();
              s->state=state=_GET_BODY;
              s->block_length=s->metadata_interval; // Запоминаем размер блока между метаданными
              len--;
              goto L_BODY; // Перейдем на обработку метаданных
            }
            pos=0; //Начинаем новое накопление строки
            break;
         }
         if (c==13) break; //Пропускаем
         if (pos<(sizeof(s->req)-1))
         {
            //Если есть куда сохранять символы, сохраняем название заголовка
           if (c==':') c=0;
           s->req[pos++]=c;
          }
        break;
    }
  }
  while(--len);
  s->header_pos=pos;
  s->state=state;
  goto GET_hook_DATA_RX_exit;
//  FM_CS_DISABLE();
//  return 0;
}