Commit aacb5f30 authored by 957dd's avatar 957dd

Merge branch 'feature/tank_change_shot_delay' into 'master'

Feature/tank change shot delay See merge request !66
parents 7366b05e 634d5df3
cmake_minimum_required(VERSION 3.10)
project(car
VERSION 1.2.10
VERSION 1.2.12
LANGUAGES C
)
......
......@@ -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("音频初始化成功");
......
......@@ -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,
......
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH 10
#define PROJECT_VERSION_PATCH 11
#define GIT_HASH ""
#define BUILD_TIMESTAMP ""
#define BUILD_USER ""
No preview for this file type
......@@ -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);
// }
}
......@@ -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=80,
.back_time=30,//后退多少ms
.back_interval_back=1000, //间隔多少次才能再次使用,一次等于5ms
.shot_back_speed=90,
.shot_back=tank_shot_back_stop
},
{
.device_id = DEVICE_TANK0203,
.back_time=25,//后退多少ms
.back_interval_back=300, //间隔多少ms才能再次使用
.shot_back_speed=80,
.back_time=30,//后退多少ms
.back_interval_back=1000, //间隔多少次才能再次使用,一次等于5ms
.shot_back_speed=90,
.shot_back=tank_shot_back_stop
},
{
.device_id = DEVICE_TANK0204,
.back_time=25,//后退多少ms
.back_interval_back=300, //间隔多少ms才能再次使用
.shot_back_speed=80,
.back_time=30,//后退多少ms
.back_interval_back=1000, //间隔多少次才能再次使用,一次等于5ms
.shot_back_speed=90,
.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中*/
......
......@@ -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
#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);
......
......@@ -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
......@@ -2,7 +2,7 @@
#define WARN_H__
/*当mode为1时候打开警报,为2时候关闭警告*/
#define WARN_MODE 1
#define WARN_MODE 2
int alarm_control(float voltage);
......
......@@ -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"
......
[global]
strict init = true
buffer min = 1024
buffer max = 2MB
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", 30D; millisecond
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment