SideLaser.c 9.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_JZsdkSideLaserInfo g_SideLaserInfo;

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

    int tempStatus = LastSideLaserInfo.status;

#if DEVICE_VERSION == JZ_U3S

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

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

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

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

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

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

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

            case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER:
            {
                LastSideLaserInfo.mode = g_SideLaserInfo.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.mode = g_SideLaserInfo.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.status == JZ_FLAGCODE_OFF)
        {
            if (LastSideLaserInfo.status != JZ_FLAGCODE_OFF)
            {
                HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_OFF);
            }

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

            LastSideLaserInfo.status = g_SideLaserInfo.status;
        }

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

#endif
}   

/************************************
 * 
 *  侧边激光初始化
 * 
 * 
 * *******************************/
T_JZsdkReturnCode SideLaser_Init()
{

    g_SideLaserInfo.status = JZ_FLAGCODE_OFF;
    g_SideLaserInfo.mode = SIDE_LASER_GREEN_AWALYS_ON;
    g_SideLaserInfo.Frequency = 50;

    pthread_t Task;
	pthread_attr_t task_attribute; //线程属性
	pthread_attr_init(&task_attribute);  //初始化线程属性
	pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED);      //设置线程属性
    
    int task_ret = pthread_create(&Task,&task_attribute,SideLaserControl_task,NULL);		//TTS线程
    if(task_ret != 0)
    {
        JZSDK_LOG_ERROR("创建侧边激光线程失败!\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    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_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.status;
            }
            break;     

            case SIDELASER_MODE:
            {
                *value = g_SideLaserInfo.mode;
            }

            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.status = *value;
                if (*value == JZ_FLAGCODE_OFF)
                {
                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
                }
                else
                {
                    g_SideLaserInfo.Uimode  = g_SideLaserInfo.mode + 1;
                }
            }
            break;

            case SIDELASER_MODE:
            {
                JZSDK_LOG_INFO("设置激光模式值:%d",*value);
                g_SideLaserInfo.mode = *value;
                if (g_SideLaserInfo.status == JZ_FLAGCODE_OFF)
                {
                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
                }
                else
                {
                    g_SideLaserInfo.Uimode  = g_SideLaserInfo.mode + 1;
                }
            }
            break;

            case SIDELASER_REALMODE:
            {
                if (*value == JZ_FLAGCODE_OFF)
                {
                    g_SideLaserInfo.status = JZ_FLAGCODE_OFF;
                    g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
                }
                else
                {
                    g_SideLaserInfo.status = JZ_FLAGCODE_ON;
                    g_SideLaserInfo.Uimode  = JZ_FLAGCODE_ON;
                    g_SideLaserInfo.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_JZsdkSideLaserInfo *SideLaserInfo)
{
    SideLaserInfo->status = g_SideLaserInfo.status;
    SideLaserInfo->mode = g_SideLaserInfo.mode;
    SideLaserInfo->Frequency = g_SideLaserInfo.Frequency;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}