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

#include <pthread.h>

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


static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status);



static T_SideLaserMode g_SideLaser_RealMode = SIDE_LASER_OFF; //实际控制灯光的值

static int g_SideLaserMode = 0; //realmode -1
static int g_SideLaserControl = JZ_FLAGCODE_OFF;

static int SideLaser_Frequency = 50; //1~100


static void *SideLaserControl_task(void *arg)
{
    int status = JZ_FLAGCODE_OFF;
    static T_SideLaserMode Last_LaserMode = SIDE_LASER_OFF;

    while (1)
    {
        switch (g_SideLaser_RealMode)
        {
            case SIDE_LASER_OFF:
            {
                if (Last_LaserMode == g_SideLaser_RealMode)
                {
                    delayMs(10);
                    continue;
                }
                else
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                    continue;
                }
                break;
            }
    
            case SIDE_LASER_GREEN_AWALYS_ON:
            {
                if (Last_LaserMode == g_SideLaser_RealMode)
                {
                    delayMs(10);
                    continue;
                }
                else
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                    SideLaser_RealCotrol(0, JZ_FLAGCODE_ON);
                    continue;
                }
                break;
            }
    
            case SIDE_LASER_RED_AWALYS_ON:
            {
                if (Last_LaserMode == g_SideLaser_RealMode)
                {
                    delayMs(10);
                    continue;
                }
                else
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
                    SideLaser_RealCotrol(1, JZ_FLAGCODE_ON);
                    continue;
                }
                break;
            }

                
            case SIDE_LASER_GREEN_AND_RED_AWALYS_ON:
            {
                if (Last_LaserMode == g_SideLaser_RealMode)
                {
                    delayMs(10);
                    continue;
                }
                else
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                    SideLaser_RealCotrol(255, JZ_FLAGCODE_ON);
                    continue;
                }
                break;
            }

            case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER:
            {
                if (Last_LaserMode != g_SideLaser_RealMode)
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                }

                if (status == JZ_FLAGCODE_OFF)
                {
                    status = JZ_FLAGCODE_ON;
                }
                else
                {
                    status = JZ_FLAGCODE_OFF;
                }
                
                SideLaser_RealCotrol(255, status);

                delayMs(1000/SideLaser_Frequency);

                continue;
            }
  
            case SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER:
            {
                if (Last_LaserMode != g_SideLaser_RealMode)
                {
                    Last_LaserMode = g_SideLaser_RealMode;
                }

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

                delayMs(1000/SideLaser_Frequency);

                continue;
            }
                                   
            default:
                break;
        }
        
        delayMs(10);
    }
    
}   

/************************************
 * 
 *  侧边激光初始化
 * 
 * 
 * *******************************/
T_JZsdkReturnCode SideLaser_Init()
{
    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_PinControl(1, 6, status);
        }
        
        //1是红激光  
        if (LaserNum == 1)
        {
            Ircut_PinControl(1, 7, status);
        }
        
        //255是全控
        if (LaserNum == 255)
        {
            Ircut_PinControl(1, 6, status);
            Ircut_PinControl(1, 7, 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_SideLaser_RealMode;
            }
            break;

            case SIDELASER_CONTROL:
            {
               *value = g_SideLaserControl;
            }
            break;     

            case SIDELASER_MODE:
            {
                *value = g_SideLaserMode;
            }

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }
    else if (flagcode == JZ_FLAGCODE_SET)
    {
        switch (paramflag)
        {
            case SIDELASER_CONTROL:
            {
                g_SideLaserControl = *value;
                JZSDK_LOG_INFO("设置激光控制值:%d",g_SideLaserControl);
                //从灯光的模式和控制计算得到实际控制值
                if (g_SideLaserControl == JZ_FLAGCODE_OFF)
                {
                    g_SideLaser_RealMode = SIDE_LASER_OFF;
                }
                else
                {
                    g_SideLaser_RealMode = g_SideLaserMode+1;
                }
            }
            break;

            case SIDELASER_MODE:
            {
                g_SideLaserMode = *value;
                JZSDK_LOG_INFO("设置激光模式值:%d",g_SideLaserMode);
                if (g_SideLaserControl == JZ_FLAGCODE_OFF)
                {
                    g_SideLaser_RealMode = SIDE_LASER_OFF;
                }
                else
                {
                    g_SideLaser_RealMode = g_SideLaserMode+1;
                }
            }
            break;

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    JZSDK_LOG_ERROR("参数获取出错");
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}