diff --git a/app/by_fan_control.c b/app/by_fan_control.c index ad7ccc5..66d2b11 100644 --- a/app/by_fan_control.c +++ b/app/by_fan_control.c @@ -12,11 +12,13 @@ void by_pwm_init(void) void by_pwm_update_duty(uint32_t update_pwm_duty) { - if (7000UL > update_pwm_duty) { - update_pwm_duty = 7000UL; + if (4000UL < update_pwm_duty) { + update_pwm_duty = 4000UL; } pwm_set_duty(TIM4_PWM_MAP1_CH1_D12, update_pwm_duty); pwm_set_duty(TIM4_PWM_MAP1_CH2_D13, update_pwm_duty); + // pwm_set_duty(TIM4_PWM_MAP1_CH3_D14, update_pwm_duty); + // pwm_set_duty(TIM4_PWM_MAP1_CH4_D15, update_pwm_duty); } void by_pwm_power_duty(uint32_t power_pwm_duty_l, uint32_t power_pwm_duty_r) diff --git a/app/by_pt_button.h b/app/by_pt_button.h deleted file mode 100644 index 0a7202f..0000000 --- a/app/by_pt_button.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _BY_PT_BUTTON_H__ -#define _BY_PT_BUTTON_H__ - -#include "stdio.h" -#include "ch32v30x.h" -#define POTATE_BUTTOM_PRESS 1 -#define POTATE_BUTTOM_FOREWARD 2 -#define POTATE_BUTTOM_BACKWARD 3 -extern uint8_t potate_button; - - -extern void by_exit_init(void); -extern void by_gpio_init(void); -extern uint8_t by_get_statu(void); -extern void by_ips_show(void); - -#endif \ No newline at end of file diff --git a/app/by_pt_button.c b/app/by_rt_button.c similarity index 70% rename from app/by_pt_button.c rename to app/by_rt_button.c index 549478d..40b5471 100644 --- a/app/by_pt_button.c +++ b/app/by_rt_button.c @@ -1,7 +1,7 @@ -#include "by_pt_button.h" +#include "by_rt_button.h" #include "zf_common_headfile.h" #include "by_imu.h" -uint8_t potate_button; +uint8_t rotate_button; void by_gpio_init(void) { @@ -11,21 +11,26 @@ void by_gpio_init(void) void by_exit_init(void) { exti_init(E9, EXTI_TRIGGER_FALLING); - exti_init(E11, EXTI_TRIGGER_FALLING); + exti_init(E11, EXTI_TRIGGER_BOTH); } -uint8_t by_get_pb_statu(void) +/** + * @brief 查询旋钮状态 - 查询后状态归零 + * + * @return uint8_t 当前旋钮状态 + */ +uint8_t by_get_rb_status(void) { - uint8_t temp_s = potate_button; - potate_button = 0; + uint8_t temp_s = rotate_button; + rotate_button = 0; return temp_s; } void by_ips_show(void) { - ips200_show_string(0, 0, "button statu:"); - // ips200_show_uint(104, 0, by_get_pb_statu(), 1); - switch (by_get_pb_statu()) { + ips200_show_string(0, 0, "button status:"); + // ips200_show_uint(104, 0, by_get_rb_status(), 1); + switch (by_get_rb_status()) { case 1: ips200_show_string(104, 0, "press"); break; @@ -45,7 +50,7 @@ void by_ips_show(void) ips200_show_float(46, 32, eulerAngle.pitch, 3, 2); ips200_show_float(46, 48, eulerAngle.roll, 3, 2); ips200_show_float(46, 64, eulerAngle.yaw, 3, 2); - // ips200_show_float(46 , 32, icm_data.gyro_x, 2, 2); + // ips200_show_float(46 , 32, icm_data.gyro_x, 2, 2); // ips200_show_float(106, 32, icm_data.gyro_y, 2, 2); // ips200_show_float(166, 32, icm_data.gyro_z, 2, 2); ips200_show_float(46, 80, imu660ra_temperature, 2, 2); diff --git a/app/by_rt_button.h b/app/by_rt_button.h new file mode 100644 index 0000000..c42d6e0 --- /dev/null +++ b/app/by_rt_button.h @@ -0,0 +1,24 @@ +#ifndef _BY_RT_BUTTON_H__ +#define _BY_RT_BUTTON_H__ + +#include "stdio.h" +#include "ch32v30x.h" + +#define LONG_PRESS_THRESHOLD_MS (300ULL) +#define LONG_PRESS_THRESHOLD_TICK (LONG_PRESS_THRESHOLD_MS * 18000ULL) + +typedef enum rotate_button_event { + rotate_button_press_short = 1, + rotate_button_press_long = 2, + rotate_button_forward = 3, + rotate_button_backward = 4, +} rotate_button_event; + +extern uint8_t rotate_button; + +extern void by_exit_init(void); +extern void by_gpio_init(void); +extern uint8_t by_get_rb_status(void); +extern void by_ips_show(void); + +#endif \ No newline at end of file diff --git a/app/cw_servo.c b/app/cw_servo.c deleted file mode 100644 index f8132e0..0000000 --- a/app/cw_servo.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "zf_common_headfile.h" -#include "cw_servo.h" - -void cw_servo_init(void) -{ - pwm_init(SERVO_L_PWM_CHANNEL, 50, 1000); - pwm_init(SERVO_R_PWM_CHANNEL, 50, 1000); -} - -void cw_servo_set_angle(float servo_l_angle, float servo_r_angle) -{ - uint32_t servo_l_duty_s = (uint32_t)(servo_l_angle * SERVO_L_DUTY_PER_ANGLE); - uint32_t servo_r_duty_s = (uint32_t)(servo_r_angle * SERVO_R_DUTY_PER_ANGLE); - - pwm_set_duty(SERVO_L_PWM_CHANNEL, servo_l_duty_s); - pwm_set_duty(SERVO_R_PWM_CHANNEL, servo_r_duty_s); -} diff --git a/app/cw_servo.h b/app/cw_servo.h deleted file mode 100644 index eddec90..0000000 --- a/app/cw_servo.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _CW_SERVO_H__ -#define _CW_SERVO_H__ - -#include "zf_common_headfile.h" - -#define SERVO_L_PWM_CHANNEL TIM2_PWM_MAP0_CH1_A0 -#define SERVO_R_PWM_CHANNEL TIM2_PWM_MAP0_CH2_A1 - -#define SERVO_MAX_ANGLE_RANGE (90.0F) -#define SERVO_L_DUTY_MAX (1100.0F) -#define SERVO_L_DUTY_MIN (900.0F) -#define SERVO_R_DUTY_MAX (1100.0F) -#define SERVO_R_DUTY_MIN (900.0F) -#define SERVO_L_DUTY_PER_ANGLE ((SERVO_L_DUTY_MAX - SERVO_L_DUTY_MIN) / SERVO_MAX_ANGLE_RANGE) -#define SERVO_R_DUTY_PER_ANGLE ((SERVO_R_DUTY_MAX - SERVO_R_DUTY_MIN) / SERVO_MAX_ANGLE_RANGE) - -extern void cw_servo_init(void); -extern void cw_servo_set_angle(float servo_l_angle, float servo_r_angle); - -#endif diff --git a/app/gl_common.h b/app/gl_common.h index 535b315..6698b8f 100644 --- a/app/gl_common.h +++ b/app/gl_common.h @@ -1,32 +1,28 @@ #ifndef COMMON_H_ #define COMMON_H_ - - -#define IMAGE_H (MT9V03X_H) -#define IMAGE_W (MT9V03X_W) -#define BEGINH_L (80) -#define BEGINH_R (80) -#define BEGINW_L (-18) -#define BEGINW_R (-12) -#define PT_MAXLEN (75) -#define GET_PIX_1C(IMG, H, W) (IMG[(H) * MT9V03X_W + (W)]) //获取像素点的值 -#define FIX_BINTHRESHOLD (140) //设置最开始的阈值 -#define SELFADAPT_KERNELSIZE (7) //巡线区域核大小 -#define FILTER_KERNELSIZE (7) //滤波核大小 -#define SELFADAPT_OFFSET (8) //适应性块大小 -#define PIXPERMETER (56) -#define RESAMPLEDIST (0.02) -#define ANGLEDIST (0.2) -#define ROADWIDTH (0.45) -#define FRAMENONE (1) -#define FRAMETOLEFT (5) -#define FRAMETORIGHT (5) +#define IMAGE_H (MT9V03X_H) +#define IMAGE_W (MT9V03X_W) +#define BEGINH_L (61) +#define BEGINH_R (61) +#define BEGINW_L (-18) +#define BEGINW_R (-12) +#define PT_MAXLEN (75) +#define GET_PIX_1C(IMG, H, W) (IMG[(H) * MT9V03X_W + (W)]) // 获取像素点的值 +#define FIX_BINTHRESHOLD (140) // 设置最开始的阈值 +#define SELFADAPT_KERNELSIZE (7) // 巡线区域核大小 +#define FILTER_KERNELSIZE (7) // 滤波核大小 +#define SELFADAPT_OFFSET (8) // 适应性块大小 +#define PIXPERMETER (56) +#define RESAMPLEDIST (0.02f) +#define ANGLEDIST (0.2f) +#define ROADWIDTH (0.45f) +#define FRAMENONE (1) +#define FRAMETOLEFT (5) +#define FRAMETORIGHT (5) int32_t limit(int32_t x, int32_t low, int32_t up); int clip(int x, int low, int up); -float fclip(float x, float low, float up) ; - - +float fclip(float x, float low, float up); #endif /* COMMON_H_ */ \ No newline at end of file diff --git a/app/gl_data.c b/app/gl_data.c new file mode 100644 index 0000000..766fb00 --- /dev/null +++ b/app/gl_data.c @@ -0,0 +1,62 @@ +#include "gl_data.h" + +uint8_t (*Img_Gray)[MT9V03X_W]; +int32_t pts_left[PT_MAXLEN][2]; +int32_t pts_right[PT_MAXLEN][2]; +int32_t pts_left_count; +int32_t pts_right_count; +float pts_inv_l[PT_MAXLEN][2]; +float pts_inv_r[PT_MAXLEN][2]; +int32_t pts_inv_l_count; +int32_t pts_inv_r_count; +float pts_filter_l[PT_MAXLEN][2]; +float pts_filter_r[PT_MAXLEN][2]; +int32_t pts_filter_l_count; +int32_t pts_filter_r_count; +float pts_resample_left[PT_MAXLEN][2]; +float pts_resample_right[PT_MAXLEN][2]; +int32_t pts_resample_left_count; +int32_t pts_resample_right_count; + +float mid_left[PT_MAXLEN][2]; +float mid_right[PT_MAXLEN][2]; + +int32_t mid_left_count; +int32_t mid_right_count; + +float angle_new_left[PT_MAXLEN]; +float angle_new_right[PT_MAXLEN]; +int angle_new_left_num; +int angle_new_right_num; +uint8_t mt9v03x_image_copy[MT9V03X_H][MT9V03X_W]; + +float angle_left[PT_MAXLEN]; +float angle_right[PT_MAXLEN]; +int angle_left_num; +int angle_right_num; + +int Lpt0_rpts0s_id; +int Lpt1_rpts1s_id; +bool Lpt0_found; +bool Lpt1_found; +int Lpt1[2]; +int Lpt0[2]; + +int Lpt_in0_rpts0s_id; +int Lpt_in1_rpts1s_id; +bool Lpt_in0_found; +bool Lpt_in1_found; +int Lpt_in1[2]; +int Lpt_in0[2]; + +bool is_straight0; +bool is_straight1; + +bool is_turn0; +bool is_turn1; + +float rptsn[PT_MAXLEN][2]; +int32_t rptsn_num; +float aim_distance; + +track_type_e track_type = TRACK_RIGHT; \ No newline at end of file diff --git a/app/gl_data.h b/app/gl_data.h new file mode 100644 index 0000000..5915646 --- /dev/null +++ b/app/gl_data.h @@ -0,0 +1,74 @@ +#pragma once + +#ifndef _GL_DATA_H +#define _GL_DATA_H + +#include "gl_headfile.h" + +typedef enum track_type_e { + TRACK_LEFT = 0, + TRACK_RIGHT, +} track_type_e; + +extern uint8_t (*Img_Gray)[MT9V03X_W]; +extern int32_t pts_left[PT_MAXLEN][2]; +extern int32_t pts_right[PT_MAXLEN][2]; +extern int32_t pts_left_count; +extern int32_t pts_right_count; +extern float pts_inv_l[PT_MAXLEN][2]; +extern float pts_inv_r[PT_MAXLEN][2]; +extern int32_t pts_inv_l_count; +extern int32_t pts_inv_r_count; +extern float pts_filter_l[PT_MAXLEN][2]; +extern float pts_filter_r[PT_MAXLEN][2]; +extern int32_t pts_filter_l_count; +extern int32_t pts_filter_r_count; +extern float pts_resample_left[PT_MAXLEN][2]; +extern float pts_resample_right[PT_MAXLEN][2]; +extern int32_t pts_resample_left_count; +extern int32_t pts_resample_right_count; + +extern float mid_left[PT_MAXLEN][2]; +extern float mid_right[PT_MAXLEN][2]; + +extern int32_t mid_left_count; +extern int32_t mid_right_count; + +extern float angle_new_left[PT_MAXLEN]; +extern float angle_new_right[PT_MAXLEN]; +extern int angle_new_left_num; +extern int angle_new_right_num; +extern uint8_t mt9v03x_image_copy[MT9V03X_H][MT9V03X_W]; + +extern float angle_left[PT_MAXLEN]; +extern float angle_right[PT_MAXLEN]; +extern int angle_left_num; +extern int angle_right_num; + +extern int Lpt0_rpts0s_id; +extern int Lpt1_rpts1s_id; +extern bool Lpt0_found; +extern bool Lpt1_found; +extern int Lpt1[2]; +extern int Lpt0[2]; + +extern int Lpt_in0_rpts0s_id; +extern int Lpt_in1_rpts1s_id; +extern bool Lpt_in0_found; +extern bool Lpt_in1_found; +extern int Lpt_in1[2]; +extern int Lpt_in0[2]; + +extern bool is_straight0; +extern bool is_straight1; + +extern bool is_turn0; +extern bool is_turn1; + +extern float rptsn[PT_MAXLEN][2]; +extern int32_t rptsn_num; +extern float aim_distance; + +extern track_type_e track_type; + +#endif diff --git a/app/gl_headfile.h b/app/gl_headfile.h index 11591ce..1482de7 100644 --- a/app/gl_headfile.h +++ b/app/gl_headfile.h @@ -1,8 +1,6 @@ #ifndef GL_HEADFILE #define GL_HEADFILE - - #include "gl_state.h" #include "gl_img_process.h" #include "gl_common.h" @@ -14,8 +12,7 @@ #include "gl_tracking.h" #include "gl_circle.h" #include "gl_cross.h" +#include "gl_data.h" #include "math.h" - - #endif /* STATE_H_ */ \ No newline at end of file diff --git a/app/gl_state.h b/app/gl_state.h index 5a3c29f..dc762c0 100644 --- a/app/gl_state.h +++ b/app/gl_state.h @@ -2,21 +2,27 @@ #define STATE_H_ enum state_type_e { - COMMON_STATE = 0, - CROSS_STATE,HALF_STATE, - CIRCLE_IN_STATE,CIRCLE_BEGIN_STATE, - CIRCLE_RUNNING_STATE,CIRCLE_OUT_STATE, - TURN_STATE,STRAIGHT_STATE, - BREAK_STATE,BAR_STATE, - RAMP_STATE,GARAGE_OUT_STATE, - GARAGE_IN_STATE,GARAGE_STOP_STATE, - GARAGE_PASS_STATE, + COMMON_STATE = 0, + CROSS_STATE, + HALF_STATE, + CIRCLE_IN_STATE, + CIRCLE_BEGIN_STATE, + CIRCLE_RUNNING_STATE, + CIRCLE_OUT_STATE, + TURN_STATE, + STRAIGHT_STATE, + BREAK_STATE, + BAR_STATE, + RAMP_STATE, + GARAGE_OUT_STATE, + GARAGE_IN_STATE, + GARAGE_STOP_STATE, + GARAGE_PASS_STATE, }; extern enum state_type_e state_type; -#define CROSS_AIM (0.49) -#define COMMON_AIM (0.31) - +#define CROSS_AIM (0.49f) +#define COMMON_AIM (0.31f) #endif /* STATE_H_ */ diff --git a/app/gl_tracking.c b/app/gl_tracking.c index b41eb73..41edd20 100644 --- a/app/gl_tracking.c +++ b/app/gl_tracking.c @@ -65,11 +65,11 @@ void MidLineTrack() { } } - // 车轮对应点(纯跟踪起始点) + // 车轮对应点 (纯跟踪起始点) float cx = UndistInverseMapW[(int) (IMAGE_H * 0.90f)][78]; float cy = UndistInverseMapH[(int) (IMAGE_H * 0.90f)][78]; - // 找最近点(起始点中线归一化) + // 找最近点 (起始点中线归一化) float min_dist = 1e10; int begin_id = -1; diff --git a/app/isr.c b/app/isr.c index ce1e22e..6e909d6 100644 --- a/app/isr.c +++ b/app/isr.c @@ -2,11 +2,11 @@ * CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ * Copyright (c) 2022 SEEKFREE ɿƼ * - * ļCH32V307VCT6 Դһ + * ļ CH32V307VCT6 Դһ * * CH32V307VCT6 Դ - * Ըᷢ GPLGNU General Public License GNUͨù֤ - * GPL ĵ3棨 GPL3.0ѡģκκİ汾·/޸ + * Ըᷢ GPLGNU General Public License GNU ͨù֤ + * GPL ĵ 3 棨 GPL3.0ѡģκκİ汾·/޸ * * Դķϣܷãδκεı֤ * ûԻʺض;ı֤ @@ -30,11 +30,12 @@ * * ޸ļ¼ * ע - * 2022-09-15 W first version + * 2022-09-15 W first version ********************************************************************************************************************/ #include "zf_common_headfile.h" -#include "by_pt_button.h" +#include "by_rt_button.h" +#include "by_imu.h" void NMI_Handler(void) __attribute__((interrupt())); void HardFault_Handler(void) __attribute__((interrupt())); @@ -197,10 +198,10 @@ void EXTI9_5_IRQHandler(void) if (SET == EXTI_GetITStatus(EXTI_Line9)) { if (SET == gpio_get_level(E10)) { - potate_button = POTATE_BUTTOM_BACKWARD; + rotate_button = rotate_button_backward; } else { - potate_button = POTATE_BUTTOM_FOREWARD; + rotate_button = rotate_button_forward; } EXTI_ClearITPendingBit(EXTI_Line9); } @@ -217,37 +218,46 @@ void EXTI15_10_IRQHandler(void) EXTI_ClearITPendingBit(EXTI_Line10); } if (SET == EXTI_GetITStatus(EXTI_Line11)) { - - system_delay_us(200); - if (SET == !gpio_get_level(E11)) { - potate_button = POTATE_BUTTOM_PRESS; + static uint64_t time_via = 0; + system_delay_ms(10); + if (RESET == gpio_get_level(E11)) { + time_via = system_get_tick(); + EXTI_ClearITPendingBit(EXTI_Line11); + } else if (SET == gpio_get_level(E11)) { + time_via = system_get_tick() - time_via; + if (time_via > LONG_PRESS_THRESHOLD_TICK) { + rotate_button = rotate_button_press_long; + } else { + rotate_button = rotate_button_press_short; + } + time_via = 0; + EXTI_ClearITPendingBit(EXTI_Line11); } - EXTI_ClearITPendingBit(EXTI_Line11); - } - if (SET == EXTI_GetITStatus(EXTI_Line12)) { - EXTI_ClearITPendingBit(EXTI_Line12); - } - if (SET == EXTI_GetITStatus(EXTI_Line13)) { - // -----------------* ToF INT ж Ԥжϴ *----------------- - tof_module_exti_handler(); - // -----------------* ToF INT ж Ԥжϴ *----------------- - // ˴дû (A13/B13..E13) Ŵ + if (SET == EXTI_GetITStatus(EXTI_Line12)) { + EXTI_ClearITPendingBit(EXTI_Line12); + } + if (SET == EXTI_GetITStatus(EXTI_Line13)) { + // -----------------* ToF INT ж Ԥжϴ *----------------- + tof_module_exti_handler(); + // -----------------* ToF INT ж Ԥжϴ *----------------- + // ˴дû (A13/B13..E13) Ŵ - // ˴дû (A13/B13..E13) Ŵ + // ˴дû (A13/B13..E13) Ŵ - EXTI_ClearITPendingBit(EXTI_Line13); - } - if (SET == EXTI_GetITStatus(EXTI_Line14)) { - // -----------------* DM1XA ź Ԥжϴ *----------------- - dm1xa_light_callback(); - // -----------------* DM1XA ź Ԥжϴ *----------------- - EXTI_ClearITPendingBit(EXTI_Line14); - } - if (SET == EXTI_GetITStatus(EXTI_Line15)) { - // -----------------* DM1XA /ź Ԥжϴ *----------------- - dm1xa_sound_callback(); - // -----------------* DM1XA /ź Ԥжϴ *----------------- - EXTI_ClearITPendingBit(EXTI_Line15); + EXTI_ClearITPendingBit(EXTI_Line13); + } + if (SET == EXTI_GetITStatus(EXTI_Line14)) { + // -----------------* DM1XA ź Ԥжϴ *----------------- + dm1xa_light_callback(); + // -----------------* DM1XA ź Ԥжϴ *----------------- + EXTI_ClearITPendingBit(EXTI_Line14); + } + if (SET == EXTI_GetITStatus(EXTI_Line15)) { + // -----------------* DM1XA /ź Ԥжϴ *----------------- + dm1xa_sound_callback(); + // -----------------* DM1XA /ź Ԥжϴ *----------------- + EXTI_ClearITPendingBit(EXTI_Line15); + } } } diff --git a/app/main.c b/app/main.c index 32dca7d..c9e4023 100644 --- a/app/main.c +++ b/app/main.c @@ -1,105 +1,42 @@ /********************************************************************************************************************* - * CH32V307VCT6 Opensourec Library ????CH32V307VCT6 ???????????????? SDK ?????????????? - * Copyright (c) 2022 SEEKFREE ????? + * CH32V307VCT6 Opensourec Library 即(CH32V307VCT6 开源库)是一个基于官方 SDK 接口的第三方开源库 + * Copyright (c) 2022 SEEKFREE 逐飞科技 * - * ??????? CH32V307VCT6 ??????????? + * 本文件是 CH32V307VCT6 开源库的一部分 * - * CH32V307VCT6 ????? ????????? - * ?????????????????????????? GPL??GNU General Public License???? GNU ??锟斤拷???????????????? - * ?? GPL ??? 3 ?锟斤拷?? GPL3.0????????????锟绞︼拷?????锟斤拷?????锟斤拷?????/??????? + * CH32V307VCT6 开源库 是免费软件 + * 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU 通用公共许可证)的条款 + * 即 GPL 的第 3 版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 * - * ????????????????????????????????锟斤拷???????锟绞︼拷??? - * ????????????????????????????????? - * ?????????锟斤拷?GPL + * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 + * 甚至没有隐含的适销性或适合特定用途的保证 + * 更多细节请参见 GPL * - * ?????????????????????????? GPL ????? - * ?????锟斤拷?????? + * 您应该在收到本开源库的同时收到一份 GPL 的副本 + * 如果没有,请参阅 * - * ????????? - * ?????????? GPL3.0 ????????锟斤拷?? ?????????????????锟斤拷 - * ?????????????? libraries/doc ???????? GPL3_permission_statement.txt ????? - * ??????????? libraries ??????? ???????????? LICENSE ??? - * ?????锟斤拷??锟斤拷??????????? ????????????????????????????????????????? - * - * ??????? main - * ??????? ?????????????? - * ?锟斤拷??? ?? libraries/doc ??????? version ??? ?锟斤拷??? - * ???????? MounRiver Studio V1.8.1 - * ?????? CH32V307VCT6 - * ???????? https://seekfree.taobao.com/ - * - * ????? - * ???? ???? ??? - * 2022-09-15 ?? W first version + * 额外注明: + * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 + * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 + * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 + * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) ********************************************************************************************************************/ #include "zf_common_headfile.h" #include "gl_headfile.h" -#include "by_pt_button.h" +#include "by_rt_button.h" #include "by_fan_control.h" -#include "cw_servo.h" #include "./page/cw_page.h" -uint8_t (*Img_Gray)[MT9V03X_W]; -int32_t pts_left[PT_MAXLEN][2]; -int32_t pts_right[PT_MAXLEN][2]; -int32_t pts_left_count, pts_right_count; -float pts_inv_l[PT_MAXLEN][2], pts_inv_r[PT_MAXLEN][2]; -int32_t pts_inv_l_count, pts_inv_r_count; -float pts_filter_l[PT_MAXLEN][2], pts_filter_r[PT_MAXLEN][2]; -int32_t pts_filter_l_count, pts_filter_r_count; -float pts_resample_left[PT_MAXLEN][2], pts_resample_right[PT_MAXLEN][2]; -int32_t pts_resample_left_count, pts_resample_right_count; -float mid_left[PT_MAXLEN][2], mid_right[PT_MAXLEN][2]; -int32_t mid_left_count, mid_right_count; - -float angle_new_left[PT_MAXLEN]; -float angle_new_right[PT_MAXLEN]; -int angle_new_left_num, angle_new_right_num; -uint8_t mt9v03x_image_copy[MT9V03X_H][MT9V03X_W]; - -float angle_left[PT_MAXLEN]; -float angle_right[PT_MAXLEN]; -int angle_left_num, angle_right_num; - -int Lpt0_rpts0s_id, Lpt1_rpts1s_id; -bool Lpt0_found, Lpt1_found; -int Lpt1[2], Lpt0[2]; - -int Lpt_in0_rpts0s_id, Lpt_in1_rpts1s_id; -bool Lpt_in0_found, Lpt_in1_found; -int Lpt_in1[2], Lpt_in0[2]; - -bool is_straight0, is_straight1; - -bool is_turn0, is_turn1; - -float rptsn[PT_MAXLEN][2]; -int rptsn_num; -float aim_distance; - -enum track_type_e track_type = TRACK_RIGHT; - -int frame_count = 0; - -void img_processing(); -void get_corners(); -void adaptiveThreshold(uint8_t* img_data, uint8_t* output_data, int width, int height, int block, uint8_t clip_value); - - - int main(void) { - clock_init(SYSTEM_CLOCK_120M); // 初始化芯片时钟 工作频率为 120MHz - debug_init(); // 务必保留,本函数用于初始化 MPU 时钟 调试串口 - //mt9v03x_init(); - // system_delay_ms(2000); - ips200_init(IPS200_TYPE_SPI); + clock_init(SYSTEM_CLOCK_120M); + system_delay_init(); + debug_init(); mt9v03x_init(); - // by_gpio_init(); - // by_exit_init(); - // by_pwm_init(); - // cw_servo_init(); - //printf("hello world\n"); + ips200_init(IPS200_TYPE_SPI); + by_gpio_init(); + by_exit_init(); + by_pwm_init(); // while (imu660ra_init()) // ; @@ -108,18 +45,11 @@ int main(void) // pit_ms_init(TIM6_PIT, 2); while (1) { - // while (frame_count < 20) { - // if (mt9v03x_finish_flag) { - // memcpy(mt9v03x_image_copy[0], mt9v03x_image[0], (sizeof(mt9v03x_image_copy) / sizeof(uint8_t))); - // adaptiveThreshold((uint8_t*)mt9v03x_image_copy, (uint8_t*)mt9v03x_image_copy, 188, 120, 7, 8); - // //threshold((uint8_t*)mt9v03x_image_copy, (uint8_t*)mt9v03x_image_copy, MT9V03X_W, MT9V03X_H, 110); - // ips200_show_gray_image(0, 0, mt9v03x_image_copy[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); - // mt9v03x_finish_flag = 0; - // frame_count++; - // } - //} + Page_Run(); + if (mt9v03x_finish_flag) { + // 该操作消耗大概 1970 个 tick,折合约 110us memcpy(mt9v03x_image_copy[0], mt9v03x_image[0], (sizeof(mt9v03x_image_copy) / sizeof(uint8_t))); adaptiveThreshold((uint8_t*)mt9v03x_image_copy, (uint8_t*)mt9v03x_image_copy, 188, 120, 7, 17); ips200_show_gray_image(0, 0, mt9v03x_image_copy[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); diff --git a/app/main.h b/app/main.h index 10353da..1741eaa 100644 --- a/app/main.h +++ b/app/main.h @@ -2,50 +2,5 @@ #define MAIN_H #include "zf_common_headfile.h" -#include "gl_common.h" - -// extern uint8 *mt9v03x_image_copy[0]; -extern int32_t pts_left[PT_MAXLEN][2], pts_right[PT_MAXLEN][2]; // 0:H,1:W -extern int32_t pts_left_count, pts_right_count; -extern float pts_inv_l[PT_MAXLEN][2], pts_inv_r[PT_MAXLEN][2]; -extern int32_t pts_inv_l_count, pts_inv_r_count; -extern float pts_filter_l[PT_MAXLEN][2], pts_filter_r[PT_MAXLEN][2]; -extern int32_t pts_filter_l_count, pts_filter_r_count; -extern float pts_resample_left[PT_MAXLEN][2], pts_resample_right[PT_MAXLEN][2]; -extern int32_t pts_resample_left_count, pts_resample_right_count; -extern uint8_t mt9v03x_image_copy[MT9V03X_H][MT9V03X_W]; -extern float mid_left[PT_MAXLEN][2], mid_right[PT_MAXLEN][2]; -extern int32_t mid_left_count, mid_right_count; - -extern float angle_left[PT_MAXLEN]; -extern float angle_right[PT_MAXLEN]; -extern int angle_left_num, angle_right_num; - -extern float angle_new_left[PT_MAXLEN]; -extern float angle_new_right[PT_MAXLEN]; -extern int angle_new_left_num, angle_new_right_num; - -extern int Lpt0_rpts0s_id, Lpt1_rpts1s_id; -extern bool Lpt0_found, Lpt1_found; -extern int Lpt1[2], Lpt0[2]; - -extern int Lpt_in0_rpts0s_id, Lpt_in1_rpts1s_id; -extern bool Lpt_in0_found, Lpt_in1_found; -extern int Lpt_in1[2], Lpt_in0[2]; - -extern bool is_straight0, is_straight1; - -extern bool is_turn0, is_turn1; - -extern float rptsn[PT_MAXLEN][2]; -extern int rptsn_num; -extern float aim_distance; - -enum track_type_e { - TRACK_LEFT, - TRACK_RIGHT, -}; - -extern enum track_type_e track_type; #endif // MAIN_H \ No newline at end of file diff --git a/app/page/cw_page.c b/app/page/cw_page.c index d948d63..8716b8e 100644 --- a/app/page/cw_page.c +++ b/app/page/cw_page.c @@ -1,9 +1,11 @@ #include "cw_page.h" +#include "by_rt_button.h" + PAGE_LIST pagelist[page_max]; static uint8_t page_busy = 0; -static int8_t now_page = page_menu; -static int8_t new_page = page_menu; +static int8_t now_page = page_menu; +static int8_t new_page = page_menu; /** * @brief 注册一个基本页面,包含一个初始化函数,循环函数,退出函数,事件函数 @@ -16,12 +18,13 @@ static int8_t new_page = page_menu; * @retval 无 */ void Page_Register(uint8_t pageID, char *pageText, - CallbackFunction_t setupCallback, CallbackFunction_t loopCallback, - CallbackFunction_t exitCallback, EventFunction_t eventCallback) { - pagelist[pageID].Text = pageText; + CallbackFunction_t setupCallback, CallbackFunction_t loopCallback, + CallbackFunction_t exitCallback, EventFunction_t eventCallback) +{ + pagelist[pageID].Text = pageText; pagelist[pageID].SetupCallback = setupCallback; - pagelist[pageID].LoopCallback = loopCallback; - pagelist[pageID].ExitCallback = exitCallback; + pagelist[pageID].LoopCallback = loopCallback; + pagelist[pageID].ExitCallback = exitCallback; pagelist[pageID].EventCallback = eventCallback; } @@ -30,7 +33,8 @@ void Page_Register(uint8_t pageID, char *pageText, * @param event: 事件编号 * @retval 无 */ -void Page_EventTransmit(unsigned char event) { +void Page_EventTransmit(unsigned char event) +{ /*将事件传递到当前页面*/ if (pagelist[now_page].EventCallback != 0) pagelist[now_page].EventCallback(event); @@ -41,7 +45,8 @@ void Page_EventTransmit(unsigned char event) { * @param pageID:页面号 * @retval 1:成功 0:失败 */ -void Page_Shift(unsigned char pageID) { +void Page_Shift(unsigned char pageID) +{ if (page_busy == 0) { new_page = pageID; } @@ -51,7 +56,8 @@ void Page_Shift(unsigned char pageID) { * @brief 关闭当前页面 * */ -void Page_CloseCurrentPage() { +void Page_CloseCurrentPage() +{ pagelist[now_page].ExitCallback(); } @@ -59,16 +65,18 @@ void Page_CloseCurrentPage() { * @brief 打开当前页面 * */ -void Page_OpenCurrentPage() { +void Page_OpenCurrentPage() +{ pagelist[now_page].SetupCallback(); } /** * @brief 获取页面状态 * - * @return uint8_t 页面忙返回1 空闲返回0 + * @return uint8_t 页面忙返回 1 空闲返回 0 */ -uint8_t Page_GetStatus(void) { +uint8_t Page_GetStatus(void) +{ if (page_busy) return 1; else @@ -79,18 +87,23 @@ uint8_t Page_GetStatus(void) { * @brief 页面运行函数 * */ -void Page_Run(void) { +void Page_Run(void) +{ + uint8_t temp_status = by_get_rb_status(); // 轮询旋钮状态 + if(temp_status){ + pagelist[now_page].EventCallback(temp_status); + } if (now_page != new_page) { if (new_page >= page_max && new_page < page_menu) { new_page = page_menu; } - //执行当前页面退出回调函数 + // 执行当前页面退出回调函数 if ((pagelist[now_page].ExitCallback != 0)) { pagelist[now_page].ExitCallback(); } - //执行新页面构造回调函数 + // 执行新页面构造回调函数 if (pagelist[new_page].SetupCallback != 0) { pagelist[new_page].SetupCallback(); } @@ -99,7 +112,7 @@ void Page_Run(void) { } if (page_busy == 0) { - //执行循环函数 + // 执行循环函数 pagelist[now_page].LoopCallback(); } } @@ -108,13 +121,15 @@ void Page_Run(void) { * @brief 页面初始化(注册,构建) //ATTENTION 在此处添加新加入的页面 * */ -void Page_Init(void) { +void Page_Init(void) +{ PAGE_REG(page_menu); + PAGE_REG(page_rtcam); // PAGE_REG(page_argv); // PAGE_REG(page_sys); // PAGE_REG(page_run); Page_Shift(page_menu); - pagelist[now_page].SetupCallback(); //先构建一遍 + pagelist[now_page].SetupCallback(); // 先构建一遍 } diff --git a/app/page/cw_page.h b/app/page/cw_page.h index cd4f20e..100b9bb 100644 --- a/app/page/cw_page.h +++ b/app/page/cw_page.h @@ -13,10 +13,13 @@ #include "zf_common_headfile.h" +#include "by_rt_button.h" + enum PageID { PAGE_NULL = -1, //...... page_menu, + page_rtcam, // page_argv, // page_sys, // page_run, @@ -25,9 +28,10 @@ enum PageID { }; typedef enum page_event{ - page_event_forward, - page_event_backward, - page_event_press + page_event_forward = rotate_button_forward, + page_event_backward = rotate_button_backward, + page_event_press_short = rotate_button_press_short, + page_event_press_long = rotate_button_press_long, } page_event; typedef void (*CallbackFunction_t)(void); diff --git a/app/page/cw_page_menu.c b/app/page/cw_page_menu.c index 4296ba6..60f00b2 100644 --- a/app/page/cw_page_menu.c +++ b/app/page/cw_page_menu.c @@ -7,8 +7,8 @@ static char Text[] = "Menu"; -static int8_t Curser = 1; // 定义光标位置 -static int8_t Curser_Last = 1; // 定义光标位置 +static int8_t Curser = LINE_HEAD; // 定义光标位置 +static int8_t Curser_Last = LINE_HEAD; // 定义光标位置 static void Print_Menu_p(void); /*************************************************************************************** * @@ -23,7 +23,7 @@ static void Print_Menu_p(void); */ static void Setup() { - ips114_clear(); + ips200_clear(); Print_Menu_p(); Print_Curser(Curser, Curser_Last); } @@ -44,7 +44,6 @@ static void Exit() */ static void Loop() { - Show_Marked_Image(); } /** @@ -61,7 +60,7 @@ static void Event(page_event event) Curser--; // 光标上移 } else if (page_event_backward == event) { Curser++; // 光标下移 - } else if (page_event_press == event) { + } else if (page_event_press_short == event) { if (page_max > Curser && page_menu < Curser) { Page_Shift(Curser); // 切换到光标选中的页面 } @@ -101,7 +100,7 @@ static void Print_Menu_p(void) // SCREEN_showstr_style(5 * 8, 0, RED, WHITE, "#### MAIN MENU ####"); ips200_show_string(0, 0, Text); for (uint8_t i = page_menu + 1; i < page_max; i++) { - ips200_show_string(8, i, pagelist[i].Text); + ips200_show_string(10, i * 18, pagelist[i].Text); // SCREEN_showstr(8, i, pagelist[i].Text); } } diff --git a/app/page/cw_page_rtcam.c b/app/page/cw_page_rtcam.c index 969963d..3b6c7b4 100644 --- a/app/page/cw_page_rtcam.c +++ b/app/page/cw_page_rtcam.c @@ -2,14 +2,13 @@ #include "cw_page_ui_widget.h" #include "cw_page.h" -#define LINE_HEAD 1 -#define LINE_END 7 +#define LINE_HEAD 11 +#define LINE_END 16 static char Text[] = "RealTime Image"; -static int8_t Curser = 1; // 定义光标位置 -static int8_t Curser_Last = 1; // 定义光标位置 -static void Print_Menu_p(void); +static int8_t Curser = LINE_HEAD; // 定义光标位置 +static int8_t Curser_Last = LINE_HEAD; // 定义光标位置 /*************************************************************************************** * * 以下为页面模板函数 @@ -23,8 +22,7 @@ static void Print_Menu_p(void); */ static void Setup() { - ips114_clear(); - Print_Menu_p(); + ips200_clear(); Print_Curser(Curser, Curser_Last); } @@ -44,6 +42,7 @@ static void Exit() */ static void Loop() { + Show_Marked_Image(); } /** @@ -60,10 +59,10 @@ static void Event(page_event event) Curser--; // 光标上移 } else if (page_event_backward == event) { Curser++; // 光标下移 - } else if (page_event_press == event) { - if (page_max > Curser && page_menu < Curser) { - Page_Shift(Curser); // 切换到光标选中的页面 - } + } else if (page_event_press_short == event) { + + } else if (page_event_press_long == event) { + Page_Shift(page_menu); } if (Curser < LINE_HEAD) { @@ -90,17 +89,3 @@ void PageRegister_page_rtcam(unsigned char pageID) * 以下为页面自定义功能函数 * ***************************************************************************************/ - -/** - * @brief 打印菜单项 - * - */ -static void Print_Menu_p(void) -{ - // SCREEN_showstr_style(5 * 8, 0, RED, WHITE, "#### MAIN MENU ####"); - ips200_show_string(0, 0, Text); - for (uint8_t i = page_menu + 1; i < page_max; i++) { - ips200_show_string(8, i, pagelist[i].Text); - // SCREEN_showstr(8, i, pagelist[i].Text); - } -} diff --git a/app/page/cw_page_ui_widget.c b/app/page/cw_page_ui_widget.c index d5222f8..594bf99 100644 --- a/app/page/cw_page_ui_widget.c +++ b/app/page/cw_page_ui_widget.c @@ -1,6 +1,6 @@ #include "cw_page_ui_widget.h" #include "zf_common_headfile.h" -#include "main.h" +#include "gl_data.h" /** * @brief 绘制光标 @@ -10,8 +10,17 @@ */ void Print_Curser(uint8_t Curser_In, uint8_t Curser_Last_In) { - ips200_show_string(0, Curser_Last_In * 16, " "); - ips200_show_string(0, Curser_In * 16, ">"); + // ips200_show_string(0, Curser_Last_In * 18, " "); + // ips200_show_string(0, Curser_In * 18, ">"); + + for (uint8_t i = 0; i < 160; i++) { + ips200_draw_point(10 + i, Curser_Last_In * 18 + 19, IPS200_DEFAULT_BGCOLOR); + // system_delay_us(200); + } + for (uint8_t i = 0; i < 160; i++) { + ips200_draw_point(10 + i, Curser_In * 18 + 19, RGB565_WHITE); + system_delay_ms(1); + } } /** @@ -20,9 +29,8 @@ void Print_Curser(uint8_t Curser_In, uint8_t Curser_Last_In) */ void Print_Menu(const ITEM *item, uint8_t item_sum) { - ips200_show_string(0, 0, " --return--"); for (uint8_t i = 0; i < item_sum; i++) { - ips200_show_string(8, i * 16 + 16, item[i].text); + ips200_show_string(8, i * 18 + 16, item[i].text); } } @@ -141,8 +149,10 @@ void Show_Marked_Image(void) // 确认边线数组在显示前不会清空 for (uint i = 0; i < PT_MAXLEN; i++) { - ips200_draw_point(START_X + (uint16_t)(mid_right[i][0] * horizontal_zoom_rate), START_Y + (uint16_t)(mid_right[i][1] * vertical_zoom_rate), RGB565_GREEN); - ips200_draw_point(START_X + (uint16_t)(mid_left[i][0] * horizontal_zoom_rate), START_Y + (uint16_t)(mid_left[i][1] * vertical_zoom_rate), RGB565_GREEN); + ips200_draw_point(START_X + (uint16_t)((float)pts_right[i][1] * horizontal_zoom_rate), START_Y + (uint16_t)((float)pts_right[i][0] * vertical_zoom_rate), RGB565_GREEN); + ips200_draw_point(START_X + (uint16_t)((float)pts_right[i][1] * horizontal_zoom_rate) - 1, START_Y + (uint16_t)((float)pts_right[i][0] * vertical_zoom_rate), RGB565_GREEN); + ips200_draw_point(START_X + (uint16_t)((float)pts_left[i][1] * horizontal_zoom_rate), START_Y + (uint16_t)((float)pts_left[i][0] * vertical_zoom_rate), RGB565_YELLOW); + ips200_draw_point(START_X + (uint16_t)((float)pts_left[i][1] * horizontal_zoom_rate) + 1, START_Y + (uint16_t)((float)pts_left[i][0] * vertical_zoom_rate), RGB565_YELLOW); } #undef IMAGE_DISPLAY_WIDTH #undef START_X diff --git a/libraries/zf_common/zf_common_font.c b/libraries/zf_common/zf_common_font.c index 094730a..e4e6515 100644 --- a/libraries/zf_common/zf_common_font.c +++ b/libraries/zf_common/zf_common_font.c @@ -2,11 +2,11 @@ * CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ * Copyright (c) 2022 SEEKFREE ɿƼ * -* ļCH32V307VCT6 Դһ +* ļ CH32V307VCT6 Դһ * * CH32V307VCT6 Դ -* Ըᷢ GPLGNU General Public License GNUͨù֤ -* GPL ĵ3棨 GPL3.0ѡģκκİ汾·/޸ +* Ըᷢ GPLGNU General Public License GNU ͨù֤ +* GPL ĵ 3 棨 GPL3.0ѡģκκİ汾·/޸ * * Դķϣܷãδκεı֤ * ûԻʺض;ı֤ @@ -30,7 +30,7 @@ * * ޸ļ¼ * ע -* 2022-09-15 W first version +* 2022-09-15 W first version ********************************************************************************************************************/ #include "zf_common_font.h" @@ -93,7 +93,8 @@ const uint8 ascii_font_8x16[][16]= {0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00}, // ; 27 {0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00}, // < 28 {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00}, // = 29 - {0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00}, // > 30 +// {0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00}, // > 30 + {0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00}, // > 30 {0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00}, // ? 31 {0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00}, // @ 32 {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20}, // A 33 @@ -274,7 +275,7 @@ const uint8 ascii_font_6x8[][6] = }; //------------------------------------------------------------------------------------------------------------------- -// ʹPCtoLCD2002ȡģ +// ʹ PCtoLCD2002 ȡģ // 롢ʽ˳ 16*16 //------------------------------------------------------------------------------------------------------------------- const uint8 chinese_test[8][16] = @@ -290,7 +291,7 @@ const uint8 chinese_test[8][16] = }; //------------------------------------------------------------------------------------------------------------------- -// ʹPCtoLCD2002ȡģ +// ʹ PCtoLCD2002 ȡģ // 롢ʽ 16*16 //------------------------------------------------------------------------------------------------------------------- const uint8 oled_16x16_chinese[][16]= @@ -305,10 +306,10 @@ const uint8 oled_16x16_chinese[][16]= {0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"",3*/ }; -//16λBMP 240*80 ɿƼlogoͼȡģ -//Image2LCDȡģѡ +//16 λ BMP 240*80 ɿƼ logo ͼȡģ +//Image2LCD ȡģѡ //ˮƽɨ -//16λ +//16 λ //240*80 //ͼͷ // diff --git a/libraries/zf_device/zf_device_ips200.c b/libraries/zf_device/zf_device_ips200.c index 3fd0c1a..fdd330b 100644 --- a/libraries/zf_device/zf_device_ips200.c +++ b/libraries/zf_device/zf_device_ips200.c @@ -316,10 +316,10 @@ static void ips200_set_region(uint16 x1, uint16 y1, uint16 x2, uint16 y2) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x1 < ips200_x_max); - zf_assert(y1 < ips200_y_max); - zf_assert(x2 < ips200_x_max); - zf_assert(y2 < ips200_y_max); + // zf_assert(x1 < ips200_x_max); + // zf_assert(y1 < ips200_y_max); + // zf_assert(x2 < ips200_x_max); + // zf_assert(y2 < ips200_y_max); ips200_write_command(0x2a); ips200_write_16bit_data(x1); @@ -484,8 +484,8 @@ void ips200_draw_point(uint16 x, uint16 y, const uint16 color) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); if (IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -512,10 +512,10 @@ void ips200_draw_line(uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x_start < ips200_x_max); - zf_assert(y_start < ips200_y_max); - zf_assert(x_end < ips200_x_max); - zf_assert(y_end < ips200_y_max); + // zf_assert(x_start < ips200_x_max); + // zf_assert(y_start < ips200_y_max); + // zf_assert(x_end < ips200_x_max); + // zf_assert(y_end < ips200_y_max); int16 x_dir = (x_start < x_end ? 1 : -1); int16 y_dir = (y_start < y_end ? 1 : -1); @@ -565,61 +565,39 @@ void ips200_show_char(uint16 x, uint16 y, const char dat) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); uint8 i = 0, j = 0; if (IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - switch (ips200_display_font) { - case IPS200_6X8_FONT: { - uint16 display_buffer[6 * 8]; - ips200_set_region(x, y, x + 5, y + 7); - for (i = 0; 6 > i; i++) { - // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 - uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for (j = 0; 8 > j; j++) { - if (temp_top & 0x01) { - display_buffer[i + j * 6] = (ips200_pencolor); - } else { - display_buffer[i + j * 6] = (ips200_bgcolor); - } - temp_top >>= 1; - } + uint16 display_buffer[8 * 16]; + ips200_set_region(x, y, x + 7, y + 15); + for (i = 0; 8 > i; i++) { + uint8 temp_top = ascii_font_8x16[dat - 32][i]; + uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; + for (j = 0; 8 > j; j++) { + if (temp_top & 0x01) { + display_buffer[i + j * 8] = (ips200_pencolor); + } else { + display_buffer[i + j * 8] = (ips200_bgcolor); } - ips200_write_16bit_data_array(display_buffer, 6 * 8); - } break; - case IPS200_8X16_FONT: { - uint16 display_buffer[8 * 16]; - ips200_set_region(x, y, x + 7, y + 15); - for (i = 0; 8 > i; i++) { - uint8 temp_top = ascii_font_8x16[dat - 32][i]; - uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for (j = 0; 8 > j; j++) { - if (temp_top & 0x01) { - display_buffer[i + j * 8] = (ips200_pencolor); - } else { - display_buffer[i + j * 8] = (ips200_bgcolor); - } - temp_top >>= 1; - } - for (j = 0; 8 > j; j++) { - if (temp_bottom & 0x01) { - display_buffer[i + j * 8 + 4 * 16] = (ips200_pencolor); - } else { - display_buffer[i + j * 8 + 4 * 16] = (ips200_bgcolor); - } - temp_bottom >>= 1; - } + temp_top >>= 1; + } + for (j = 0; 8 > j; j++) { + if (temp_bottom & 0x01) { + display_buffer[i + j * 8 + 4 * 16] = (ips200_pencolor); + } else { + display_buffer[i + j * 8 + 4 * 16] = (ips200_bgcolor); } - ips200_write_16bit_data_array(display_buffer, 8 * 16); - } break; - case IPS200_16X16_FONT: { - // 暂不支持 - } break; + temp_bottom >>= 1; + } + + ips200_write_16bit_data_array(display_buffer, 8 * 16); } + if (IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(1); } @@ -638,8 +616,8 @@ void ips200_show_string(uint16 x, uint16 y, const char dat[]) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); uint16 j = 0; while ('\0' != dat[j]) { @@ -671,10 +649,10 @@ void ips200_show_int(uint16 x, uint16 y, const int32 dat, uint8 num) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(0 < num); - zf_assert(10 >= num); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(0 < num); + // zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -708,10 +686,10 @@ void ips200_show_uint(uint16 x, uint16 y, const uint32 dat, uint8 num) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(0 < num); - zf_assert(10 >= num); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(0 < num); + // zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -748,12 +726,12 @@ void ips200_show_float(uint16 x, uint16 y, const double dat, uint8 num, uint8 po { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(0 < num); - zf_assert(8 >= num); - zf_assert(0 < pointnum); - zf_assert(6 >= pointnum); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(0 < num); + // zf_assert(8 >= num); + // zf_assert(0 < pointnum); + // zf_assert(6 >= pointnum); double dat_temp = dat; double offset = 1.0; @@ -790,9 +768,9 @@ void ips200_show_binary_image(uint16 x, uint16 y, const uint8 *image, uint16 wid { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(NULL != image); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -844,9 +822,9 @@ void ips200_show_gray_image(uint16 x, uint16 y, const uint8 *image, uint16 width { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(NULL != image); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0, temp = 0; @@ -901,9 +879,9 @@ void ips200_show_rgb565_image(uint16 x, uint16 y, const uint16 *image, uint16 wi { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(NULL != image); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 data_buffer[dis_width]; @@ -947,9 +925,9 @@ void ips200_show_wave(uint16 x, uint16 y, const uint16 *wave, uint16 width, uint { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(NULL != wave); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -992,9 +970,9 @@ void ips200_show_chinese(uint16 x, uint16 y, uint8 size, const uint8 *chinese_bu { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 - zf_assert(x < ips200_x_max); - zf_assert(y < ips200_y_max); - zf_assert(NULL != chinese_buffer); + // zf_assert(x < ips200_x_max); + // zf_assert(y < ips200_y_max); + // zf_assert(NULL != chinese_buffer); int i = 0, j = 0, k = 0; uint8 temp = 0, temp1 = 0, temp2 = 0; diff --git a/libraries/zf_device/zf_device_ips200.h b/libraries/zf_device/zf_device_ips200.h index 8e73b41..96239ba 100644 --- a/libraries/zf_device/zf_device_ips200.h +++ b/libraries/zf_device/zf_device_ips200.h @@ -115,8 +115,8 @@ // --------------------双排 SPI 接口两寸屏幕引脚定义--------------------// #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 -#define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 -#define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 +#define IPS200_DEFAULT_PENCOLOR (RGB565_YELLOW ) // 默认的画笔颜色 +#define IPS200_DEFAULT_BGCOLOR (RGB565_BLACK ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 // 控制语句 diff --git a/libraries/zf_driver/zf_driver_delay.c b/libraries/zf_driver/zf_driver_delay.c index 6cb3568..24f0f3e 100644 --- a/libraries/zf_driver/zf_driver_delay.c +++ b/libraries/zf_driver/zf_driver_delay.c @@ -1,37 +1,37 @@ /********************************************************************************************************************* -* CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ -* Copyright (c) 2022 SEEKFREE ɿƼ -* -* ļCH32V307VCT6 Դһ -* -* CH32V307VCT6 Դ -* Ըᷢ GPLGNU General Public License GNUͨù֤ -* GPL ĵ3棨 GPL3.0ѡģκκİ汾·/޸ -* -* Դķϣܷãδκεı֤ -* ûԻʺض;ı֤ -* ϸμ GPL -* -* ӦյԴͬʱյһ GPL ĸ -* ûУ -* -* ע -* Դʹ GPL3.0 Դ֤Э Ϊİ汾 -* Ӣİ libraries/doc ļµ GPL3_permission_statement.txt ļ -* ֤ libraries ļ ļµ LICENSE ļ -* ӭλʹò ޸ʱ뱣ɿƼİȨ -* -* ļ zf_driver_delay -* ˾ ɶɿƼ޹˾ -* 汾Ϣ 鿴 libraries/doc ļ version ļ 汾˵ -* MounRiver Studio V1.8.1 -* ƽ̨ CH32V307VCT6 -* https://seekfree.taobao.com/ -* -* ޸ļ¼ -* ע -* 2022-09-15 W first version -********************************************************************************************************************/ + * CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ + * Copyright (c) 2022 SEEKFREE ɿƼ + * + * ļ CH32V307VCT6 Դһ + * + * CH32V307VCT6 Դ + * Ըᷢ GPLGNU General Public License GNU ͨù֤ + * GPL ĵ 3 棨 GPL3.0ѡģκκİ汾·/޸ + * + * Դķϣܷãδκεı֤ + * ûԻʺض;ı֤ + * ϸμ GPL + * + * ӦյԴͬʱյһ GPL ĸ + * ûУ + * + * ע + * Դʹ GPL3.0 Դ֤Э Ϊİ汾 + * Ӣİ libraries/doc ļµ GPL3_permission_statement.txt ļ + * ֤ libraries ļ ļµ LICENSE ļ + * ӭλʹò ޸ʱ뱣ɿƼİȨ + * + * ļ zf_driver_delay + * ˾ ɶɿƼ޹˾ + * 汾Ϣ 鿴 libraries/doc ļ version ļ 汾˵ + * MounRiver Studio V1.8.1 + * ƽ̨ CH32V307VCT6 + * https://seekfree.taobao.com/ + * + * ޸ļ¼ + * ע + * 2022-09-15 W first version + ********************************************************************************************************************/ #include "ch32v30x.h" @@ -46,21 +46,23 @@ // ʹʾ system_delay_ms(100); // עϢ //------------------------------------------------------------------------------------------------------------------- -void system_delay_ms (uint32 num) +void system_delay_ms(uint32 num) { - SysTick->SR &= ~(1 << 0); + // SysTick->SR &= ~(1 << 0); + // SysTick->CMP = (uint64_t)(system_clock / 8000) * num; + // SysTick->CTLR |= (1 << 4); + // SysTick->CTLR |= (1 << 5) | (1 << 0); - SysTick->CMP = (uint64_t)(system_clock/8000) * num; - SysTick->CTLR |= (1 << 4); - SysTick->CTLR |= (1 << 5) | (1 << 0); + // while ((SysTick->SR & (1 << 0)) != (1 << 0)) + // ; - while((SysTick->SR & (1 << 0)) != (1 << 0)); - - SysTick->CTLR &= ~(1 << 0); + // SysTick->CTLR &= ~(1 << 0); + while (num--) { + system_delay_us(1000); + } } - //------------------------------------------------------------------------------------------------------------------- // system ʱ us // ˵ time Ҫʱʱ us @@ -68,18 +70,32 @@ void system_delay_ms (uint32 num) // ʹʾ system_delay_us(100); // עϢ ڳת ʱֵ߳һЩ //------------------------------------------------------------------------------------------------------------------- -void system_delay_us (uint32 num) +void system_delay_us(uint32 num) { - SysTick->SR &= ~(1 << 0); + // SysTick->SR &= ~(1 << 0); + // SysTick->CMP = (uint64_t)(system_clock/8000000) * num; + // SysTick->CTLR |= (1 << 4); + // SysTick->CTLR |= (1 << 5) | (1 << 0); - SysTick->CMP = (uint64_t)(system_clock/8000000) * num; - SysTick->CTLR |= (1 << 4); - SysTick->CTLR |= (1 << 5) | (1 << 0); + // while((SysTick->SR & (1 << 0)) != (1 << 0)); - while((SysTick->SR & (1 << 0)) != (1 << 0)); + // SysTick->CTLR &= ~(1 << 0); - SysTick->CTLR &= ~(1 << 0); + uint64_t time_start = SysTick->CNT; + uint64_t time_delta = (uint64_t)num * (uint64_t)(system_clock / 8000000); + + while (time_delta > (SysTick->CNT - time_start)) { + } } +uint64_t system_get_tick(void) +{ + uint64_t time_temp = SysTick->CNT; + return (time_temp); +} +void system_delay_init(void) +{ + SysTick->CTLR |= 0x21; +} \ No newline at end of file diff --git a/libraries/zf_driver/zf_driver_delay.h b/libraries/zf_driver/zf_driver_delay.h index aee667f..57befa7 100644 --- a/libraries/zf_driver/zf_driver_delay.h +++ b/libraries/zf_driver/zf_driver_delay.h @@ -1,37 +1,37 @@ /********************************************************************************************************************* -* CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ -* Copyright (c) 2022 SEEKFREE ɿƼ -* -* ļCH32V307VCT6 Դһ -* -* CH32V307VCT6 Դ -* Ըᷢ GPLGNU General Public License GNUͨù֤ -* GPL ĵ3棨 GPL3.0ѡģκκİ汾·/޸ -* -* Դķϣܷãδκεı֤ -* ûԻʺض;ı֤ -* ϸμ GPL -* -* ӦյԴͬʱյһ GPL ĸ -* ûУ -* -* ע -* Դʹ GPL3.0 Դ֤Э Ϊİ汾 -* Ӣİ libraries/doc ļµ GPL3_permission_statement.txt ļ -* ֤ libraries ļ ļµ LICENSE ļ -* ӭλʹò ޸ʱ뱣ɿƼİȨ -* -* ļ zf_driver_delay -* ˾ ɶɿƼ޹˾ -* 汾Ϣ 鿴 libraries/doc ļ version ļ 汾˵ -* MounRiver Studio V1.8.1 -* ƽ̨ CH32V307VCT6 -* https://seekfree.taobao.com/ -* -* ޸ļ¼ -* ע -* 2022-09-15 W first version -********************************************************************************************************************/ + * CH32V307VCT6 Opensourec Library CH32V307VCT6 Դ⣩һڹٷ SDK ӿڵĵԴ + * Copyright (c) 2022 SEEKFREE ɿƼ + * + * ļCH32V307VCT6 Դһ + * + * CH32V307VCT6 Դ + * Ըᷢ GPLGNU General Public License GNUͨù֤ + * GPL ĵ3棨 GPL3.0ѡģκκİ汾·/޸ + * + * Դķϣܷãδκεı֤ + * ûԻʺض;ı֤ + * ϸμ GPL + * + * ӦյԴͬʱյһ GPL ĸ + * ûУ + * + * ע + * Դʹ GPL3.0 Դ֤Э Ϊİ汾 + * Ӣİ libraries/doc ļµ GPL3_permission_statement.txt ļ + * ֤ libraries ļ ļµ LICENSE ļ + * ӭλʹò ޸ʱ뱣ɿƼİȨ + * + * ļ zf_driver_delay + * ˾ ɶɿƼ޹˾ + * 汾Ϣ 鿴 libraries/doc ļ version ļ 汾˵ + * MounRiver Studio V1.8.1 + * ƽ̨ CH32V307VCT6 + * https://seekfree.taobao.com/ + * + * ޸ļ¼ + * ע + * 2022-09-15 W first version + ********************************************************************************************************************/ #ifndef _zf_driver_delay_h #define _zf_driver_delay_h @@ -39,7 +39,9 @@ #include "zf_common_clock.h" #include "zf_common_typedef.h" -void system_delay_ms (uint32 time); -void system_delay_us (uint32 time); +void system_delay_ms(uint32 time); +void system_delay_us(uint32 time); +uint64_t system_get_tick(void); +void system_delay_init(void); #endif