JZ_lamp.c 9.3 KB
/* Includes ------------------------------------------------------------------*/

#include "JZ_lamp.h"
#include "JZ_uart.h"
#include "JZ_widget.h"
#include "JZ_TempControl.h"

/* Private constants ---------------------------------------------------------*/

/* Private types -------------------------------------------------------------*/

/* Private values -------------------------------------------------------------*/
extern int lampAngle;//无人机云台角度
int gimbalLinkageState = GIMBALLINKAGE_OFF;//云台联动初始状态为开启
pthread_mutex_t gimbalMutex; //无人机云台角度互斥锁
Lamp_Temp *lampTemp; //左右灯温度
int gimbalFineTuneAngle = 0; //云台微调角度
/* Private functions declaration ---------------------------------------------*/

/* Exported functions definition ---------------------------------------------*/

/************************************
*开灯
*函数名:lamp_on
*函数参数:
          
*返回值:
*函数作者:wzy
*************************************/
void Jz_Lamp_On(void)
{  
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x62,0x51,0x00,0x02,0x00,0x23};
    
   uart_send(sendData,sizeof(sendData));//发送开灯指令
}

/************************************
*关灯
*函数名:Lamp_Off
*函数参数:
          
*返回值:
*函数作者:wzy
*************************************/
void Jz_Lamp_Off(void)
{
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x62,0x51,0x00,0x00,0x00,0x23};
   
   uart_send(sendData,sizeof(sendData));//发送关灯指令
}


/************************************
*亮度控制
*函数名:Jz_LampLumenControl
*函数参数:
          @value1: 左灯亮度(十进制) 0~100
          @value2: 右灯亮度(十进制) 0~100
*返回值:
*函数作者:wzy
*************************************/
void Jz_LampLumenControl(int value1,int value2)
{  
   
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x63,0x51,0x00,0x00,0x00,0x23};             
   
   sendData[9] = value1; 
   sendData[10] = value2;
  
   uart_send(sendData,sizeof(sendData));
  
}

/************************************
*消息订阅 开/关
*函数名:Jz_Message_Queue_Closure
*函数参数:
        @value: 0关 1开  
*返回值:
*函数作者:wzy
*************************************/
void Jz_Message_Queue_Closure(int value)
{
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x68,0x51,0x00,0x00,0x00,0x23};
   
   switch (value)
   {
   case 0: sendData[10] = 0x00;
      break;
   case 1: sendData[10] = 0x01;
      break;
   default: printf("Message_Queue_Closure函数参数2输入错误,请输入0或1\n");
      break;
   }
   
   uart_send(sendData,sizeof(sendData));

}

/************************************
*接受连接请求
*函数名:Jz_Accepting_Connection_Requests
*函数参数:

*返回值:
*函数作者:wzy
*************************************/
void Jz_Accepting_Connection_Requests(void)
{
    char sendData[]={0x5b,0x5b,0x77,0x00,0x0c,0x00,0x00,0x50,0x51,0x21,0x00,0x23};
   
    uart_send(sendData,sizeof(sendData));
    usleep(100);
}

/************************************
*云台控制
*函数名:Lamp_Gimbal_Control
*函数参数:
          @value: 云台旋转角度(十进制) 0~180
*返回值:
*函数作者:wzy
*************************************/
void Jz_Lamp_Gimbal_Control(int value)
{  
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0e,0x00,0x00,0x64,0x51,0xff,0x00,0x00,0x00,0x23};             
   
   //十进制数转两个16进制数  0~1800
    sendData[10] = value*10/256; 
    sendData[11] = value*10%256;
  
    uart_send(sendData,sizeof(sendData));
  
}

/************************************
*云台联动状态改变
*函数名:Jz_GimbalLinkage
*函数参数:
           @value: 0 关闭云台联动 1 开启云台联动
*返回值:
*函数作者:wzy
*************************************/
void Jz_GimbalLinkage(int value)
{ 
   //改变云台联动状态
   switch (value)
   {
   case 0:   
          gimbalLinkageState = GIMBALLINKAGE_OFF;
          break;
   case 1:  
          gimbalLinkageState = GIMBALLINKAGE_ON;
          break;
   } 
  
}

/************************************
*云台联动线程
*函数名:GimbalLinkage_Task
*函数参数:
         
*返回值:
*函数作者:wzy
*************************************/
static void *GimbalLinkage_Task(void *arg)
{ 
  static int lastX = 200;//上次角度值
  int Angle = 0;

  while (1)
  {  
      if(gimbalLinkageState == GIMBALLINKAGE_ON)
      {        
         Angle = lampAngle - gimbalFineTuneAngle; //经过微调后的角度
         
         if(Angle >= 90)
         {
            Angle = 90;
         }
         if(Angle <= 0)
         {
            Angle = 0;
         }
         if(lastX != Angle)//和上次角度不同
         {  
           // printf("Angle:%d\n",Angle);          
            Jz_Lamp_Gimbal_Control(Angle);                       
            Jz_set_widget_value(15,Angle*100/90);
         }
         lastX = Angle;//更新上次角度
         
      }
      else
      {
      lastX = 200;
      }
      usleep(50);
  }

}

/************************************
*云台联动线程创建
*函数名:Jz_GimbalLinkageTaskCrete
*函数参数:
        
*返回值:  
         成功返回0 失败返回-1
*函数作者:wzy
*************************************/
int Jz_GimbalLinkageTaskCrete(void)
{
  pthread_t pthread;
  pthread_attr_t  pthread_attr;
 
  pthread_attr_init(&pthread_attr);
  pthread_attr_setdetachstate(&pthread_attr, PTHREAD_CREATE_DETACHED);    //设置线程分离属性
  
  gimbalLinkageState = GIMBALLINKAGE_ON;//默认开启云台联动

   //初始化互斥锁
  pthread_mutex_init(&gimbalMutex,NULL);

  int ret = pthread_create(&pthread,&pthread_attr,GimbalLinkage_Task,NULL);
  if(ret !=0)
  {
    printf("线程创建失败\n");
    return -1;
  }
  return 0;
}

/************************************
*灯状态初始化
*函数名:lamp_init
*函数参数:
         
*返回值:
*函数作者:wzy
*************************************/
void lamp_init(void)
{   
   lampTemp = (Lamp_Temp *)calloc(1,sizeof(Lamp_Temp));
   JZ_TempStructInit();//温控结构体初始化
   
   usleep(500*1000);
   Jz_Message_Queue_Closure(1);//开启消息订阅
  
   Jz_GimbalLinkageTaskCrete();//云台联动线程创建
   
   Jz_TempControlTaskCreate();//温度调控线程创建	  
}

/************************************
*灯光模式切换
*函数名:JZ_LampModeSwitch
*函数参数:
          @value : 0-灯光关闭 1-灯光常亮 2-灯光爆闪
*返回值:
*函数作者:wzy
*************************************/
void JZ_LampModeSwitch(int value)
{ 
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x62,0x51,0x00,0x00,0x00,0x23};
   
   switch (value)
   {
   case LIGHT_OFF://灯光关闭
      sendData[10] = 0x00;
      break;

   case LIGHT_BURST://灯光爆闪
      sendData[10] = 0x01;
      break;

   case LIGHT_ON_CONSTANTLY://灯光常亮
      sendData[10] = 0x02;
      break;   

   default:
      printf("JZ_LampModeSwitch 参数2错误\n");
      break;
   }
  
   uart_send(sendData,sizeof(sendData));
   
}

/************************************
*爆闪频率
*函数名:JZ_LampFlashFrequency
*函数参数:
          @value:爆闪频率 0~100
*返回值:
*函数作者:wzy
*************************************/
void JZ_LampFlashFrequency(int value)
{ 
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x61,0x51,0x00,0x00,0x00,0x23};
    
   sendData[10] = value; 

   uart_send(sendData,sizeof(sendData));
   
}

/************************************
*探照灯云台角度查询
*函数名:JZ_LampFlashFrequency
*函数参数:
          @value:爆闪频率 0~100
*返回值:
*函数作者:wzy
*************************************/
void JZ_LampGimbalAngleGet(void)
{ 
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x01,0x00,0x6F,0x54,0x00,0x00,0x00,0x23};

   uart_send(sendData,sizeof(sendData));
   
}

/************************************
*警灯颜色选择
*函数名:JZ_SelectPoliceLampColor
*函数参数:
          @color1:颜色1(0x01~0x05)对应 红、绿、蓝、黄、白
          @color2:颜色1(0x01~0x05)对应 红、绿、蓝、黄、白
*返回值:
*函数作者:wzy
*************************************/
void JZ_SelectPoliceLampColor(uint8_t color1,uint8_t color2)
{ 
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x67,0x51,0x00,0x00,0x00,0x23};
   
   sendData[9] = color1;
   sendData[10] = color2;
   uart_send(sendData,sizeof(sendData));  
}

/************************************
*警灯模式选择
*函数名:JZ_SelectPoliceLampMode
*函数参数:
          @value:0:关 1:开
          @mode:0(交替快闪),1(交替慢闪),2(交替齐闪)
*返回值:
*函数作者:wzy
*************************************/
void JZ_SelectPoliceLampMode(uint8_t value,uint8_t mode)
{ 
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x00,0x00,0x66,0x51,0x00,0x00,0x00,0x23};
   
   sendData[9] = value;
   sendData[10] = mode;
   uart_send(sendData,sizeof(sendData));  
}

/************************************
*灯光模式获取
*函数名:JZ_LampModeGet
*函数参数:
          
*返回值:
*函数作者:wzy
*************************************/
void JZ_LampModeGet(void)//操作失败
{
   char sendData[]={0x5a,0x5a,0x77,0x00,0x0d,0x01,0x00,0x6F,0x51,0x00,0x00,0x00,0x23};
  
   uart_send(sendData,sizeof(sendData));
   
//    //等待结果
//    while (lampModel == 0)
//    {
      
//    }
//    *ret = lampModel;

 }