⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
}#endif // APM_PICKUP/*----------------------------------------------------------------------------*//* Function:  text_get                                                        *//*                                                                            *//*!\author    Wolfgang Werner * \brief     will be called from message handler and returns pointer to *            length of titel/performer and titel/performer string self *            and set in tno the msb if string is in DBCC format * \pre       None * \post      None * \param     uint8 tno, t_pack_id pac_id * \return    uint8 * \warning   None * \remarks   None*//*----------------------------------------------------------------------------*/#ifdef APM_PICKUPt_bool text_get(uint8 tno, t_pack_id pac_id, uint16 *index)#elseconst uint8 * text_get(uint8 tno, t_pack_id pac_id)#endif{  /*    uint16  offset;    uint16  offset_end;    uint16  last_no_tab_char_offset;    uint8   counter;  */#define offset                  cd_text_data_index#define offset_end              cd_text_write_pos#define last_no_tab_char_offset cd_text_wait_for_pack_counter#define counter                 cnt_i  if (TEXT_STATE_FINISH == cd_text_state)  {    if (0 == cd_text_pac_num[pac_id])    {#ifdef APM_PICKUP      return FALSE;#else      return NULL;#endif    }    for (offset = counter = 0; ((counter <= PAC_ID_MAX_TO_READ) && (counter < pac_id)) ; counter++)    {      offset += STORED_PACK_LEN * cd_text_pac_num[counter];    }    offset_end = offset + (STORED_PACK_LEN * cd_text_pac_num[counter]);    if (offset_end > (CD_TEXT_BUFFERSIZE - 1))    {      offset_end = CD_TEXT_BUFFERSIZE - 1;    }    last_no_tab_char_offset = offset; // WW040705a    for (counter = 0; offset < offset_end; counter++)    {      if (counter == tno)      {        // WW040705b begin        if ((0x09 == cd_text_buffer[offset + 1])         && (((0 == cd_text_current_state[STATE_ID_DBCC]) && (0x01 == cd_text_buffer[offset]))     //NO DBCC, Length = 1 and data contains tab char          || ((0 != cd_text_current_state[STATE_ID_DBCC]) && (0x02 == cd_text_buffer[offset]))))   //DBCC, Length = 2 and data contains tab char WW040722        {#ifdef APM_PICKUP          *index = last_no_tab_char_offset;          return TRUE;#else          return &cd_text_buffer[last_no_tab_char_offset];#endif        }        else        {#ifdef APM_PICKUP          *index = offset;          return TRUE;#else          return &cd_text_buffer[offset];#endif        }        // WW040705b end      }      offset = offset + cd_text_buffer[offset] + 1;      if (0 != cd_text_current_state[STATE_ID_DBCC])      {        offset ++;      }      if (0x09 != cd_text_buffer[offset + 1])      {        last_no_tab_char_offset = offset;      }    }  }#ifdef APM_PICKUP  return FALSE;#else  return NULL;#endif#undef offset#undef offset_end#undef last_no_tab_char_offset#undef counter}/*----------------------------------------------------------------------------*//* Function:  text_get_pack                                                   *//*                                                                            *//*!\author    Wolfgang Werner * \brief     will be called from message handler and returns pointer to *            next RAW text pack * \pre       None * \post      None * \param     void * \return    uint8 * \warning   None * \remarks   None*//*----------------------------------------------------------------------------*/#ifdef APM_PICKUP // [RB] commented out to reduce ROM spaceconst uint8 * text_get_pack(void){  uint8 i;  if (TEXT_STATE_READ_PACKS == cd_text_state)  {    for (i = 0; i < SERVICE_PACK_LEN; i++)    {      cd_text_buffer[(CD_TEXT_SERVICE_BUFFERSIZE * SERVICE_PACK_LEN) + i] =                  cd_text_buffer[(cd_text_read_idx * SERVICE_PACK_LEN) + i];    }    cd_text_read_idx++;    if (cd_text_read_idx >= CD_TEXT_SERVICE_BUFFERSIZE)    {      cd_text_read_idx = 0;    }    cd_text_flags.buffer_full = 0;    return &cd_text_buffer[CD_TEXT_SERVICE_BUFFERSIZE * SERVICE_PACK_LEN];  }  return NULL;}#endif // APM_PICKUP/*----------------------------------------------------------------------------*//* Function:  text_isr (interrupt)                                            *//*                                                                            *//*!\author    Wolfgang Werner * \brief     read cd text packs into permanent buffer * \pre       None * \post      None * \param     void * \return    void * \warning   None * \remarks   None*//*----------------------------------------------------------------------------*/void text_isr(void){  if (CD_TEXT_CONTROL.field.cd_txt_rcv)  {    // New Pack Received    if (CD_TEXT_CONTROL.field.cd_txt_crc_check)    {#ifdef RUN_FROM_ISR      cd_text_fifo[ID1_TEXT_PACK_TYPE] = CD_TEXT_DATA_FIFO;      cd_text_fifo[ID2_TEXT_TRACK_NO] = CD_TEXT_DATA_FIFO;      cd_text_fifo[ID3_TEXT_SEQ_NO] = CD_TEXT_DATA_FIFO;      cd_text_fifo[ID4_TEXT_BLOCK_NO] = CD_TEXT_DATA_FIFO;      text_read_fifo_data();#else      if (0 == semaphore.cd_text)      {        //Transfer in permanent buffer        //Faster than Loop        cd_text_fifo[0] = CD_TEXT_DATA_FIFO;        cd_text_fifo[1] = CD_TEXT_DATA_FIFO;        cd_text_fifo[2] = CD_TEXT_DATA_FIFO;        cd_text_fifo[3] = CD_TEXT_DATA_FIFO;        cd_text_fifo[4] = CD_TEXT_DATA_FIFO;        cd_text_fifo[5] = CD_TEXT_DATA_FIFO;        cd_text_fifo[6] = CD_TEXT_DATA_FIFO;        cd_text_fifo[7] = CD_TEXT_DATA_FIFO;        cd_text_fifo[8] = CD_TEXT_DATA_FIFO;        cd_text_fifo[9] = CD_TEXT_DATA_FIFO;        cd_text_fifo[10] = CD_TEXT_DATA_FIFO;        cd_text_fifo[11] = CD_TEXT_DATA_FIFO;        cd_text_fifo[12] = CD_TEXT_DATA_FIFO;        cd_text_fifo[13] = CD_TEXT_DATA_FIFO;        cd_text_fifo[14] = CD_TEXT_DATA_FIFO;        cd_text_fifo[15] = CD_TEXT_DATA_FIFO;        //cd_text_fifo[16] = CD_TEXT_DATA_FIFO;        //cd_text_fifo[17] = CD_TEXT_DATA_FIFO;        cd_text_flags.new_data = 1;      }#endif    } // end if(CD_TEXT_CONTROL.field.cd_txt_crc_check)    CD_TEXT_CONTROL.field.cd_txt_rcv = 1;    CD_TEXT_CONTROL.field.cd_txt_overflow = 1;  }}/*----------------------------------------------------------------------------*//* Function:  text_read_fifo_data                                             *//*                                                                            *//*!\author    Wolfgang Werner * \brief     Procesing of text fifo data * \pre       None * \post      None * \param     void * \return    void * \warning   None * \remarks   None*//*----------------------------------------------------------------------------*/void text_read_fifo_data(void){  switch (cd_text_state)  {  case TEXT_STATE_STARTED:    cd_text_current_state[STATE_ID_LANGUAGE_CODE] = 0;    cd_text_current_state[STATE_ID_CHARACTER_CODE] = 0;    cd_text_current_state[STATE_ID_BLOCK] = 0;    cd_text_current_state[STATE_ID_DBCC] = 0;    cd_text_next_seq_no = 0;#ifdef READ_ALL_PACKS_FROM_BLOCK_0    cd_text_max_seq_no = 255;    cd_text_read_idx = 0;    cd_text_write_idx = 0;    cd_text_flags.buffer_full = 0;    cd_text_flags.read_packs_finished = 0;    cd_text_state = TEXT_STATE_READ_PACKS;    break;#else    cd_text_state = TEXT_STATE_READ_8F_BL0;    /* fall through */#endif  case TEXT_STATE_READ_8F_BL0:  case TEXT_STATE_READ_8F_BLSELECTED:    if ((cd_text_fifo[ID1_TEXT_PACK_TYPE] == 0x8F)     && (cd_text_fifo[ID2_TEXT_TRACK_NO] == cd_text_next_seq_no)     && ((uint8)((cd_text_fifo[ID4_TEXT_BLOCK_NO] & 0x70) >> 4)      == cd_text_current_state[STATE_ID_BLOCK])) //selected Block    {      cd_text_data_index = cd_text_next_seq_no * STORED_PACK_LEN;      for (cnt_i = 0 ; cnt_i < STORED_PACK_LEN; cnt_i++)      {#ifdef RUN_FROM_ISR        cd_text_data[cd_text_data_index + cnt_i] = CD_TEXT_DATA_FIFO;         // WW040706a#else        cd_text_data[cd_text_data_index + cnt_i] = cd_text_fifo[TEXT_FIST_DATA_BYTE + cnt_i];         // WW040706a#endif      }      cd_text_wait_for_pack_counter = MAX_WAIT_FOR_PACK; //Pack found, reset error counter      cd_text_next_seq_no++;      if (cd_text_next_seq_no >= 3) //All 8F Packs of Block read      {        if (TEXT_STATE_READ_8F_BL0 == cd_text_state) //If first Bloack read select now the right language        {          //Language compare          for (cnt_j = 0 ; cnt_j < MAX_PRIORITY_LANGUAGES; cnt_j++)          {            if (0x00 != PREFERRED_LANGUAGE(cnt_j))            {              for (cnt_i = 0 ; cnt_i < 8; cnt_i++)              {                if ((cd_text_data[TEXT_8F_LANG_CODE_BL0 + cnt_i] == PREFERRED_LANGUAGE(cnt_j))        // WW040706a                 && (cd_text_data[TEXT_8F_LAST_SEQ_BL0 + cnt_i] != 0))                {                  cd_text_current_state[STATE_ID_BLOCK] = cnt_i;                  cd_text_current_state[STATE_ID_LANGUAGE_CODE] = PREFERRED_LANGUAGE(cnt_j);                  break;                }              }            }            if (0 != cd_text_current_state[STATE_ID_LANGUAGE_CODE]) //Language found            {              break;            }          }        }        if ((TEXT_STATE_READ_8F_BLSELECTED == cd_text_state)         || (0 == cd_text_current_state[STATE_ID_BLOCK]))        {          cd_text_next_seq_no = 0;          cd_text_current_state[STATE_ID_DBCC] = (uint8)(cd_text_fifo[ID4_TEXT_BLOCK_NO] & 0x80);          cd_text_current_state[STATE_ID_CHARACTER_CODE] = cd_text_data[TEXT_8F_CHARACTER_CODE];          cd_text_current_state[STATE_ID_LANGUAGE_CODE] = cd_text_data[TEXT_8F_LANG_CODE_BL0 + cd_text_current_state[STATE_ID_BLOCK]];          //if (0 == svc_union.flags.cd_text_pack_transfer)// WW040707a#ifdef APM_PICKUP          if (service_flag_is_set(SVCF_CD_TEXT_PACK_TRANSFER))#else          if (1) // [RB] for Accordo+, have to insert a configuration variable here#endif          {#ifdef CHECK_FOR_WRONG_ID3_IN_8F_PACKS            //Check for wrong recorded CDs            cd_text_data_index = cd_text_data[TEXT_8F_NUM_ID_80] + cd_text_data[TEXT_8F_NUM_ID_81];            if (cd_text_fifo[ID3_TEXT_SEQ_NO] < cd_text_data_index) // WW040706a            {              //Disable CD-Text reading              DISABLE_CDTEXT_INTERRUPT();              cd_text_state = TEXT_STATE_ERROR;              break;            }#endif            for (cd_text_data_index = cnt_i = 0 ; cnt_i <= PAC_ID_MAX_TO_READ; cnt_i++)            {              cd_text_pac_num[cnt_i] = cd_text_data[TEXT_8F_NUM_ID_80 + cnt_i];              cd_text_data_index += cd_text_data[TEXT_8F_NUM_ID_80 + cnt_i];            }            cd_text_data_index--;            if (cd_text_data_index > ((CD_TEXT_BUFFERSIZE / STORED_PACK_LEN) - 1))            {              cd_text_max_seq_no = ((CD_TEXT_BUFFERSIZE / STORED_PACK_LEN) - 1);            }            else            {              cd_text_max_seq_no = (uint8) cd_text_data_index;            }            //Clear cd_text_data memory after reading 8F packs            // WW040706a            for (cnt_i = 0 ; cnt_i <= TEXT_8F_LANG_CODE_BL7; cnt_i += STORED_PACK_LEN)            {              cd_text_data[cnt_i] = 0;            }            cd_text_flags.find_next_seq_no = 0;            cd_text_state = TEXT_STATE_READ_80_81;          }          else          {            cd_text_max_seq_no = (cd_text_data[TEXT_8F_LAST_SEQ_BL0 + cd_text_current_state[STATE_ID_BLOCK]]);// WW040706a            cd_text_read_idx = 0;            cd_text_write_idx = 0;            cd_text_flags.buffer_full = 0;            cd_text_flags.read_packs_finished = 0;            cd_text_state = TEXT_STATE_READ_PACKS;          }        }        else        {          cd_text_state = TEXT_STATE_READ_8F_BLSELECTED;          cd_text_next_seq_no = 0;        }      }    }    break;  case TEXT_STATE_READ_80_81: // Read 0x80 and 0x81 packs of selected Block    // we store all founded packs    // Over "cd_text_next_seq_no", we check, that we have all packs found    if ((uint8)((cd_text_fifo[ID4_TEXT_BLOCK_NO] & 0x70) >> 4)     == cd_text_current_state[STATE_ID_BLOCK])    {      //OK, right block      if ((cd_text_fifo[ID3_TEXT_SEQ_NO] <= cd_text_max_seq_no)       && (cd_text_fifo[ID3_TEXT_SEQ_NO] >= cd_text_next_seq_no))      {        //Block can be used        //Calculate start offset        cd_text_data_index = STORED_PACK_LEN * cd_text_fifo[ID3_TEXT_SEQ_NO];        //Check, if pack was not already stored        if (0 == cd_text_data[cd_text_data_index])        {          //Store data          for (cnt_i = 0 ; cnt_i < STORED_PACK_LEN; cnt_i++)          {#ifdef RUN_FROM_ISR            cd_text_data[cd_text_data_index + cnt_i] = CD_TEXT_DATA_FIFO;#else            cd_text_data[cd_text_data_index + cnt_i] = cd_text_fifo[TEXT_FIST_DATA_BYTE + cnt_i];#endif          }          //Check, if this pack is the next requested pack          if ((cd_text_fifo[ID3_TEXT_SEQ_NO] == cd_text_next_seq_no)           && (!cd_text_flags.find_next_seq_no))          {            cd_text_wait_for_pack_counter = MAX_WAIT_FOR_PACK; //Pack found, reset error counter            if (cd_text_next_seq_no == cd_text_max_seq_no)            {              // Disable interrupt to ST7 when all CD-TEXT Packs are received              DISABLE_CDTEXT_INTERRUPT();              cd_text_state = TEXT_STATE_START_CONVERTING;            }            else            {              cd_text_next_seq_no++;              if (cd_text_data[cd_text_data_index + STORED_PACK_LEN] != 0)              {                cd_text_flags.find_next_seq_no = 1;              }            }          }        }        else        {          //Pack already stored        }      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -