Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
car-controlserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenzhongjian
car-controlserver
Commits
aacb5f30
Commit
aacb5f30
authored
Sep 09, 2025
by
957dd
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/tank_change_shot_delay' into 'master'
Feature/tank change shot delay See merge request
!66
parents
7366b05e
634d5df3
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
181 additions
and
134 deletions
+181
-134
CMakeLists.txt
CMakeLists.txt
+1
-1
main.c
app/main/main.c
+3
-0
main.h
app/main/main.h
+2
-0
version.h
build/include/version.h
+1
-1
main
build/main
+0
-0
tank0202_control.c
drivers/devicecontrol/tank0202_control.c
+1
-94
tank_common.c
drivers/devicecontrol/tank_common.c
+30
-30
tank_common.h
drivers/devicecontrol/tank_common.h
+3
-0
gpio_control.c
drivers/gpio/gpio_control.c
+104
-7
gpio_control.h
drivers/gpio/gpio_control.h
+21
-0
warn.h
drivers/sensors/warn.h
+1
-1
devcontrol_common.h
include/devcontrol_common.h
+1
-0
zlog.conf
zlog.conf
+13
-0
No files found.
CMakeLists.txt
View file @
aacb5f30
cmake_minimum_required
(
VERSION 3.10
)
project
(
car
VERSION 1.2.1
0
VERSION 1.2.1
2
LANGUAGES C
)
...
...
app/main/main.c
View file @
aacb5f30
...
...
@@ -34,6 +34,9 @@ int main(){
my_zlog_warn
(
"此版本电压没有使用INA226"
);
}
if
(
device_shot_cooling_init
()
!=
0
){
my_zlog_warn
(
"该设备没有冷却"
);
}
if
(
audio_init
()
==
0
){
my_zlog_warn
(
"音频初始化成功"
);
...
...
app/main/main.h
View file @
aacb5f30
...
...
@@ -30,6 +30,8 @@ int device_mqtt_topic_init();
int
ina225_init
();
/*设备射击冷却初始化*/
int
device_shot_cooling_init
();
/*线程初始化函数*/
int
thread_start_init
(
ThreadFunc
thread_exit_time
,
ThreadFunc
thread_mqtt_beat
,
...
...
build/include/version.h
View file @
aacb5f30
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH 1
0
#define PROJECT_VERSION_PATCH 1
1
#define GIT_HASH ""
#define BUILD_TIMESTAMP ""
#define BUILD_USER ""
build/main
View file @
aacb5f30
No preview for this file type
drivers/devicecontrol/tank0202_control.c
View file @
aacb5f30
...
...
@@ -23,43 +23,6 @@ void mode_lift_flont(unsigned char gval) {
if
(
flont_speed
>
95
)
flont_speed
=
95
;
pwmWrite
(
PWM_PIN_SPEED
,
flont_speed
);
}
// if (gval < 50) {
// pwmWrite(PWM_PIN_SPEED, 75);
// } else if (gval <= 55) {
// pwmWrite(PWM_PIN_SPEED, 78);
// } else if (gval <= 60) {
// pwmWrite(PWM_PIN_SPEED, 79);
// } else if (gval <= 65) {
// pwmWrite(PWM_PIN_SPEED, 80);
// } else if (gval <= 70) {
// pwmWrite(PWM_PIN_SPEED, 81);
// } else if (gval <= 75) {
// pwmWrite(PWM_PIN_SPEED, 82);
// } else if (gval <= 90) {
// pwmWrite(PWM_PIN_SPEED, 83);
// } else if (gval <= 100) {
// pwmWrite(PWM_PIN_SPEED, 84);
// } else if (gval <= 110) {
// pwmWrite(PWM_PIN_SPEED, 85);
// } else if (gval <= 120) {
// pwmWrite(PWM_PIN_SPEED, 86);
// } else if (gval <= 130) {
// pwmWrite(PWM_PIN_SPEED, 87);
// } else if (gval <= 140) {
// pwmWrite(PWM_PIN_SPEED, 88);
// } else if (gval <= 150) {
// pwmWrite(PWM_PIN_SPEED, 89);
// } else if (gval <= 160) {
// pwmWrite(PWM_PIN_SPEED, 90);
// } else if (gval <= 170) {
// pwmWrite(PWM_PIN_SPEED, 91);
// } else if (gval <= 180) {
// pwmWrite(PWM_PIN_SPEED, 92);
// } else if (gval <= 190) {
// pwmWrite(PWM_PIN_SPEED, 93);
// } else if (gval <= 200) {
// pwmWrite(PWM_PIN_SPEED, 94);
// }
}
void
mode_lift_back
(
unsigned
char
gval
)
{
...
...
@@ -74,44 +37,7 @@ void mode_lift_back(unsigned char gval) {
int
back_speed
=
70
-
(
gval
-
70
)
/
10
-
b
;
if
(
back_speed
<
55
)
back_speed
=
55
;
pwmWrite
(
PWM_PIN_SPEED
,
back_speed
);
}
// if (gval < 50) {
// pwmWrite(PWM_PIN_SPEED, 75);
// } else if (gval <= 55) {
// pwmWrite(PWM_PIN_SPEED, 72);
// } else if (gval <= 60) {
// pwmWrite(PWM_PIN_SPEED, 71);
// } else if (gval <= 65) {
// pwmWrite(PWM_PIN_SPEED, 70);
// } else if (gval <= 70) {
// pwmWrite(PWM_PIN_SPEED, 69);
// } else if (gval <= 75) {
// pwmWrite(PWM_PIN_SPEED, 68);
// } else if (gval <= 90) {
// pwmWrite(PWM_PIN_SPEED, 67);
// } else if (gval <= 100) {
// pwmWrite(PWM_PIN_SPEED, 66);
// } else if (gval <= 110) {
// pwmWrite(PWM_PIN_SPEED, 65);
// } else if (gval <= 120) {
// pwmWrite(PWM_PIN_SPEED, 64);
// } else if (gval <= 130) {
// pwmWrite(PWM_PIN_SPEED, 63);
// } else if (gval <= 140) {
// pwmWrite(PWM_PIN_SPEED, 62);
// } else if (gval <= 150) {
// pwmWrite(PWM_PIN_SPEED, 61);
// } else if (gval <= 160) {
// pwmWrite(PWM_PIN_SPEED, 60);
// } else if (gval <= 170) {
// pwmWrite(PWM_PIN_SPEED, 59);
// } else if (gval <= 180) {
// pwmWrite(PWM_PIN_SPEED, 58);
// } else if (gval <= 190) {
// pwmWrite(PWM_PIN_SPEED, 57);
// } else if (gval <= 200) {
// pwmWrite(PWM_PIN_SPEED, 56);
// }
}
}
void
mode_right_flont
(
unsigned
char
gval
)
{
...
...
@@ -230,24 +156,5 @@ void tank0202_change(unsigned char *buf) {
mode_right_back
(
tank0202_steering_val
+
20
);
}
// if(mode == 1 ) {
// //mode_lift_flont(val);
// mode_right_flont(val);
// g_modecount_tank0202=0;
// }else if(mode == 2 ) {
// //mode_lift_back(val);
// mode_right_back(val);
// g_modecount_tank0202=1;
// }
// if((mode == 1||mode ==2)&&val == 0) g_modecount_tank0202=0;
// if(mode == 3) {
// if(g_modecount_tank0202 == 0) mode_lift_back(val+20);
// if(g_modecount_tank0202 == 1) mode_lift_flont(val+20);
// }else if(mode == 4) {
// if(g_modecount_tank0202 == 0) mode_lift_flont(val+20);
// if(g_modecount_tank0202 == 1) mode_lift_back(val+20);
// }
}
drivers/devicecontrol/tank_common.c
View file @
aacb5f30
...
...
@@ -9,8 +9,8 @@ int tank_shot_back_stop(unsigned char pin,unsigned char val);
const
tank_common_back
*
g_tank_common_config_t
=
NULL
;
long
long
shot_device_time_start
=
0
;
long
long
shot_device_time_end
=
0
;
int
g_tank_shot_index
=
0
;
//状态机,用于状态机,坦克接收射击倒退状态机全局变量
int
g_tank_shot_index_cool
=
1
;
//状态机,用于冷却状态机,坦克接收射击倒退状态机全局变量
/*击打后退速度设置,混空模式下为单路,单独模式下为双路控制,后续需要优化*/
void
tank_shot_back
(
unsigned
char
gval
)
{
...
...
@@ -46,24 +46,24 @@ void tank_shot_back(unsigned char gval) {
const
tank_common_back
tank_common_config_t
[]
=
{
{
.
device_id
=
DEVICE_TANK0202
,
.
back_time
=
25
,
//后退多少ms
.
back_interval_back
=
300
,
//间隔多少ms才能再次使用
.
shot_back_speed
=
8
0
,
.
back_time
=
30
,
//后退多少ms
.
back_interval_back
=
1000
,
//间隔多少次才能再次使用,一次等于5ms
.
shot_back_speed
=
9
0
,
.
shot_back
=
tank_shot_back_stop
},
{
.
device_id
=
DEVICE_TANK0203
,
.
back_time
=
25
,
//后退多少ms
.
back_interval_back
=
300
,
//间隔多少ms才能再次使用
.
shot_back_speed
=
8
0
,
.
back_time
=
30
,
//后退多少ms
.
back_interval_back
=
1000
,
//间隔多少次才能再次使用,一次等于5ms
.
shot_back_speed
=
9
0
,
.
shot_back
=
tank_shot_back_stop
},
{
.
device_id
=
DEVICE_TANK0204
,
.
back_time
=
25
,
//后退多少ms
.
back_interval_back
=
300
,
//间隔多少ms才能再次使用
.
shot_back_speed
=
8
0
,
.
back_time
=
30
,
//后退多少ms
.
back_interval_back
=
1000
,
//间隔多少次才能再次使用,一次等于5ms
.
shot_back_speed
=
9
0
,
.
shot_back
=
tank_shot_back_stop
},
...
...
@@ -93,17 +93,19 @@ void tank_shot_back_stop_task_function(void *arg) {
// }
// }else tank_shot_back(0);
//下面一部分为射击后按时间后退
long
long
interval
=
shot_device_time_start
-
shot_device_time_end
;
if
(
g_device_delay_back_count
>
g_tank_common_config_t
->
back_time
&&
g_device_delay_back_count
<
(
g_tank_common_config_t
->
back_time
+
30
))
tank_shot_back
(
0
);
if
(
interval
>
g_tank_common_config_t
->
back_interval_back
){
if
(
g_device_delay_back_count
<=
g_tank_common_config_t
->
back_time
)
{
tank_shot_back
(
g_tank_common_config_t
->
shot_back_speed
);
my_zlog_debug
(
"操作耗时: %lld 毫秒"
,
interval
);
}
if
(
g_device_delay_back_count
<=
g_tank_common_config_t
->
back_time
)
{
tank_shot_back
(
g_tank_common_config_t
->
shot_back_speed
);
my_zlog_debug
(
"击打成功"
);
}
else
if
(
g_device_delay_back_count
>
g_tank_common_config_t
->
back_time
&&
g_device_delay_back_count
<
(
g_tank_common_config_t
->
back_time
+
30
)){
tank_shot_back
(
0
);
}
else
if
(
g_device_delay_back_count
>
g_tank_common_config_t
->
back_interval_back
){
g_tank_shot_index
=
1
;
}
else
{
delay_ms
(
1
);
}
}
...
...
@@ -122,8 +124,7 @@ void tank_shot_pthrpoll_task_init(){
/*坦克后退射击*/
int
tank_shot_back_stop
(
unsigned
char
pin
,
unsigned
char
val
){
static
int
shot_count
=
0
;
shot_device_time_start
=
get_current_time_millis
();
if
(
pin
!=
27
){
my_zlog_debug
(
"非27引脚"
);
return
1
;
...
...
@@ -131,20 +132,19 @@ int tank_shot_back_stop(unsigned char pin,unsigned char val){
if
(
val
==
0
)
{
tank_shot_back
(
0
);
shot_count
=
2
;
}
if
(
val
!=
0
)
{
if
(
shot_count
==
0
){
if
(
g_tank_shot_index
==
0
){
tank_shot_pthrpoll_task_init
();
shot_count
=
1
;
g_tank_shot_index
=
1
;
}
shot_count
=
1
;
if
(
shot_count
==
1
){
if
(
g_tank_shot_index
==
1
&&
g_tank_shot_index_cool
==
0
){
g_device_delay_back_count
=
0
;
g_tank_shot_index
=
2
;
g_tank_shot_index_cool
=
1
;
}
}
shot_device_time_end
=
get_current_time_millis
();
}
/*销毁坦克使用的线程池,让其正常销毁,只有在tank相关设备号下才有用,最后销毁都会到device——common.h中*/
...
...
drivers/devicecontrol/tank_common.h
View file @
aacb5f30
...
...
@@ -17,4 +17,6 @@ void tank_shot_stop_control(int device_id,unsigned char pin,unsigned char val);
/*关闭线程*/
void
tank_thread_close
();
extern
int
g_tank_shot_index_cool
;
#endif
\ No newline at end of file
drivers/gpio/gpio_control.c
View file @
aacb5f30
#include "common.h"
#include "gpio_control.h"
#include "tank_angle.h"
#include "gpio_init.h"
#include "device_init.h"
#include "gpio_init.h"
#include "devcontrol_common.h"
#include "http_request.h"
#include "delay.h"
...
...
@@ -27,13 +27,111 @@ void tank0206_pwm_value(int pin,int value);
void
ship0301_pwm_value
(
int
pin
,
int
value
);
void
dog0501_pwm_value
(
int
pin
,
int
value
);
uint64_t
g_tank_shot_interval_ms
=
5000
;
//冷却时间
uint64_t
g_tank_shot_ms
=
1000
;
//射击时间
TankFireControl
g_device_shot_t
;
// 真正的结构体变量
/*获取时间戳函数*/
// uint64_t get_shot_timestamp_ms() {
// struct timeval tv;
// if (gettimeofday(&tv, NULL) == -1) {
// my_zlog_error("gettimeofday failed");
// return 0;
// }
// return (uint64_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
// }
/**
* @brief 初始化坦克射击控制器
* @param this 控制器指针
* @param interval_ms 冷却时间(毫秒)
* @param duration_ms 射击持续时间(毫秒)
*/
void
device_shot_fire_init
(
TankFireControl
*
this
,
uint32_t
interval_ms
,
uint32_t
duration_ms
)
{
this
->
last_shot_end_time
=
0
;
this
->
shooting_start_time
=
0
;
this
->
state
=
TANK_STATE_READY
;
this
->
shot_interval_ms
=
interval_ms
;
this
->
shot_duration_ms
=
duration_ms
;
}
/*
**射击需要的相关设备冷却初始化
**对需要射击冷却的进行初始化
*/
int
device_shot_cooling_init
(){
if
(
g_device_type
==
DEVICE_TANK0202
||
g_device_type
==
DEVICE_TANK0203
){
my_zlog_info
(
"using %d shot init"
,
g_device_type
);
device_shot_fire_init
(
&
g_device_shot_t
,
g_tank_shot_interval_ms
,
g_tank_shot_ms
);
}
else
{
return
-
1
;
}
return
0
;
}
/**
* @brief 检查坦克射击状态
* @param this 控制器指针
* @return 0=允许射击, -1=禁止射击(冷却中或射击中)
*/
int
device_fire_check
(
TankFireControl
*
this
)
{
uint64_t
current_time
=
get_current_time_millis
();
// 假设已实现此函数
switch
(
this
->
state
)
{
case
TANK_STATE_READY
:
if
(
current_time
-
this
->
last_shot_end_time
<
this
->
shot_interval_ms
)
{
return
-
1
;
// 仍在冷却
}
my_zlog_info
(
"shot start"
);
// 开始新射击
this
->
shooting_start_time
=
current_time
;
this
->
state
=
TANK_STATE_SHOOTING
;
return
0
;
case
TANK_STATE_SHOOTING
:
if
(
current_time
-
this
->
shooting_start_time
>
this
->
shot_duration_ms
)
{
// 射击结束,进入冷却
my_zlog_info
(
"shotend,cooling"
);
this
->
last_shot_end_time
=
current_time
;
this
->
state
=
TANK_STATE_COOLDOWN
;
g_tank_shot_index_cool
=
0
;
return
-
1
;
}
my_zlog_info
(
"shot continue"
);
return
0
;
// 继续射击
case
TANK_STATE_COOLDOWN
:
if
(
current_time
-
this
->
last_shot_end_time
>=
this
->
shot_interval_ms
)
{
this
->
state
=
TANK_STATE_READY
;
my_zlog_info
(
"coolend"
);
return
0
;
// 冷却完成
}
return
-
1
;
// 仍在冷却
}
return
-
1
;
}
/*
*设备加上冷却射击切换
*/
int
device_shoting_check
(
int
pin
,
int
val
){
if
(
device_fire_check
(
&
g_device_shot_t
)
!=
0
){
softPwmWrite
(
pin
,
0
);
}
else
{
softPwmWrite
(
pin
,
val
);
}
}
/*坦克限位线程函数*/
void
tank_angle_limit_function
(
void
*
arg_gpio
){
static
int
limit_log_count
=
0
;
if
(
arg_gpio
!=
NULL
)
{
free
(
arg_gpio
);
}
printf
(
"limit task started.
\n
"
);
my_zlog_debug
(
"limit task started.
"
);
while
(
1
){
int
limit_status
=
angle_limit
();
if
(
limit_status
==
1
)
{
...
...
@@ -64,7 +162,6 @@ void device_gpio_control_threadpoll_init(){
*
arg_gpio
=
2
;
g_pool_device_gpio_control_t
=
thread_pool_init
(
1
,
1
);
thread_pool_add_task
(
g_pool_device_gpio_control_t
,
tank_angle_limit_function
,
arg_gpio
);
}
/*设备拉低引脚结构体数组*/
...
...
@@ -146,7 +243,7 @@ void device_gpio_control(int device_id,int pin,int val) {
}
for
(
int
i
=
0
;
i
<
GPIO_ID_THREAD_COUNT
;
i
++
){
if
(
gpio_control_config_t
&&
device_id
==
gpio_device_id
[
i
]){
my_zlog_info
(
"线程函数:%d
\n
"
,
device_id
);
my_zlog_info
(
"线程函数:%d"
,
device_id
);
gpio_control_config_t
->
device_gpio_pthread_create
();
//创建线程,线程关闭在tank.common.h中何tank需要的其他线程关闭
}
}
...
...
@@ -254,7 +351,7 @@ void tank0202_pwm_value(int pin,int value) { //软件陪我们控制调速
if
(
value
==
1
)
{
if
(
pin
==
27
){
softPwmWrite
(
pin
,
30
);
device_shoting_check
(
27
,
30
);
}
else
{
softPwmWrite
(
pin
,
40
);
my_zlog_debug
(
"pwm:%d"
,
pin
);
...
...
@@ -279,7 +376,7 @@ void tank0203_pwm_value(int pin,int value) { //软件陪我们控制调速
if
(
value
==
1
)
{
if
(
pin
==
27
){
softPwmWrite
(
pin
,
38
);
device_shoting_check
(
27
,
30
);
}
else
{
softPwmWrite
(
pin
,
35
);
my_zlog_debug
(
"pwm:%d"
,
pin
);
...
...
@@ -304,7 +401,7 @@ void tank0204_pwm_value(int pin,int value){
if
(
value
==
1
)
{
if
(
pin
==
27
){
softPwmWrite
(
pin
,
38
);
device_shoting_check
(
27
,
30
);
}
else
{
softPwmWrite
(
pin
,
35
);
my_zlog_debug
(
"pwm:%d"
,
pin
);
...
...
drivers/gpio/gpio_control.h
View file @
aacb5f30
...
...
@@ -10,8 +10,28 @@ typedef struct {
void
(
*
device_gpio_pthread_create
)(
void
);
}
gpiocontrol_t
;
// 坦克射击状态枚举
typedef
enum
{
TANK_STATE_READY
,
// 可射击
TANK_STATE_SHOOTING
,
// 射击中
TANK_STATE_COOLDOWN
// 冷却中
}
TankState
;
// 坦克射击控制结构体
typedef
struct
{
uint64_t
last_shot_end_time
;
// 上次射击结束时间
uint64_t
shooting_start_time
;
// 本次射击开始时间
TankState
state
;
// 当前状态
uint32_t
shot_interval_ms
;
// 射击冷却间隔(毫秒)
uint32_t
shot_duration_ms
;
// 单次射击持续时间(毫秒)
}
TankFireControl
;
void
device_gpio_control
(
int
device_id
,
int
pin
,
int
val
);
int
device_shot_cooling_init
();
extern
ThreadPool_t
*
g_pool_device_gpio_control_t
;
extern
int
g_tank_shot_index
;
#endif
\ No newline at end of file
drivers/sensors/warn.h
View file @
aacb5f30
...
...
@@ -2,7 +2,7 @@
#define WARN_H__
/*当mode为1时候打开警报,为2时候关闭警告*/
#define WARN_MODE
1
#define WARN_MODE
2
int
alarm_control
(
float
voltage
);
...
...
include/devcontrol_common.h
View file @
aacb5f30
...
...
@@ -2,6 +2,7 @@
#define DEVCONTROL_COMMON_H
#include "device_init.h"
#include "gpio_control.h"
#include "car0101_control.h"
#include "car0102_control.h"
#include "car0103_control.h"
...
...
zlog.conf
0 → 100644
View file @
aacb5f30
[
global
]
strict
init
=
true
buffer
min
=
1024
buffer
max
=
2
MB
default
format
=
"%d(%Y-%m-%d %H:%M:%S.%ms) %-6V (%c:%F:%L) - %m%n"
file
perms
=
600
# 设置文件权限
[
formats
]
millisecond
=
"%d(%Y-%m-%d %H:%M:%S.%ms) [%V] %m%n"
[
rules
]
# 日志文件路径,30天轮询,自动创建目录
my_log
.*
"/home/orangepi/car/master/log/log.log"
,
30
D
;
millisecond
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment