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

📄 text.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    }    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 + -