📄 srvrcv.c
字号:
/**************************************************
*
* 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 + -