SideLaser.c 8.2 KB
#include <stdio.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"

#include <pthread.h>

#include "Ircut/ircut.h"
#include "SideLaser/SideLaser.h"

#include "Hal_Send/HalSend.h"

static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status);

static T_JzSideLaserInfo g_SideLaserInfo;

static int SideLaser_Mode2Uimode(int Mode)
{
    int Uimode;
    
    if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
    {
        Uimode = Mode + 1;
    }
    else
    {
        Uimode = 0;
    }

    return Uimode;
}

static void *SideLaserControl_task(void *arg)
{
    T_JzSideLaserInfo LastSideLaserInfo = g_SideLaserInfo;

    int tempStatus = LastSideLaserInfo.attribute.status;

#if DEVICE_VERSION == JZ_U3S

    while (1)
    {
        if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_OFF)
        {
            if (LastSideLaserInfo.attribute.status != JZ_FLAGCODE_OFF)
            {
                SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
            }
        
            LastSideLaserInfo.attribute.status = g_SideLaserInfo.attribute.status;
            delayMs(10);
            continue;
        }

        
        switch(g_SideLaserInfo.attribute.mode)
        {
            case SIDE_LASER_GREEN_AWALYS_ON:
            {
                if (LastSideLaserInfo.attribute.mode != g_SideLaserInfo.attribute.mode)
                {
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                    SideLaser_RealCotrol(0, JZ_FLAGCODE_ON);
                }

                LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;
                delayMs(10);
                continue;
            }
            break;

            case SIDE_LASER_RED_AWALYS_ON:
            {
                if (LastSideLaserInfo.attribute.mode != g_SideLaserInfo.attribute.mode)
                {
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                    SideLaser_RealCotrol(1, JZ_FLAGCODE_ON);
                }

                LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;
                delayMs(10);
                continue;
            }
            break;

            case SIDE_LASER_GREEN_AND_RED_AWALYS_ON:
            {
                if (LastSideLaserInfo.attribute.mode != g_SideLaserInfo.attribute.mode)
                {
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                }

                LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;
                delayMs(10);
                continue;
            }
            break;

            case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER:
            {
                LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;

                if (tempStatus == JZ_FLAGCODE_OFF)
                {
                    tempStatus = JZ_FLAGCODE_ON;
                }
                else
                {
                    tempStatus = JZ_FLAGCODE_OFF;
                }
                
                SideLaser_RealCotrol(255, tempStatus);
                delayMs(1000/g_SideLaserInfo.Frequency);
                continue;
            }
            break;

            case SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER:
            {
                LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;

                if (tempStatus == JZ_FLAGCODE_OFF)
                {
                    tempStatus = JZ_FLAGCODE_ON;
                    SideLaser_RealCotrol(0,JZ_FLAGCODE_ON);
                    SideLaser_RealCotrol(1,JZ_FLAGCODE_OFF);
                }
                else
                {
                    tempStatus = JZ_FLAGCODE_OFF;
                    SideLaser_RealCotrol(0,JZ_FLAGCODE_OFF);
                    SideLaser_RealCotrol(1,JZ_FLAGCODE_ON);
                }

                delayMs(1000/g_SideLaserInfo.Frequency);
                continue;
            }   
            break;

            default:
            {
                SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                delayMs(10);
                continue;
            }
            break;
        }
    }

#endif

#if DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_T40S

    while (1)
    {
        //没有任何的改变
        if (LastSideLaserInfo.attribute.status == g_SideLaserInfo.attribute.status &&
            LastSideLaserInfo.attribute.mode == g_SideLaserInfo.attribute.mode)
        {
            delayMs(20);
            continue;
        }

        if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_OFF)
        {
            if (LastSideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20, JZ_FLAGCODE_OFF);
                LastSideLaserInfo.attribute.status = g_SideLaserInfo.attribute.status;
            }
        }

        if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
        {
            if (g_SideLaserInfo.attribute.mode == SIDE_LASER_LEFT_AWALYS_ON)
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x21, JZ_FLAGCODE_ON);
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x22, JZ_FLAGCODE_OFF);
                HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, 0x02);
            }
            else if (g_SideLaserInfo.attribute.mode == SIDE_LASER_RIGHT_AWALYS_ON)
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x21, JZ_FLAGCODE_OFF);
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x22, JZ_FLAGCODE_ON);
                HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, 0x02);
            }
            else
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20, JZ_FLAGCODE_ON);
                HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, g_SideLaserInfo.attribute.mode);
            }

            LastSideLaserInfo.attribute.status = g_SideLaserInfo.attribute.status;
            LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;
        }
        
        delayMs(20);
    }

#endif
}   

/******************
*
*  侧面激光初始化
* 
*****************/
T_JZsdkReturnCode SideLaser_Init(T_JzSideLaserInfo LaserInfo)
{
    T_JZsdkOsalHandler* OsalHandle;
    OsalHandle = JZsdk_Platform_GetOsalHandler();
    if (OsalHandle == NULL)
    {
        JZSDK_LOG_INFO("sidelaser init failure");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    memcpy(&g_SideLaserInfo, &LaserInfo, sizeof(T_JzSideLaserInfo));

    T_JZTaskHandle sideLaserTask;
    OsalHandle->TaskCreate("sidelaer", SideLaserControl_task, 2048, NULL, &sideLaserTask);

    JZSDK_LOG_INFO("侧边激光初始化完成");
}


/************************************
 * 
 *  侧边激光控制
 *  laserNum 0~254为单控
 *  255为全控
 * *******************************/
static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status)
{
    //JZSDK_LOG_INFO("realControl %d %d",LaserNum,status);
    if (DEVICE_VERSION == JZ_U3S)
    {
        //0是绿激光
        if (LaserNum == 0)
        {
            Ircut_SideLaser_IrcutControl(0, status);
        }
        
        //1是红激光  
        if (LaserNum == 1)
        {
            Ircut_SideLaser_IrcutControl(1, status);
        }
        
        //255是全控
        if (LaserNum == 255)
        {
            Ircut_SideLaser_IrcutControl(0, status);
            Ircut_SideLaser_IrcutControl(1, status);
        }
    }
}

/*****************
*
* 设置激光模式
*
****************/
T_JZsdkReturnCode SideLaser_SetMode(E_SideLaserMode mode)
{
    JZSDK_LOG_INFO("SideLaser_SetMode:%d", mode);
    g_SideLaserInfo.attribute.mode = mode;
    g_SideLaserInfo.attribute.Uimode = SideLaser_Mode2Uimode(mode);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/***********
*
*   控制激光
* 
*********/
T_JZsdkReturnCode SideLaser_SetControl(int status)
{
    JZSDK_LOG_INFO("SideLaser_SetControl:%d", status);
    g_SideLaserInfo.attribute.status = status;
    g_SideLaserInfo.attribute.Uimode = SideLaser_Mode2Uimode(g_SideLaserInfo.attribute.mode);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************
 * 
 *  获取激光侧面信息
 *  
 * 
 * ***********************/
T_JZsdkReturnCode SideLaser_GetInfo(T_JzSideLaserInfo*SideLaserInfo)
{
    memcpy(SideLaserInfo, &g_SideLaserInfo, sizeof(T_JzSideLaserInfo));

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}