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; }
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; }