T168_111\device\Ribbon文件:RibbonDrv.c

RibbonDrv.c  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define RIBBONDRV_C

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "Common.h"
#include "XCore.h"
#include "XADC.h"
#include "XMotor.h"
#include "XSensor.h"
#include "XTimer.h"
#include "XProFile.h"
#include "XVarBank.h"
#include "RibbonDrv.h"

#if defined(RIBBON_MODEL)

#define CLEAR_CAPTURE_STATUS                SetRibbonFlag(0)
#define CAPTURE_STATUS                        GetRibbonFlag()
#define CAPTURE_VALUE                        PWM_GetTimerCounter(PWM_TIMER0)


#define _EXT_INT_SRC                2

#define RIBBON_EMPTY_THRESHOLD        150    // for speed 7"
#define RIBBON_ENC_SIZE                4
#define RIBBON_ENC_HOLD_TIMES        (INT)(60 * MM_DOT)
#define RIBBON_ENC_HOLD                100

#define RIBBON_INTEN_MAX            3
#define RIBBON_INTEN_MIN            1        // 0 can't use


#if defined(AT91SAM9260)
#define RIBBON_DELAY                50000
#elif defined(SH7040)
#define RIBBON_DELAY                10000
#elif defined(N3290)
#define RIBBON_DELAY                2*10000 // ch_20220506

#endif

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *    L O C A L   I N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *    L O C A L   U N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

STATIC BOOL CloseRibbonEnd;
STATIC BOOL CheckRibbonColorless;
STATIC BOOL CheckRibbonSilver;

STATIC BOOL CloseRibbonEncoder;
STATIC BOOL CheckRibbonEncoder;
STATIC BOOL TryRibbonEncoder;

STATIC UINT RibbonEncodeData[RIBBON_ENC_SIZE];
STATIC UINT RibbonEncodeIndex;
STATIC UINT RibbonEncodeUncap;
STATIC BOOL RibbonEncodeReady;

STATIC UINT StoreRibbonEncodeData[RIBBON_ENC_SIZE];
STATIC UINT StoreRibbonEncodeIndex;
STATIC UINT StoreRibbonEncodeUncap;

STATIC INT CaptureStatus;


STATIC INT RibbonCount=0;

STATIC UCHAR DetectRibbonStat = 0;            // ch_20220623
STATIC ULONG DetectRibbonInterval = 0;     // ch_20220623
STATIC WORD PrevEncodeData = 0;                 // ch_20220623

STATIC VOID SetRibbonFlag(BYTE flag){

    _PrintCfg *CalCfg = GrabPrintConfig();

    CalCfg->my_encode_flag = flag;    
}

STATIC BYTE GetRibbonFlag(VOID){

    _PrintCfg *CalCfg = GrabPrintConfig();

    return CalCfg->my_encode_flag;        
}
STATIC VOID RibbonSenserGpioISR(void){

    INT    imask = DisableInterrupt(INTERRUPT_MASK);

    _PrintCfg *CalCfg = GrabPrintConfig();

#ifdef DEBUG_PRNT
sysprintf("RibbonSenserGpioISR()...\n"); // ch_20220506
#endif

    gpio_cleartriggersrc(GPIO_PORTE);


    CalCfg->my_encode_flag = 1;    

    EnableInterrupt(imask);
}

STATIC void RibbonEncodeGpioInt(void)
{

    PWM_TIME_DATA_T sPt;    
    
    PFN_PWM_CALLBACK pfnOldcallback;
    

    gpio_setportdir(GPIO_PORTE    ,BIT9, 0);
    gpio_setportpull(GPIO_PORTE    ,BIT9, 0);
    
    // ch_20220725
//    gpio_setintmode(GPIO_PORTE    ,BIT9, 0, BIT9);//~{IOI}QXVP6O~}
//    gpio_setsrcgrp(GPIO_PORTE    ,BIT9, _EXT_INT_SRC);        //~{VP6OT4~}2
//
//    gpio_setdebounce(128, 1 << _EXT_INT_SRC);
//    gpio_setlatchtrigger(1 << _EXT_INT_SRC);
//
//    sysInstallISR(IRQ_LEVEL_7,_EXT_INT_SRC+2, (PVOID)RibbonSenserGpioISR);
//    sysSetInterruptType(_EXT_INT_SRC+2, POSITIVE_EDGE_TRIGGER);
//    sysSetLocalInterrupt(ENABLE_FIQ_IRQ);
//    sysEnableInterrupt(_EXT_INT_SRC+2);
    

}
STATIC WORD RibbonEncoder(VOID)
{
    INT i, Data;
STATIC INT DataBkp = 0; // ch_20220725
STATIC UCHAR PrevLevel = 0; // ch_20220725
unsigned short PortVal = 0; // ch_20220725

    _PrintCfg *CalCfg = GrabPrintConfig();


//    if (CAPTURE_STATUS) // ch_20220725
    gpio_readport(GPIO_PORTE, &PortVal); // ch_20220725
    if ((PortVal&BIT9)&&(0==PrevLevel)) // ch_20220725
    {
//         CLEAR_CAPTURE_STATUS; // ch_20220725 
PrevLevel = 1; // ch_20220725


        Data = CalCfg->my_encode_count;
        
        if(RibbonCount!=0)
        {
            RibbonCount++;

            if((RibbonCount%25) == 0)
            {

                RibbonCount=1;
                SendPrintf("%d\n",CalCfg->my_last_en_count);
            }
        }
        
#if defined(TTP245P_PCB) ||defined(T045_PCB) ||defined(T40_PCB) || defined(TN3290_PCB)
        if (Data < RIBBON_EMPTY_THRESHOLD / 2)
            Data = RIBBON_EMPTY_THRESHOLD / 2;
        
        //if (Data > (RIBBON_EMPTY_THRESHOLD+5))
        //    Data = RIBBON_EMPTY_THRESHOLD;
#endif
        if (RibbonEncodeReady)    // between the two capture
        {
            RibbonEncodeData[RibbonEncodeIndex++] = Data;
            if (RibbonEncodeIndex == RIBBON_ENC_SIZE)
                RibbonEncodeIndex = 0;
        }
        RibbonEncodeReady = TRUE;

        if(Data <= (RIBBON_EMPTY_THRESHOLD / 2)){
            RibbonEncodeUncap++;
        }
        else
        RibbonEncodeUncap = 0;


    }
    else
    {
if (!(PortVal&BIT9)) // ch_20220725
    PrevLevel = 0; // ch_20220725

        CalCfg->my_encode_count = RIBBON_ENC_HOLD;
        RibbonEncodeUncap += 1;
    }

    // encoder hold
    if (RibbonEncodeUncap > RIBBON_ENC_HOLD_TIMES)
    {
        ClearRibbonEncode();
        //SendPrintf("uncap-->%d",RibbonEncodeUncap);
        return RIBBON_ENC_HOLD;
    }

#if 1
    // encode data
    Data = 0;
    for(i = 0; i < RIBBON_ENC_SIZE; i++)
        Data += RibbonEncodeData[i];
    Data /= RIBBON_ENC_SIZE;

    CalCfg->my_last_en_count = Data;
#endif
    return Data;
}

STATIC BOOL RibbonExistInEncoder(VOID)
{
    WORD Value;
    LONG i;

#if  defined(TTP245P_PCB) ||defined(T045_PCB) ||defined(T40_PCB) || defined(TN3290_PCB)
#if defined(XPH500B)||defined(XPH500E)
        DCMotorRewindCtrl(TRUE, MOTOR_FORWARD, 60/*30*/); // ch_20220815 : changed to 60 from 30 cause cannot detect RIBBON sometimes.
#else
    DCMotorRewindCtrl(TRUE, MOTOR_FORWARD, 70);
#endif
    for (i = 0; i < RIBBON_ENC_HOLD_TIMES + 200; i++)
    {
        Trigger74123();
        DelayTime(RIBBON_DELAY);
        Value = RibbonEncoder();

#ifdef DEBUG_PRNT
sysprintf("%d\n", Value);
#endif
        
    }
    DCMotorRewindCtrl(FALSE, MOTOR_FORWARD, 0);


//    SendPrintf("Y:%d\n",Value);
sysprintf("Y:%d\n", Value); // ch_20220505

    if (Value == 0 || Value == RIBBON_ENC_HOLD)
        return TRUE;
#endif

    return FALSE;
}

STATIC BOOL RibbonExistInSensor(VOID)
{

    _PrintCfg *pPrtCfg = GrabPrintConfig();
    BOOL HasRibbon = TRUE;

    EnableSensor(RIBBON_SENSOR, pPrtCfg->RibbonInten, 0, pPrtCfg->RibbonRef);
    DelayTime(RIBBON_DELAY);
    if (GetSensorSignal(RIBBON_SENSOR) == SENSOR_DETECTED)
        HasRibbon = FALSE;

    DisableSensor(RIBBON_SENSOR);

    return HasRibbon;

}

STATIC BOOL SilverExistInSensor(VOID)
{
    _PrintCfg *pPrtCfg = GrabPrintConfig();
    BOOL HasRibbon = TRUE;

    HasRibbon = FALSE;


    return HasRibbon;
}


VOID InitialRibbon(VOID)//~{3uJ<;/F$4x~}
{
    FLOAT data;

#if 1
    RibbonEncodeGpioInt();
#endif

    CloseRibbonEnd = FALSE;
    if (GetProfileInt("RIBBON END CLOSE", &data))
        CloseRibbonEnd = (BOOL)data;

    CheckRibbonColorless = FALSE;
    CheckRibbonSilver = FALSE;

    CloseRibbonEncoder = FALSE;
    if (GetProfileInt("RIBBON ENCODER CLOSE", &data))
        CloseRibbonEncoder = (BOOL)data;

    CheckRibbonEncoder = FALSE;
    TryRibbonEncoder   = FALSE;

    ClearRibbonEncode();
}

VOID ClearRibbonEncode(VOID)
{
    INT i;
    _PrintCfg *CalCfg = GrabPrintConfig();

    CLEAR_CAPTURE_STATUS;
    //CAPTURE_VALUE = 0;

    CalCfg->my_encode_count = 100;

    for (i = 0; i < RIBBON_ENC_SIZE; i++)
        RibbonEncodeData[i] = 0;
    RibbonEncodeIndex = 0;
    RibbonEncodeUncap = 0;
    RibbonEncodeReady = FALSE;
}

VOID StoreRibbonEncode(VOID)
{
    INT i;
    
    for (i = 0; i < RIBBON_ENC_SIZE; i++)
        StoreRibbonEncodeData[i] = StoreRibbonEncodeData[i];
    StoreRibbonEncodeIndex = RibbonEncodeIndex;
    StoreRibbonEncodeUncap = RibbonEncodeUncap;    
}

VOID RestoreRibbonEncode(VOID)
{
    INT i;
    
    for (i = 0; i < RIBBON_ENC_SIZE; i++)
        RibbonEncodeData[i] = StoreRibbonEncodeData[i];
    RibbonEncodeIndex = StoreRibbonEncodeIndex;
    RibbonEncodeUncap = StoreRibbonEncodeUncap;
}

VOID StopTryRibbonEncoder(VOID)
{
    TryRibbonEncoder = FALSE;
}

BOOL GetRibbonCheck(INT kind)
{
    if (kind == CHECK_RIBBON_COLORLESS)
        return CheckRibbonColorless;
    if (kind == CHECK_RIBBON_SILVER)
        return CheckRibbonSilver;
    if (kind == CHECK_RIBBON_ENCODER)
        return CheckRibbonEncoder;

    return FALSE;
}

BOOL DetectRibbonInten(VOID)
{
    _PrintCfg *pPrtCfg = GrabPrintConfig();
    BOOL Signal;
    INT Inten;


    return TRUE;
}

VOID CheckRibbonExists(BOOL Inten, BOOL Encoder)
{
    _PrintCfg *pPrtCfg = GrabPrintConfig();
    BOOL HasRibbon;

    HasRibbon = RibbonExistInSensor();

    CheckRibbonColorless = TRUE;
    if (CloseRibbonEnd || !HasRibbon)
        CheckRibbonColorless = FALSE;


    CheckRibbonEncoder = TRUE;
    if (CloseRibbonEncoder)
        CheckRibbonEncoder = FALSE;


    TryRibbonEncoder = FALSE;

    if (Encoder)
    {
#if  defined(TTP245P_PCB) ||defined(T045_PCB) ||defined(T40_PCB) || defined(TN3290_PCB)
        pPrtCfg->RibbonFlag = TRUE;
        if (CloseRibbonEncoder)
        {
            if (!CheckRibbonColorless){
                pPrtCfg->RibbonFlag = FALSE;

#ifdef DEBUG_PRNT
                sysprintf("CloseRibbonEncoder = 1 and CheckRibbonColorless = 0\n");
#endif
            }
        }
        else if (!RibbonExistInEncoder())
        {
            pPrtCfg->RibbonFlag = FALSE;
            CheckRibbonEncoder  = FALSE;

#ifdef DEBUG_PRNT
            sysprintf("RibbonExistInEncoder out of RIBBON_ENC_HOLD\n");
#endif
        }

#endif
    }
}
BOOL CheckRibbonJam(VOID)
{
    _PrintCfg *pPrtCfg = GrabPrintConfig();
    BOOL state = TRUE;
    WORD EncodeData;

    if (GetPreMotorDir() == MOTOR_BACKWARD)
        return state;

    if (CheckRibbonEncoder && pPrtCfg->RibbonEncoder)
    {
        EncodeData = RibbonEncoder();    // check ribbon near end sensor

        // check encode error, speed too fast
//        if((EncodeData >= RIBBON_EMPTY_THRESHOLD) || (EncodeData == RIBBON_ENC_HOLD)) // ch_20220526
        if (EncodeData >= RIBBON_EMPTY_THRESHOLD) // ch_20220526
        {
            if(RibbonCount)
            {
                SendPrintf("error:%d\n",EncodeData);
            }
            ClearRibbonEncode();
            if (TryRibbonEncoder)
            {
                pPrtCfg->RibbonFlag = FALSE;
                CheckRibbonEncoder  = FALSE;
                TryRibbonEncoder    = FALSE;
            }
            else
                state = FALSE;
        }
        if (TryRibbonEncoder && EncodeData != (RIBBON_EMPTY_THRESHOLD * 2))
            TryRibbonEncoder = FALSE;
    }

    return state;
}

BOOL CheckRibbonEmpty(VOID)
{
    STATIC WORD ColorlessCount = 0;
    STATIC WORD SilverCount = 0;
    STATIC BOOL CheckSilver = FALSE;

    BOOL state = TRUE;

    if (GetPreMotorDir() == MOTOR_BACKWARD)
        return state;

    if (CheckRibbonSilver && CheckSilver)
    {
        if (GetSensorSignal(RIBBON_SENSOR) == SENSOR_UNDETECTED)    // is silver
            SilverCount++;
        else
            SilverCount = 0;

        // longer then .5" x 2 without seeing ribbon
        if (SilverCount > (WORD)(TPH_DPI / 2))
        {
            SilverCount = 0;
            state = FALSE;
        }
    }
    else if (CheckRibbonColorless)
    {
        if (GetSensorSignal(RIBBON_SENSOR) == SENSOR_DETECTED)
            ColorlessCount++;
        else
            ColorlessCount = 0;

        // longer then .5" without seeing ribbon
        if (ColorlessCount > (WORD)(TPH_DPI / 2))
        {
            ColorlessCount = 0;
            state = FALSE;
        }
    }
    
    return state;
}


#if 1
// ch_2022623
VOID ClrRibbonVars(VOID) {
    DetectRibbonStat = 0;
    DetectRibbonInterval = 0;
    PrevEncodeData = 0;    
}

// ch_20220611
UCHAR CheckRibbonStat(VOID)
{
    _PrintCfg *pPrtCfg = GrabPrintConfig();
    UCHAR state = 0;
    WORD EncodeData;
    STATIC WORD EncodeDataBkp = 555; // ch_20220622

    if (GetPreMotorDir() == MOTOR_BACKWARD)
        return state;

    if (CheckRibbonEncoder && pPrtCfg->RibbonEncoder)
    {
        EncodeData = RibbonEncoder();    // check ribbon near end sensor
        
///
// ch_20220622 : only for debug
//if (EncodeDataBkp != EncodeData) {
//    EncodeDataBkp = EncodeData;
//    sysprintf("R%d\n", EncodeData); // ch_20220604
//}
///

        // check encode error, speed too fast
//        if((EncodeData >= RIBBON_EMPTY_THRESHOLD) || (EncodeData == RIBBON_ENC_HOLD)) // ch_20220526
        if (EncodeData >= RIBBON_EMPTY_THRESHOLD) // ch_20220526
        {
//#ifdef DEBUG_PRNT
//sysprintf("R_%d\n", EncodeData); // ch_20220506
//#endif
            if(RibbonCount)
            {
                SendPrintf("error:%d\n",EncodeData);
            }
            ClearRibbonEncode();
            if (TryRibbonEncoder)
            {
                pPrtCfg->RibbonFlag = FALSE;
                CheckRibbonEncoder  = FALSE;
                TryRibbonEncoder    = FALSE;

                state &= ~(1<<1);
            }
            else
                state |= (1<<1);
        }

//        if (99 == PrevEncodeData) { // ch_20220617
        switch (DetectRibbonStat) { // ch_20220623
            case 0: // ch_20220623
//                if (PrevEncodeData >= 99) { // ch_20220722
                if (PrevEncodeData == 100/*99*/) { // ch_20220723 : changed to 100.
//                    if (0 == EncodeData) { // ch_20220722
                    if ((0 == EncodeData) || (100 == EncodeData)) { // ch_20220722
                        if (++DetectRibbonInterval >= 10) { // ch_20220725
                            DetectRibbonInterval = 0;
                            PrevEncodeData = 0;
//                            state |= (1<<0); // ch_20220623
                            DetectRibbonStat =  1; // ch_20220623
                        }
                    }
                    else {
                        DetectRibbonInterval = 0;
                        PrevEncodeData = 0;
                        state &= ~(1<<0);
                    }
                }
                else if (PrevEncodeData != EncodeData) {
                    PrevEncodeData = EncodeData;
                    DetectRibbonInterval = 0;
                    state &= ~(1<<0);
                }
                break;
        //    
        // ch_20220623    
            case 1:
//                if (0 == EncodeData) { // ch_20220722
                if ((0 == EncodeData) || (100 == EncodeData)) { // ch_20220722
                    if (++DetectRibbonInterval >= 400) {
                        DetectRibbonInterval = 0;
                        DetectRibbonStat = 2;
                    }                    
                }
                else {
                    DetectRibbonStat = 0;
                    PrevEncodeData = EncodeData; // ch_20220722
                    DetectRibbonInterval = 0;
                    state &= ~(1<<0);
                }
                break;
            case 2:
//                if (0 == EncodeData) { // ch_20220722
                if ((0 == EncodeData) || (100 == EncodeData)) { // ch_20220722
                    if (++DetectRibbonInterval >= 1100) { // ch_20220725
                        DetectRibbonInterval = 0;
                        ClearRibbonEncode(); // ch_20220725
                        state |= (1<<0);
                        DetectRibbonStat = 0;
                    }                    
                }
                else {
                    DetectRibbonStat = 0;
                    PrevEncodeData = EncodeData; // ch_20220722
                    DetectRibbonInterval = 0;
                    state &= ~(1<<0);
                }
                break;
            default:
                break;
        }
        //
//sysprintf("Prev_%d,EnC_%d\n", PrevEncodeData, EncodeData);
        
        if (TryRibbonEncoder && EncodeData != (RIBBON_EMPTY_THRESHOLD * 2))
            TryRibbonEncoder = FALSE;
    }

    return state;
}
#endif

#endif

RibbonDrv.h  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

#ifndef RIBBONDRV_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define RIBBONDRV_H

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */
    
/******************************************************************************
 *                                                                            *
 *                        G L O B A L   D E F I N E S                         *
 *                                                                            *
 ******************************************************************************/

#define CHECK_RIBBON_COLORLESS        0
#define CHECK_RIBBON_SILVER            1
#define CHECK_RIBBON_ENCODER        2

/******************************************************************************
 *                                                                            *
 *                 S T R U C T U R E   D E F I N I T I O N S                  *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *    G L O B A L   V A R I A B L E S   -   N O   I N I T I A L I Z E R S     *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *       G L O B A L   V A R I A B L E S   -   I N I T I A L I Z E R S        *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *                   F U N C T I O N   P R O T O T Y P E S                    *
 *                                                                            *
 ******************************************************************************/

VOID InitialRibbon(VOID);
VOID ClearRibbonEncode(VOID);
VOID StopTryRibbonEncoder(VOID);
BOOL GetRibbonCheck(INT);
BOOL DetectRibbonInten(VOID);
VOID CheckRibbonExists(BOOL, BOOL);
INT CheckRibbonJam(VOID);
INT CheckRibbonEmpty(VOID);
UCHAR CheckRibbonStat(VOID); // ch_20220611
VOID ClrRibbonVars(VOID); // ch_20220623

VOID StoreRibbonEncode(VOID);
VOID RestoreRibbonEncode(VOID);


#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值