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

📄 srvrcv.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************
 *
 * srvrcv.c
 *
 * CVS ID:   $Id: srvrcv.c,v 1.19 2007/09/26 15:15:46 dellorto Exp $
 * Author:   Fabio Dell'Orto [FD] - STM
 * Date:     $Date: 2007/09/26 15:15:46 $
 * Revision: $Revision: 1.19 $
 *
 * Description:
 *
 *
 ***************************************************
 *
 * COPYRIGHT (C) ST Microelectronics  2005
 *            All Rights Reserved
 *
 ***************************************************
 *
 * STM CVS Log:
 *
 * $Log: srvrcv.c,v $ * Revision 1.19  2007/09/26 15:15:46  dellorto * state machine for hf detection using acquisition defect information * * Revision 1.18  2007/08/14 15:30:28  dellorto * multiple mechanisms * * Revision 1.17  2007/04/11 14:21:05  belardi * Integration of HAVE_CD_MECHA modification by [GP] *
 * Revision 1.16  2007/03/16 14:21:54  dellorto
 * used new profiles
 * removed unnecessary assignement in check tracking fsm
 * hf recover improved
 *
 * Revision 1.15  2006/10/09 15:14:36  dellorto
 * improved TTM and focus recover for DC TTM motor
 *
 * Revision 1.14  2006/09/18 09:55:25  belardi
 * Corrected CVS keyword usage
 *
 * Revision 1.13  2006/09/18 09:25:38  belardi
 * AddeLogg$ CVS keyword into file header
 *
 *
 ***************************************************/

#include "gendef.h"
#include "hwreg.h"
#include "osal.h"
#include "srvinc.h"

#include "srvcfg.h"   /* For DEBUG_SERVOEVENT() */

#if (HAVE_CD_MECHA == 1)
uint8 focus_recover_outside_retries;
uint8 tracking_recover_dither_counter;

t_check_tracking_state check_tracking_fsm_state;
t_check_hf_state check_hf_fsm_state;

#ifdef HAVE_DEBUG_SERVO_TRACKING_STATE
static t_check_tracking_state previous_check_tracking_fsm_state;
static t_check_hf_state previous_check_hf_fsm_state;
#endif

#define set_tracking_event(e)             do{event_out[TRACKING_EVENT].event = e;}while (0)
#define set_hf_event(e)                   do{event_out[HF_EVENT].event = e;}while (0)


/******************************************************************************/
/* Function:  focus_ok                                                        */
/*                                                                            */
/*! \brief    checks the focus closing condition
 *  \param    void
 *  \return   uint8; OK in case of focus closing condition reached
 *            IN_PROGRESS otherwise
 *  \remark
 */
/******************************************************************************/

t_bool focus_ok(void)
{
  return (t_bool)(FOCUS_EVENT_CLOSED == (t_focus_event)event_in[DSP_FOCUS_EVENT].event);
}


/******************************************************************************/
/* Function:  hf_ok                                                           */
/*                                                                            */
/*! \brief    checks HF condition
 *  \param    void
 *  \return   TRUE in case of HF present
 *            FALSE in case of no HF present
 *  \remark   Value is a variable of DSP XMEM. The content of DEFACQ signal
 *            is reported here. (defect signal on GPIO of DSP)
 */
/******************************************************************************/

t_bool hf_ok(void)
{
  return (t_bool)(HF_EVENT_FOUND == (t_hf_event)event_in[HF_EVENT].event);
}


/******************************************************************************/
/* Function:  tracking_ok                                                     */
/*                                                                            */
/*! \brief    checks the tracking condition
 *  \param    void
 *  \return   uint8; OK in case of tracking closed
 *            TRACKING_LOST in case of tracking lost
 *  \remark
 */
/******************************************************************************/

t_bool tracking_ok(void)
{
  return (t_bool)(TRACKING_EVENT_CLOSED == (t_tracking_event)event_in[TRACKING_EVENT].event);
}


#ifdef APM_PICKUP
/******************************************************************************/
/* Function:  ttm_fg_ok                                                       */
/*                                                                            */
/*! \brief    checks for very high or very low frequency FG pulses,
 *            which indicate a stopped TTM
 *  \param    void
 *  \return   t_bool - TRUE in case of FG feedback ok, FALSE otherwise
 *  \remark
 */
/******************************************************************************/

t_bool ttm_fg_ok(void)     // MR050523b
{
  return (t_bool)((TTM_FG_EVENT_OK == (t_ttm_fg_event)event_in[DSP_TTM_FG_EVENT].event)
               && (timer_in_progress(SERVO_CAV_INT_TIMER)));
}
#endif


/******************************************************************************/
/* Function:  check_servo                                                     */
/*                                                                            */
/*! \brief    Depending on check_mask, testing of control loops
 *  \param    uint8 check_mask
 *  \return   RETVAL - OK, TTM_STOPPED, HF_LOST, FOCUS_LOST, TRACKING_LOST
 *  \remark
 */
/******************************************************************************/

RETVAL check_servo(uint8 check_mask)
{
#ifdef APM_PICKUP
  if ((check_mask & CHECK_TTM) && (!ttm_fg_ok()) && (servo_startup_flags.field.ttm_started))   // MR050523b
  {
    return TTM_STOPPED;
  }
#endif
  if ((check_mask & CHECK_FOCUS) && (!focus_ok()))
  {
    return FOCUS_LOST;
  }
  else if ((check_mask & CHECK_HF) && (!hf_ok()))
  {
    return HF_LOST;
  }
  else if ((check_mask & CHECK_TRACKING) && (!tracking_ok()))
  {
    return TRACKING_LOST;
  }
  return OK;
}


/******************************************************************************/
/* Function:  init_check_tracking_fsm                                         */
/*                                                                            */
/*! \brief    Initializes state machine for on track detection
 *  \param    void
 *  \return   void
 *  \remark
 */
/******************************************************************************/

void init_check_tracking_fsm(void)
{
  check_tracking_fsm_state = CHECK_TRACKING_STATE_OPEN;
#ifdef HAVE_DEBUG_SERVO_TRACKING_STATE
  previous_check_tracking_fsm_state = CHECK_TRACKING_STATE_OPEN;
#endif
  event_in[TRACKING_EVENT].event = TRACKING_EVENT_OPEN;
}


/******************************************************************************/
/* Function:  check_tracking_fsm                                              */
/*                                                                            */
/*! \brief    State machine for tracking controller on track detection
 *  \param    caller
 *  \param    t_check_tracking_caller check_tracking_caller
 *  \return   t_tracking_event tracking_event
 *  \remark   When this  function is called from mailbox_isr() this indicates
 *            that tracking has been lost.
 */
/******************************************************************************/

t_tracking_event check_tracking_fsm(t_check_tracking_caller check_tracking_caller)
{
  t_tracking_event tracking_event = (t_tracking_event)TRACKING_NO_EVENT;

  if (CHECK_TRACKING_CALLER_TRACK_ON_CMD == check_tracking_caller)
  {
    if (!short_jump_in_progress())
    {
      start_timer(SERVO_CHECK_TRACKING_TIMER, TRACKING_PRO_CHECK_TIMEOUT);
    }
    else
    {
      start_timer(SERVO_CHECK_TRACKING_TIMER, TRACKING_PRO_CHECK_TIMEOUT_SHORT_JUMP);
    }
    check_tracking_fsm_state = CHECK_TRACKING_STATE_WAIT_FOR_OK;
  }
  else if (CHECK_TRACKING_CALLER_TRACK_OFF_CMD == check_tracking_caller)
  {
    check_tracking_fsm_state = CHECK_TRACKING_STATE_OPEN;
    tracking_event = TRACKING_EVENT_OPEN;
    DEBUG_SERVO_TRACKING_EVENT(("TRACKING_EVENT: Tracking open", 4, 0));
  }

#ifdef HAVE_DEBUG_SERVO_TRACKING_STATE
  if (check_tracking_fsm_state != previous_check_tracking_fsm_state)
  {
    DEBUG_SERVO_TRACKING_STATE(("TRACKING_STATE:", 1, 1, check_tracking_fsm_state));
    previous_check_tracking_fsm_state = check_tracking_fsm_state;
  }
#endif   /* HAVE_DEBUG_SERVO_TRACKING_STATE */

  switch (check_tracking_fsm_state)
  {
  case CHECK_TRACKING_STATE_WAIT_FOR_OK:
    if (CHECK_TRACKING_CALLER_DSP_GLITCH == check_tracking_caller)
    {
      /* DSP state change: tracking glitch. */
      start_timer(SERVO_CHECK_TRACKING_TIMER, TRACKING_PRO_CHECK_TIMEOUT);
    }
    else if (!timer_in_progress(SERVO_CHECK_TRACKING_TIMER))
    {
      check_tracking_fsm_state = CHECK_TRACKING_STATE_OK;
      tracking_event = TRACKING_EVENT_CLOSED;
      DEBUG_SERVO_TRACKING_EVENT(("TRACKING_EVENT: Tracking closed", 4, 0));
    }
    break;

  case CHECK_TRACKING_STATE_OK:
    if (CHECK_TRACKING_CALLER_DSP_GLITCH == check_tracking_caller)
    {
      /* DSP state change: tracking glitch. */
      start_timer(SERVO_CHECK_TRACKING_TIMER, TRACKING_PRO_WAIT_FOR_RECHECK_TIMEOUT);
      check_tracking_fsm_state = CHECK_TRACKING_STATE_WAIT_FOR_RECHECK;
    }
    break;

  case CHECK_TRACKING_STATE_WAIT_FOR_RECHECK:
    if (!timer_in_progress(SERVO_CHECK_TRACKING_TIMER))
    {
      start_timer(SERVO_CHECK_TRACKING_TIMER, TRACKING_PRO_CHECK_TIMEOUT);
      check_tracking_fsm_state = CHECK_TRACKING_STATE_RECHECK;
    }
    break;

  case CHECK_TRACKING_STATE_RECHECK:
    if (CHECK_TRACKING_CALLER_DSP_GLITCH == check_tracking_caller)
    {
      /* DSP state change: tracking glitch. */
      check_tracking_fsm_state = CHECK_TRACKING_STATE_LOST;
      tracking_event = TRACKING_EVENT_OPEN;
      DEBUG_SERVO_TRACKING_EVENT(("TRACKING_EVENT: Tracking open", 4, 0));
    }
    else if (!timer_in_progress(SERVO_CHECK_TRACKING_TIMER))
    {
      check_tracking_fsm_state = CHECK_TRACKING_STATE_OK;
    }
    break;

  //case CHECK_TRACKING_STATE_LOST:
  //case CHECK_TRACKING_STATE_OPEN:
  default:
    break;
  }

  return tracking_event;
}


/******************************************************************************/
/* Function:  check_tracking_fsm_call                                         */
/*                                                                            */
/*! \brief    external call to check_tracking_fsm
 *  \param    t_check_tracking_caller check_tracking_caller
 *  \return   void
 *  \remark
 */
/******************************************************************************/

void check_tracking_fsm_call(t_check_tracking_caller check_tracking_caller)
{
  t_tracking_event tracking_event;

  event_disable_scheduling();
  tracking_event = check_tracking_fsm(check_tracking_caller);
  if (check_tracking_caller < CHECK_TRACKING_CALLER_MAX_CMD)
  {
    if (TRACKING_NO_EVENT != tracking_event)
    {
      event_pending[TRACKING_EVENT].event = TRACKING_NO_EVENT;
      event_in[TRACKING_EVENT].event = tracking_event;
    }
  }
  else
  {
    set_tracking_event(tracking_event);
    event_out_shedule(TRACKING_EVENT);
  }
  event_enable_scheduling();
}


/******************************************************************************/
/* Function:  init_check_hf_fsm                                               */
/*                                                                            */
/*! \brief    Initializes state machine for on track detection
 *  \param    void
 *  \return   void
 *  \remark
 */
/******************************************************************************/

void init_check_hf_fsm(void)
{
  check_hf_fsm_state = CHECK_HF_STATE_LOST;
#ifdef HAVE_DEBUG_SERVO_HF_STATE
  previous_check_hf_fsm_state = CHECK_HF_STATE_LOST;
#endif
  event_in[HF_EVENT].event = HF_EVENT_LOST;
}


/******************************************************************************/
/* Function:  check_hf_fsm                                                    */
/*                                                                            */

⌨️ 快捷键说明

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