JZ_lamp.c
9.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
/* 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;
}