📄 text.c
字号:
} break; case TEXT_STATE_READ_PACKS: if (!cd_text_flags.buffer_full) { //Check for correct block if (((uint8)((cd_text_fifo[ID4_TEXT_BLOCK_NO] & 0x70) >> 4) == cd_text_current_state[STATE_ID_BLOCK]) && (cd_text_fifo[ID3_TEXT_SEQ_NO] == cd_text_next_seq_no)) { cd_text_wait_for_pack_counter = MAX_WAIT_FOR_PACK; //Pack found, reset error counter //Store data cd_text_data_index = cd_text_write_idx * SERVICE_PACK_LEN;#ifdef RUN_FROM_ISR for (cnt_i = 0; cnt_i < sizeof(cd_text_fifo); cnt_i++) { cd_text_buffer[cd_text_data_index + cnt_i] = cd_text_fifo[cnt_i]; } for (; cnt_i < SERVICE_PACK_LEN; cnt_i++) { cd_text_buffer[cd_text_data_index + cnt_i] = CD_TEXT_DATA_FIFO; }#else for (cnt_i = 0; cnt_i < SERVICE_PACK_LEN; cnt_i++) { cd_text_buffer[cd_text_data_index + cnt_i] = cd_text_fifo[cnt_i]; }#endif cd_text_write_idx++; if (cd_text_write_idx >= CD_TEXT_SERVICE_BUFFERSIZE) { cd_text_write_idx = 0; } if (cd_text_write_idx == cd_text_read_idx) { cd_text_flags.buffer_full = 1; } //All data read? if (cd_text_next_seq_no == cd_text_max_seq_no) { // Disable interrupt to ST7 when all CD-TEXT Pack are received DISABLE_CDTEXT_INTERRUPT(); cd_text_flags.read_packs_finished = 1; } else { cd_text_next_seq_no++; } } } break; default: break; } //end switch if (0 == cd_text_wait_for_pack_counter--) {#ifdef READ_ALL_PACKS_FROM_BLOCK_0 cd_text_next_seq_no++; cd_text_wait_for_pack_counter = MAX_WAIT_FOR_PACK; //Pack found, reset error counter if (cd_text_next_seq_no == 255)#endif { //Disable CD-Text reading DISABLE_CDTEXT_INTERRUPT(); cd_text_state = TEXT_STATE_ERROR; } }}/*----------------------------------------------------------------------------*//* Function: text_fsm *//* *//*!\author Wolfgang Werner * \brief Text state maschine * will be called in every mail loop * \pre None * \post None * \param void * \return void * \warning None * \remarks None*//*----------------------------------------------------------------------------*/void text_fsm(void){ uint16 start_pos;#ifdef CD_TEXT_DEBUGGING if (msg_debug_pending.field.text) { return; }#endif if (CNF_CDTEXT_ON) /* PH040805a */ { switch (cd_text_state) { case TEXT_STATE_INIT: clear_cd_text_data(); // break; case TEXT_STATE_INIT_FINISHED: if (cd_text_flags.start_requested) { cd_text_flags.start_requested = 0; cd_text_next_seq_no = 0;#ifndef RUN_FROM_ISR cd_text_flags.new_data = 0; CDTEXT_SEMAPHORE_OFF();#endif cd_text_wait_for_pack_counter = MAX_WAIT_FOR_PACK; cd_text_state = TEXT_STATE_STARTED; // Enable interrupt to ST7 CD_TEXT_CONTROL.field.en_cd_txt_rcv = 1; // Enable interrupt to ST7 when a CD-TEXT Pack is received CD_TEXT_CONTROL.field.en_only_good_crc = 1; // Interrupt only if CRC is OK CD_TEXT_CONTROL.field.cd_txt_overflow = 0; CD_TEXT_CONTROL.field.cd_txt_rcv = 0; } break; case TEXT_STATE_START_CONVERTING: /* initialize variables for text converting state */ if (PAC_ID_MAX_TO_READ > PAC_ID_MESSAGE) //Convert only string packs { /* This check can be done with #if #endif but QAC produce warning that PAC_ID_MESSAGE is not defined, COSMIC compiler will not compile if FALSE */ for (cd_text_data_index = cnt_i = 0 ; cnt_i <= PAC_ID_MESSAGE; cnt_i++) { cd_text_data_index += cd_text_pac_num[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; } } cnt_i = 0; cd_text_data_index = 0; cd_text_write_pos = 0; cd_text_state = TEXT_STATE_CONVERTING; /* fall through */ case TEXT_STATE_CONVERTING: { //Converting to "Pascal strings" //Conversion is splited into discrete steps, conversion into one step is to slow start_pos = cd_text_data_index;#if (0 != PACKS_TO_CONVERT_IN_ONE_STEP) cd_text_data_index += PACKS_TO_CONVERT_IN_ONE_STEP * STORED_PACK_LEN; if (cd_text_data_index >= ((cd_text_max_seq_no * STORED_PACK_LEN) + STORED_PACK_LEN))#endif { //last converting step cd_text_data_index = (cd_text_max_seq_no * STORED_PACK_LEN) + STORED_PACK_LEN; cd_text_state = TEXT_STATE_FINISH; /* Text available setzen */ //msg_service_pending.field.q_subcode = 1; /* only debug */ } if (0 != cd_text_current_state[STATE_ID_DBCC]) { for (; start_pos < cd_text_data_index; start_pos += 2) //Convert only used area { if ((0 == cd_text_data[start_pos]) && (0 == cd_text_data[start_pos + 1])) { cd_text_buffer[cd_text_write_pos] = cnt_i; cd_text_write_pos = start_pos + 1 + CD_TEXT_DATA_OFFSET; cnt_i = 0; } else { cnt_i += 2; } } } else { for (; start_pos < cd_text_data_index; start_pos++) //Convert only used area { if (0 == cd_text_data[start_pos]) { cd_text_buffer[cd_text_write_pos] = cnt_i; cd_text_write_pos = start_pos + CD_TEXT_DATA_OFFSET; cnt_i = 0; } else { cnt_i++; } } } } break;#ifdef RUN_FROM_ISR case TEXT_STATE_READ_80_81: if (cd_text_flags.find_next_seq_no) { start_pos = cd_text_next_seq_no * STORED_PACK_LEN; do { 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; break; } start_pos += STORED_PACK_LEN; cd_text_next_seq_no++; } while (0 != cd_text_data[start_pos]); cd_text_flags.find_next_seq_no = 0; } break; case TEXT_STATE_READ_PACKS: //there are data to transfer?#if 0 // [RB] for Accordo+ if (0 == msg_service_pending.field.text_pack) { if ((cd_text_write_idx != cd_text_read_idx) || cd_text_flags.buffer_full) { msg_service_pending.field.text_pack = 1; } else if (cd_text_flags.read_packs_finished) { text_idle(); } else { /* nothing to do */ } }#else if (cd_text_flags.read_packs_finished) { text_idle(); }#endif break; //case TEXT_STATE_STARTED: //case TEXT_STATE_READ_8F_BL0: //case TEXT_STATE_READ_8F_BLSELECTED: //case TEXT_STATE_ERROR: //case TEXT_STATE_FINISH: default: break; case TEXT_STATE_FINISH:#if (1 == HAVE_SHOCK_MEMORY) move_text();#endif break;#else case TEXT_STATE_ERROR: break; case TEXT_STATE_FINISH: move_text(); break; //case TEXT_STATE_STARTED: //case TEXT_STATE_READ_8F_BL0: //case TEXT_STATE_READ_8F_BLSELECTED: //case TEXT_STATE_READ_80_81: //case TEXT_STATE_READ_PACKS: default: if (1 == cd_text_flags.new_data) { CDTEXT_SEMAPHORE_ON(); cd_text_flags.new_data = 0; text_read_fifo_data(); CDTEXT_SEMAPHORE_OFF(); } if (TEXT_STATE_READ_80_81 == cd_text_state) { if (cd_text_flags.find_next_seq_no) { start_pos = cd_text_next_seq_no * STORED_PACK_LEN; do { 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; break; } start_pos += STORED_PACK_LEN; cd_text_next_seq_no++; } while (0 != cd_text_data[start_pos]); cd_text_flags.find_next_seq_no = 0; } } else if (TEXT_STATE_READ_PACKS == cd_text_state) {#if 0 // [RB] for Accordo+ //there are data to transfer? if (0 == msg_service_pending.field.text_pack) { if ((cd_text_write_idx != cd_text_read_idx) || cd_text_flags.buffer_full) { msg_service_pending.field.text_pack = 1; } else if (cd_text_flags.read_packs_finished) { text_idle(); } }#else if (cd_text_flags.read_packs_finished) { text_idle(); }#endif } break;#endif }#ifdef CD_TEXT_DEBUGGING if (service_flag_is_set(SVCF_DEBUG_MSG_CDTEXT_FSM) && ((debug_cd_text.state != cd_text_state) || (debug_cd_text.data_index != cd_text_data_index) || (debug_cd_text.next_seq_no != cd_text_next_seq_no) || (debug_cd_text.write_pos != cd_text_write_pos))) { debug_cd_text.state = cd_text_state; debug_cd_text.data_index = cd_text_data_index; debug_cd_text.next_seq_no = cd_text_next_seq_no; debug_cd_text.write_pos = cd_text_write_pos; svc_msg_set_pending(SVC_MSG_DEBUG_CDTEXT_STATE); }#endif }}#endif/*----------------------------------------------------------------------------*//* Function: CDText_init *//* *//*!\author Wolfgang Werner * \brief Set all needed variables to start values * \pre called from SERVO/oif_init function * \post None * \param void * \return void * \warning None * \remarks None*//*----------------------------------------------------------------------------*/void CDText_init(void){#if (1==HAVE_CDTEXT)#if (1 == HAVE_SHOCK_MEMORY) { extern uint8 filesys_sectbuf[]; cd_text_buffer = (uint8 *) filesys_sectbuf; }#endif if (cd_text_state > TEXT_STATE_INIT_FINISHED) /* if clearing memory do not restart it */ { cd_text_state = TEXT_STATE_INIT; cd_text_data_index = 0; cd_text_buffer[0] = 0; } cd_text_flags.start_requested = 0;#endif}void move_text(void){#if (1 == HAVE_SHOCK_MEMORY) && (1 == HAVE_CDTEXT) uint32 i; uint32 size; uint32 *sdram_ptr; uint32 *ram_ptr; // Adjust size at Doword boundary size = CD_TEXT_SDRAMBUFFERSIZE / sizeof(uint32); sdram_ptr = (uint32 *) cd_text_sdram_buffer; ram_ptr = (uint32 *) cd_text_buffer; for (i = 0; i < size; i++) { sdram_ptr[i] = ram_ptr[i]; } cd_text_buffer = cd_text_sdram_buffer;#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -