SideLaser.c 10.4 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 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

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

            LastSideLaserInfo.attribute.status = g_SideLaserInfo.attribute.status;
            delayMs(10);
            continue;
        }
        
        if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
        {
            if (LastSideLaserInfo.attribute.status != JZ_FLAGCODE_ON)
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_ON);
            }

            LastSideLaserInfo.attribute.status = g_SideLaserInfo.attribute.status;
        }

        if (g_SideLaserInfo.attribute.mode != LastSideLaserInfo.attribute.mode)
        {
            LastSideLaserInfo.attribute.mode = g_SideLaserInfo.attribute.mode;
            HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, LastSideLaserInfo.attribute.mode);
        }
        
        delayMs(10);
    }

#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;

    if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
    {
        g_SideLaserInfo.attribute.Uimode = g_SideLaserInfo.attribute.mode - 1;
    }

    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;

    if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_ON)
    {
        g_SideLaserInfo.attribute.Uimode = g_SideLaserInfo.attribute.mode - 1;
    }
    else
    {
        g_SideLaserInfo.attribute.Uimode = 0;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

///*******************************
// * 
// *  设置侧面激光参数
// * 
// * 
// * *****************************/
//T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, int *value)
//{
//    T_JZsdkReturnCode ret;
//
//    if (flagcode == JZ_FLAGCODE_GET)
//    {
//        switch (paramflag)
//        {
//            case SIDELASER_REALMODE:
//            {
//                *value = g_SideLaserInfo.Uimode;
//            }
//            break;
//
//            case SIDELASER_CONTROL:
//            {
//               *value = g_SideLaserInfo.attribute.status;
//            }
//            break;     
//
//            case SIDELASER_MODE:
//            {
//                *value = g_SideLaserInfo.attribute.mode;
//            }
//            break;
//
//            default:
//            {
//                *value = JZ_FLAGCODE_OFF;
//            }
//            break;
//        }
//    
//        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//    }
//    else if (flagcode == JZ_FLAGCODE_SET)
//    {
//        switch (paramflag)
//        {
//            case SIDELASER_CONTROL:
//            {
//                JZSDK_LOG_INFO("设置激光控制值:%d",*value);
//                g_SideLaserInfo.attribute.status = *value;
//                if (*value == JZ_FLAGCODE_OFF)
//                {
//                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
//                }
//                else
//                {
//                    g_SideLaserInfo.Uimode  = g_SideLaserInfo.attribute.mode + 1;
//                }
//            }
//            break;
//
//            case SIDELASER_MODE:
//            {
//                JZSDK_LOG_INFO("设置激光模式值:%d",*value);
//                g_SideLaserInfo.attribute.mode = *value;
//                if (g_SideLaserInfo.attribute.status == JZ_FLAGCODE_OFF)
//                {
//                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
//                }
//                else
//                {
//                    g_SideLaserInfo.Uimode  = g_SideLaserInfo.attribute.mode + 1;
//                }
//            }
//            break;
//
//            case SIDELASER_REALMODE:
//            {
//                if (*value == JZ_FLAGCODE_OFF)
//                {
//                    g_SideLaserInfo.attribute.status = JZ_FLAGCODE_OFF;
//                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
//                }
//                else
//                {
//                    g_SideLaserInfo.attribute.status = JZ_FLAGCODE_ON;
//                    g_SideLaserInfo.Uimode  = JZ_FLAGCODE_ON;
//                    g_SideLaserInfo.attribute.mode = *value - 1;
//                }
//            }
//
//            default:
//            {
//                *value = JZ_FLAGCODE_OFF;
//            }
//            break;
//        }
//    
//        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//    }
//
//    JZSDK_LOG_ERROR("参数获取出错");
//    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//}

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

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}