📄 text.c
字号:
}#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 + -