diff --git a/Makefile b/Makefile index bcb24990..b1534bc4 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,10 @@ EXTRA_CXXFLAGS= USE_PACKAGE:=0 # Set this to 1 to add additional rules to compile your project as a PROS library template -IS_LIBRARY:=0 +IS_LIBRARY:=1 # TODO: CHANGE THIS! -LIBNAME:=libbest -VERSION:=1.0.0 +LIBNAME:=ncrapi +VERSION:=9.0.2 # EXCLUDE_SRC_FROM_LIB= $(SRCDIR)/unpublishedfile.c # this line excludes opcontrol.c and similar files EXCLUDE_SRC_FROM_LIB+=$(foreach file, $(SRCDIR)/opcontrol $(SRCDIR)/initialize $(SRCDIR)/autonomous,$(foreach cext,$(CEXTS),$(file).$(cext)) $(foreach cxxext,$(CXXEXTS),$(file).$(cxxext))) diff --git a/firmware/ncrapi.a b/firmware/ncrapi.a new file mode 100644 index 00000000..0f9039fa Binary files /dev/null and b/firmware/ncrapi.a differ diff --git a/ncrapi@9.0.2.zip b/ncrapi@9.0.2.zip new file mode 100644 index 00000000..18ee01b5 Binary files /dev/null and b/ncrapi@9.0.2.zip differ diff --git a/project.pros b/project.pros index 50e0b36e..0b1c8fa9 100644 --- a/project.pros +++ b/project.pros @@ -124,6 +124,110 @@ ], "version": "3.1.6" }, + "ncrapi": { + "location": "C:\\Users\\aresp\\AppData\\Roaming\\PROS\\templates\\ncrapi@9.0.2", + "metadata": { + "origin": "local" + }, + "name": "ncrapi", + "py/object": "pros.conductor.templates.local_template.LocalTemplate", + "supported_kernels": "^3.1.6", + "system_files": [ + "include\\display\\lv_objx\\lv_ddlist.h", + "include\\display\\lv_objx\\lv_list.h", + "include\\display\\lv_draw\\lv_draw_rbasic.h", + "include\\pros\\adi.hpp", + "include\\display\\lv_misc\\lv_color.h", + "include\\display\\lv_objx\\lv_roller.h", + "include\\ncrapi\\system\\logger.hpp", + "include\\display\\lv_hal\\lv_hal_disp.h", + "include\\pros\\misc.hpp", + "include\\display\\lv_objx\\lv_slider.h", + "include\\ncrapi\\chassis\\chassis.hpp", + "include\\display\\lv_misc\\lv_area.h", + "include\\display\\lv_objx\\lv_btn.h", + "include\\display\\lv_objx\\lv_img.h", + "include\\ncrapi\\userDisplay\\userDisplay.hpp", + "include\\display\\lv_misc\\lv_math.h", + "include\\nancy.hpp", + "include\\pros\\motors.hpp", + "include\\display\\lv_misc\\lv_fs.h", + "include\\display\\lv_hal\\lv_hal.h", + "include\\display\\lv_misc\\lv_fonts\\lv_symbol_def.h", + "include\\ncrapi\\device\\adi.hpp", + "include\\pros\\vision.hpp", + "include\\pros\\misc.h", + "include\\ncrapi\\ncrapi.hpp", + "include\\display\\lv_misc\\lv_ll.h", + "include\\display\\lv_core\\lv_refr.h", + "include\\ncrapi\\system\\object.hpp", + "include\\display\\lv_draw\\lv_draw_vbasic.h", + "include\\display\\lv_misc\\lv_templ.h", + "include\\display\\lv_misc\\lv_txt.h", + "include\\pros\\motors.h", + "include\\display\\lv_misc\\lv_ufs.h", + "include\\display\\lv_objx\\lv_win.h", + "include\\display\\lv_objx\\lv_led.h", + "include\\display\\lv_objx\\lv_cont.h", + "include\\main.hpp", + "include\\pros\\adi.h", + "include\\ncrapi\\generic\\generic.hpp", + "include\\display\\lv_objx\\lv_bar.h", + "include\\ncrapi\\util\\util.hpp", + "include\\display\\lv_objx\\lv_chart.h", + "include\\display\\lv_objx\\lv_page.h", + "include\\display\\lv_misc\\lv_circ.h", + "include\\pros\\llemu.hpp", + "include\\display\\lv_misc\\lv_task.h", + "include\\display\\lv_themes\\lv_theme_alien.h", + "include\\display\\lv_core\\lv_group.h", + "include\\display\\lv_draw\\lv_draw.h", + "include\\display\\lv_core\\lv_obj.h", + "include\\display\\lv_objx\\lv_ta.h", + "include\\ncrapi\\device\\vision.hpp", + "include\\display\\lv_objx\\lv_label.h", + "include\\display\\lv_misc\\lv_font.h", + "include\\pros\\api_legacy.h", + "include\\ncrapi\\util\\timer.hpp", + "include\\display\\lv_objx\\lv_btnm.h", + "include\\pros\\llemu.h", + "include\\display\\lv_objx\\lv_kb.h", + "include\\ncrapi\\system\\sysBase.hpp", + "include\\display\\lv_misc\\lv_anim.h", + "include\\api.h", + "include\\display\\lv_misc\\lv_trigo.h", + "firmware\\ncrapi.a", + "include\\display\\lv_objx\\lv_tabview.h", + "include\\display\\lv_hal\\lv_hal_tick.h", + "include\\display\\lv_themes\\lv_theme_templ.h", + "include\\display\\lv_objx\\lv_gauge.h", + "include\\display\\lvgl.h", + "include\\display\\lv_hal\\lv_hal_indev.h", + "include\\pros\\rtos.hpp", + "include\\display\\lv_core\\lv_style.h", + "include\\pros\\vision.h", + "include\\display\\lv_objx\\lv_cb.h", + "include\\display\\lv_objx\\lv_sw.h", + "include\\display\\lv_themes\\lv_theme.h", + "include\\display\\lv_misc\\lv_mem.h", + "include\\ncrapi\\system\\json.hpp", + "include\\display\\lv_objx\\lv_lmeter.h", + "include\\pros\\rtos.h", + "include\\pros\\apix.h", + "include\\display\\lv_objx\\lv_line.h", + "include\\display\\lv_core\\lv_indev.h", + "include\\ncrapi\\system\\fifo_map.hpp", + "include\\pros\\colors.h", + "include\\display\\lv_conf.h", + "include\\display\\lv_core\\lv_vdb.h", + "include\\display\\lv_objx\\lv_objx_templ.h", + "include\\ncrapi\\device\\motor.hpp", + "include\\display\\lv_objx\\lv_mbox.h" + ], + "target": "v5", + "user_files": [], + "version": "9.0.2" + }, "okapilib": { "location": "C:\\Users\\35807\\AppData\\Roaming\\PROS\\templates\\okapilib@3.3.8", "metadata": { diff --git a/src/ncrapi/chassis/chassis.cpp b/src/ncrapi/chassis/chassis.cpp deleted file mode 100644 index 9f909d51..00000000 --- a/src/ncrapi/chassis/chassis.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include "ncrapi/chassis/chassis.hpp" -#include "ncrapi/system/logger.hpp" -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" -#include -#include - -namespace ncrapi -{ - -Chassis::Chassis(const json &pragma) : _name("底盘") -{ - for (auto &[key, value] : pragma["马达"].items()) - _motorList.push_back({key, value}); - - _joyThreshold = clamp(pragma["参数"]["遥控器矫正"].get(), 0, 20, "遥控器矫正"); - _maxRotateSpd = clamp(pragma["参数"]["最大旋转速度"].get(), 60, 127, "最大旋转速度"); - pros::delay(100); - _sideNums = _motorList.size() / 2; - if (_motorList.size() % 2 != 0 || _sideNums == 0) - logger->error({"底盘类马达数量输入错误!半边马达数量: ", std::to_string(_sideNums)}); - _gearing = _motorList.begin()->getGearSpeed(); - sysData->addObj(this); - resetEnc(); - logger->info({"底盘基类构造成功"}); -} -void Chassis::set(const int left, const int right) -{ - _pwm[0] = left; - _pwm[1] = right; - for (size_t i = 0; i < _sideNums; i++) - { - _motorList[i].move(_pwm[0]); - _motorList[i + _sideNums].move(_pwm[1]); - } - if ((getTemperature(0) >= 50 || getTemperature(1) >= 50) && _timerTemp.getDtFromMark() >= 15000) - { - logger->error({"底盘马达过热!"}); - _timerTemp.placeMark(); - } -} -/** - 设定电机的速度。 - * - * - *当达到错误状态时,此函数使用以下errno值: - *EACCES -另一个资源目前正在尝试访问该端口。 - * - *\ param left right 新电机速度为 - + - 100,+ -200或+ -600,具体取决于电机的齿轮组 - * - *\如果操作成功则返回1或如果操作则返回PROS_ERR - *失败,设置错误。 - */ -void Chassis::moveVelocity(const std::int32_t left, const std::int32_t right) -{ - for (size_t i = 0; i < _sideNums; i++) - { - _motorList[i].move_velocity(left); - _motorList[i + _sideNums].move_velocity(right); - } -} -/** - *以电压方式控制电机正转反转 - * @param voltage 电压 -120 +120 - */ -void Chassis::moveVoltage(const double left, const double right) -{ - for (size_t i = 0; i < _sideNums; i++) - { - _motorList[i].move_voltage(static_cast(left * 100)); - _motorList[i + _sideNums].move_voltage(static_cast(right * 100)); - } -} -void Chassis::moveRelative(const double leftPos, const double rightPos, const std::int32_t velocity) -{ - for (size_t i = 0; i < _sideNums; i++) - { - _motorList[i].move_relative(leftPos, velocity); - _motorList[i + _sideNums].move_relative(rightPos, velocity); - } -} -/** - * 普通前进后退 开环控制 - * @param pwm 前进+ 后退- 范围:+-127 - */ -void Chassis::forward(const int pwm, const int speedMode[128]) -{ - int sign = copySign(pwm); - set(speedMode[abs(pwm)] * sign, speedMode[abs(pwm)] * sign); -} -/** - * 使用速度环控制底盘前进后退 - * @param velocity 设定的速度 上限红齿轮+-100 绿齿轮+-200 蓝齿轮+-600 - */ -void Chassis::forwardVelocity(const int32_t velocity) -{ - moveVelocity(velocity, velocity); -} -/** - * 使用电压环进行前后控制 - * @param velocity -120 +120 - */ -void Chassis::forwardVoltage(const double voltage) -{ - moveVoltage(voltage, voltage); -} -void Chassis::forwardRelative(const double pos, const std::int32_t velocity) -{ - moveRelative(pos, pos, velocity); -} -/** - * 普通旋转 开环控制 - * @param pwm 左转+ 右转- 范围:+-127 - */ -void Chassis::rotate(const int pwm, const int speedMode[128]) -{ - int sign = copySign(pwm); - set(-speedMode[abs(pwm)] * sign, speedMode[abs(pwm)] * sign); -} -/** - * 使用速度环控制底盘左转右转 左转为+ 右转为- - * @param velocity 设定的速度 上限红齿轮+-100 绿齿轮+-200 蓝齿轮+-600 - */ -void Chassis::rotateVelocity(const int32_t velocity) -{ - moveVelocity(-velocity, velocity); -} -void Chassis::rotateReative(const double pos, const std::int32_t velocity) -{ - moveRelative(pos, -pos, velocity); -} -/** - * 使用电压环进行左右控制 - * @param velocity 左+120 右-120 - */ -void Chassis::rotateVoltage(const double voltage) -{ - moveVoltage(-voltage, voltage); -} -/** - * 底盘马达停转 - */ -void Chassis::stop() -{ - set(0, 0); -} -/** - * 矢量控制 开弧线 - * @param distPwm 前进的力度 前进+ 后退- - * @param anglePwm 弧线的力度 左开+ 右开- - * 例: chassis.driveVector(127, 80); - */ -void Chassis::driveVector(const int distPwm, const int anglePwm, const int speedMode[128]) //开弧线 -{ - int left = clamp(distPwm + anglePwm, -127, 127); - int right = clamp(distPwm - anglePwm, -127, 127); - set(speedMode[abs(left)] * copySign(left), speedMode[abs(right)] * copySign(right)); -} - -/** - * 遥控模块 单摇杆双摇杆都用这个 - * @param verticalVal 前后通道 - * @param horizontalVal 左右通道 - * @param threshold 遥控器矫正阀值 - */ -void Chassis::arcade(std::shared_ptr joy, pros::controller_analog_e_t verticalVal, pros::controller_analog_e_t horizontalVal, const int speedMode[128]) -{ - - int x = joy->get_analog(verticalVal); - int y = joy->get_analog(horizontalVal); - if (abs(x) < _joyThreshold) - x = 0; - if (abs(y) < _joyThreshold) - y = 0; - y = clamp(y, -_maxRotateSpd, _maxRotateSpd); - driveVector(x, y, speedMode); -} -void Chassis::tank(std::shared_ptr joy, pros::controller_analog_e_t left, pros::controller_analog_e_t right, const int threshold) -{ - int32_t l = joy->get_analog(left); - int32_t r = joy->get_analog(right); - if (abs(l) < threshold) - l = 0; - if (abs(r) < threshold) - r = 0; - set(l, r); -} - -/** - * 重置底盘所有马达编码器 - */ -void Chassis::resetEnc() -{ - for (auto &it : _motorList) - it.tare_position(); -} - -/** - * 重置底盘相关传感器 - */ -void Chassis::resetAllSensors() -{ - resetEnc(); -} -/** - * @获取左边或者右边编码器值 - * @param side 0左边 1右边 - * @return double 返回左边或者右边编码器值 - */ -double Chassis::getEnc(const bool side) -{ - size_t i = 0; - if (side == 1) - i = _sideNums; - return _motorList[i].get_position(); -} -/** - * 获取电机当前速度 - * @param side 0左边 1右边 - * @return double 返回左边或者右边编码器值 - */ -double Chassis::getSpeed(const bool side) -{ - size_t i = 0; - if (side == 1) - i = _sideNums; - return _motorList[i].get_actual_velocity(); -} - -/** - * 获取左边或者右边的温度 - * @param side 左边0 右边1 - * @return const double 返回左边或者右边的温度 - */ -const double Chassis::getTemperature(const bool side) const -{ - size_t flag = 0; - if (side == 1) - flag = _sideNums; - double sum = 0; - for (size_t i = 0; i < _sideNums; i++) - sum += _motorList[i + flag].get_temperature(); - return sum / _sideNums; -} -/** - * 获取左边或者右边的电压 - * @param side 左边0 右边1 - * @return int32_t 返回左边或者右边的电压 - */ -const int32_t Chassis::getVoltage(const bool side) const -{ - size_t flag = 0; - if (side == 1) - flag = _sideNums; - double sum = 0; - for (size_t i = 0; i < _sideNums; i++) - sum += _motorList[i + flag].get_voltage(); - return sum / static_cast(_sideNums); //注意这里有坑 -} -const int32_t Chassis::getCurrent(const bool side) const -{ - size_t flag = 0; - if (side == 1) - flag = _sideNums; - double sum = 0; - for (size_t i = 0; i < _sideNums; i++) - sum += _motorList[i + flag].get_voltage(); - return sum / static_cast(_sideNums); //注意这里有坑 -} - -/** - * 显示传感器数据到屏幕 ostringstream ostr流 - */ -void Chassis::showSensor() -{ - userDisplay->ostr << "左底盘: 编码器:" << getEnc(0) << " 温度:" << getTemperature(0) << "电压:" << getVoltage(0) << "电流:" << getCurrent(0) << "\n" - << "右底盘: 编码器:" << getEnc(1) << " 温度:" << getTemperature(1) << "电压:" << getVoltage(1) << "电流:" << getCurrent(1) << std::endl; -} -const std::string Chassis::showName() const -{ - return _name; -} -void Chassis::showDetailedInfo() -{ - userDisplay->ostr << "左底盘pwm:" << _pwm[0] << "\n" - << "编码器:" << getEnc(0) << "速度:" << getSpeed(0) << "\n" - << "温度:" << getTemperature(0) << "电压:" << getVoltage(0) << "电流:" << getCurrent(0) << "\n" - << "右底盘pwm:" << _pwm[1] << "\n" - << "编码器 : " << getEnc(1) << "速度:" << getSpeed(1) << "\n" - << "温度 : " << getTemperature(1) << "电压 : " << getVoltage(1) << "电流 : " << getCurrent(1) << std::endl; -} - -} // namespace ncrapi diff --git a/src/ncrapi/device/adi.cpp b/src/ncrapi/device/adi.cpp deleted file mode 100644 index 901b2e4b..00000000 --- a/src/ncrapi/device/adi.cpp +++ /dev/null @@ -1,75 +0,0 @@ - -#include "ncrapi/device/adi.hpp" -#include "ncrapi/system/logger.hpp" -#include "ncrapi/util/util.hpp" - -namespace ncrapi -{ - -ADIAnalogIn::ADIAnalogIn(const std::string &name, const int &port) : _name(name), - _port(port), - pros::ADIAnalogIn(port) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} -ADIAnalogIn::ADIAnalogIn(const std::string &name, const json &pragma) : _name(name), - _port(pragma[name].get()), - pros::ADIAnalogIn(pragma[name].get()) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} - -std::string ADIAnalogIn::getName() -{ - return _name; -} -int ADIAnalogIn::getPort() -{ - return _port; -} - -ADIDigitalIn::ADIDigitalIn(const std::string &name, const int &port) : _name(name), - _port(port), - pros::ADIDigitalIn(port) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} - -ADIDigitalIn::ADIDigitalIn(const std::string &name, const json &pragma) : _name(name), - _port(pragma[name].get()), - pros::ADIDigitalIn(pragma[name].get()) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} -std::string ADIDigitalIn::getName() -{ - return _name; -} -int ADIDigitalIn::getPort() -{ - return _port; -} - -ADIEncoder::ADIEncoder(const std::string &name, const std::pair &port) : _name(name), - _port(port), - pros::ADIEncoder(port.first, port.second) -{ - logger->info({_name, ":", std::to_string(_port.first), " ", std::to_string(_port.second), "构造成功"}); -} - -ADIEncoder::ADIEncoder(const std::string &name, const json &pragma) : _name(name), - _port(std::make_pair(pragma[name].at(0).get(), pragma[name].at(1).get())), - pros::ADIEncoder(pragma[name].at(0).get(), pragma[name].at(1).get()) -{ - logger->info({_name, ":", std::to_string(_port.first), " ", std::to_string(_port.second), "构造成功"}); -} -std::string ADIEncoder::getName() -{ - return _name; -} -std::pair ADIEncoder::getPort() -{ - return _port; -} - -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/device/motor.cpp b/src/ncrapi/device/motor.cpp deleted file mode 100644 index f1ab2232..00000000 --- a/src/ncrapi/device/motor.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "ncrapi/device/motor.hpp" -#include "ncrapi/system/logger.hpp" -#include "ncrapi/system/sysBase.hpp" -#include "pros/motors.hpp" - -namespace ncrapi -{ -Motor::Motor(const std::string &name, const int &port, const bool &isRevase, const int &gearset) : _port(port), _name(name), - pros::Motor(port) -{ - init(clamp(gearset, 0, 2, "马达齿轮")); -} -Motor::Motor(const std::string &name, const json &pragma) : _name(name), - _port(pragma["端口"].get()), - pros::Motor(pragma["端口"].get(), pragma["正反"].get()) -{ - init(clamp(pragma["齿轮"].get(), 0, 2, "马达齿轮")); -} - -/** - *获取马达的名字 - * @return std::string 返回马达的名字 - */ -std::string Motor::getName() -{ - return _name; -} -/** - *获取马达的端口号 - * @return std::string 返回马达的名字 - */ -int Motor::getPort() -{ - return _port; -} - -/** - * @获取齿轮中文名字 - * - * @return std::string 返回齿轮的中文名字 - */ -std::string Motor::getGearName() -{ - size_t flag = get_gearing(); - if (flag == 0) - return "红齿轮"; - else if (flag == 1) - return "绿齿轮"; - else if (flag == 2) - return "蓝齿轮"; - else - return "齿轮获取错误,请检查马达"; -} -/** - *获取当前齿轮的速度 - * @return int 范湖齿轮的速度 红齿轮100 绿齿轮200 蓝齿轮600 - */ -int Motor::getGearSpeed() -{ - return _speed; -} - -void Motor::init(int gear) -{ - if (gear == 0) - { - set_gearing(pros::E_MOTOR_GEARSET_36); - _speed = 100; - } - else if (gear == 1) - { - set_gearing(pros::E_MOTOR_GEARSET_18); - _speed = 200; - } - else - { - set_gearing(pros::E_MOTOR_GEARSET_06); - _speed = 600; - } - size_t flag = get_gearing(); - set_encoder_units(pros::E_MOTOR_ENCODER_DEGREES); //设置编码器模式 - if (flag >= 0 && flag <= 2) - logger->info({_name, ":", std::to_string(_port), " ", std::to_string(is_reversed()), " ", std::to_string(flag), " 构造成功"}); - else - logger->error({_name, ":", std::to_string(_port), "构造失败,请检查马达"}); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/device/vision.cpp b/src/ncrapi/device/vision.cpp deleted file mode 100644 index 45871991..00000000 --- a/src/ncrapi/device/vision.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "ncrapi/device/vision.hpp" -#include "ncrapi/system/logger.hpp" -#include "ncrapi/util/util.hpp" - -namespace ncrapi -{ - -Vision::Vision(const std::string &name, const int &port) : _port(port), _name(name), - pros::Vision(port) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} -Vision::Vision(const std::string &name, const json &pragma) : _name(name), _port(pragma[name].get()), - pros::Vision(pragma[name].get()) -{ - logger->info({_name, ":", std::to_string(_port), "构造成功"}); -} -std::string Vision::getName() -{ - return _name; -} -int Vision::getPort() -{ - return _port; -} - -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/generic/generic.cpp b/src/ncrapi/generic/generic.cpp deleted file mode 100644 index 2f498ee2..00000000 --- a/src/ncrapi/generic/generic.cpp +++ /dev/null @@ -1,359 +0,0 @@ -#include "ncrapi/generic/generic.hpp" -#include "ncrapi/system/logger.hpp" -#include "ncrapi/system/sysBase.hpp" -#include -#include - -namespace ncrapi -{ -/** - * 机器人功能基础类 开环控制 - * @param a 马达对象 - * @param hold 悬停值 - */ - -Generic::Generic(const std::string &name, const json &pragma) : _name(name) -{ - - for (auto &[key, value] : pragma["马达"].items()) - _motorList.push_back({key, value}); - _holdVal = clamp(pragma["参数"]["悬停值"].get(), 0, 20, "悬停值"); - pros::delay(100); - _nums = _motorList.size(); - if (_nums == 0) - logger->error({"部件类马达数量不能为0"}); - _gearing = _motorList.begin()->getGearSpeed(); - sysData->addObj(this); - resetEnc(); - logger->info({"部件:", _name, " 构造成功"}); -} -/** - * 初始化函数 - * @param lab 进度条 - * @param str 文字 - * @param pwm 占空比 - */ -void Generic::init(lv_obj_t *lab, const char *str, const int pwm) -{ - lv_label_set_text(lab, str); - for (auto &it : _motorList) - it.move(pwm); - pros::delay(500); - while ((_encNow != _encLast) && _encLast != 0) - pros::delay(20); - for (auto &it : _motorList) - it.move(0); - resetEnc(); - _isInit = true; -} - -/** - * 普通的占空比控制 开环 - * @param pwm 占空比+-127 - */ -void Generic::set(const int pwm) -{ - _encLast = _encNow; - _openLoopVal = clamp(pwm, -127, 127); - if (isSafeMode()) - _openLoopVal = _holdVal * _holdingFlag; - for (auto &it : _motorList) - it.move(_openLoopVal); - if (getTemperature() >= 50 && _timerTemp.getDtFromMark() >= 15000) - { - logger->warnning({_name, ":马达过热!"}); - _timerTemp.placeMark(); - } - _encNow = getEnc(); -} -/** - * 普通的电压控制 开环 - * @param vol +-120 - */ -void Generic::moveVoltage(const double vol) -{ - _openLoopVal = static_cast(vol); - if (isSafeMode()) - _openLoopVal = _holdVal * _holdingFlag; - for (auto &it : _motorList) - it.move_voltage(static_cast(_openLoopVal * 100)); -} -void Generic::stop() -{ - for (auto &it : _motorList) - it.move(0); -} -/** - *设置要移动到的电机的目标绝对位置。 - * - *此运动相对于初始化时电机的位置或最近使用pros :: Motor :: set_zero_position()复位的位置。 - *\注意此功能只是设置电机的目标,它不会阻止程序执行直到运动结束。 - * @param position 要移动的位置 注意电机一圈360 - * @param velocity 速度 红齿轮上限100 绿齿轮200 蓝齿轮600 - */ -void Generic::moveAbsolute(const double position, const std::int32_t velocity) -{ - setMode(2); - for (auto &it : _motorList) - it.move_absolute(position, velocity); -} - -/** - *设置要移动到的电机的相对目标位置。 - * - *此运动与pros :: Motor :: motor_get_position()中给出的电机当前位置有关。提供10.0作为位置参数将导致电机顺时针移动10个单位,无论当前位置如何。 - * - *\注意此功能只是设置电机的目标,它不会阻止 - *程序执行直到运动结束。 - * @param position 要移动的位置 注意电机一圈360 - * @param velocity 速度 红齿轮上限100 绿齿轮200 蓝齿轮600 - */ -void Generic::moveRelative(const double position, const std::int32_t velocity) -{ - setMode(2); - for (auto &it : _motorList) - it.move_relative(position, velocity); -} -/** - 设定电机的速度。 - * - * - *当达到错误状态时,此函数使用以下errno值: - *EACCES -另一个资源目前正在尝试访问该端口。 - * - *\ param velocity 新电机速度为 - + - 100,+ -200或+ -600,具体取决于电机的齿轮组 - * - *\如果操作成功则返回1或如果操作则返回PROS_ERR - *失败,设置错误。 - */ -void Generic::moveVelocity(const std::int32_t velocity) -{ - setMode(2); - for (auto &it : _motorList) - it.move_velocity(velocity); -} -void Generic::holding() -{ - if (_mode == 1) - { - set(127); - _holdingFlag = _mode; - } - else if (_mode == -1) - { - set(-127); - _holdingFlag = _mode; - } - else if (_mode == 0) - set(_holdVal * _holdingFlag); - - else - ; -} - -/** - *设置模式 - * @param flag 1:系统正转模式 0:马达悬停 -1:系统反转模式 - */ -void Generic::setMode(const int flag) -{ - _mode = flag; -} -/** - * 获取当前模式状态 - * @return 1是系统正转状态 0悬停状态 -1 是系统反转状态 - */ -int Generic::getMode() -{ - return _mode; -} - -void Generic::joyControl(std::shared_ptr joy, pros::controller_digital_e_t up, pros::controller_digital_e_t down) -{ - if (joy->get_digital(up)) - { - set(127); - setMode(0); //打开悬停状态 - _holdingFlag = 1; - } - else if (joy->get_digital(down)) - { - set(-127); - setMode(0); //打开悬停状态 - _holdingFlag = -1; - } - else - holding(); -} -/** - * 重置马达编码器 - */ -void Generic::resetEnc() -{ - for (auto &it : _motorList) - it.tare_position(); -} -/** - * @brief 设置编码器值 - * - * @param pos 要设置的值 - */ -void Generic::setEnc(const double pos) -{ - for (auto &it : _motorList) - it.set_zero_position(pos); -} -int Generic::getOpenLoopVal() -{ - return _openLoopVal; -} - -/** - * 获取编码器值 - * @return 弹射编码器的值 - */ -double Generic::getEnc() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_position(); - return temp / _nums; -} -/** - * 获取速度 - * @return 返回速度 - */ -double Generic::getSpeed() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_actual_velocity(); - return temp / _nums; -} -/** - * 获取电机瓦数 - * @return 返回电机瓦数 - */ -double Generic::getPower() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_power(); - return temp / _nums; -} -/** - * 获取电机以mA为单位的电流。 - * @return 获取电机以mA为单位的电流。 - */ -int32_t Generic::getCurrent() -{ - int32_t temp = 0; - for (auto &it : _motorList) - temp += it.get_current_draw(); - return temp / _nums; -} -/** - * 以毫伏为单位获取输送到电机的电压。 - * @return如果操作失败,则以mV或PROS_ERR_F为单位返回电机电压,设置errno。 - */ -int32_t Generic::getVoltage() -{ - int32_t temp = 0; - for (auto &it : _motorList) - temp += it.get_voltage(); - return temp / _nums; -} -/** - * 获取电机效率 - * @return 以百分比形式返回电机效率 - */ -double Generic::getEfficiency() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_efficiency(); - return temp / _nums; -} -/** - * 获取电机扭矩 - * @return 返回电机扭矩 - */ -double Generic::getTorque() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_torque(); - return temp / _nums; -} -/** - * 获取电机平均温度 - * @return 返回电机平均温度 - */ -double Generic::getTemperature() -{ - double temp = 0; - for (auto &it : _motorList) - temp += it.get_temperature(); - return temp / _nums; -} -/** - * 检测部件是否堵转 - * @return 返回false 没有堵转,返回true 堵转了 - */ -bool Generic::isSafeMode() -{ - if (fabs(getSpeed()) <= _gearing / 10 && abs(_openLoopVal) > _holdVal) - { - _safeModeFlags++; - if (_safeModeFlags > 10) - { - logger->warnning({_name, ":进入热保模式!请注意操作"}); - return true; - } - else - return false; - } - else - { - _safeModeFlags = 0; - return false; - } -} -/** - * 重置所有相关传感器 - */ -void Generic::resetAllSensors() -{ - resetEnc(); -} - -/** - * 设置马达制动模式 使用会导致马达端口烧掉 - * @param mode 马达制动的模式 - */ -void Generic::setBrakeMode(pros::motor_brake_mode_e_t mode) -{ - logger->info({"设置:", _name, " 马达制动模式", std::to_string(mode)}); - for (auto &it : _motorList) - it.set_brake_mode(mode); -} -/** - * 显示传感器数据到屏幕 ostringstream ostr流 - */ -void Generic::showSensor() -{ - userDisplay->ostr << _name << ":编码器:" << getEnc() << "温度:" << getTemperature() - << "电压:" << getVoltage() << "电流:" << getCurrent() << std::endl; -} -const std::string Generic::showName() const -{ - return _name; -} -void Generic::showDetailedInfo() -{ - userDisplay->ostr << _name << "pwm:" << _openLoopVal << "\n" - << "编码器:" << getEnc() << "速度:" << getSpeed() << "\n" - << "温度:" << getTemperature() << "电压:" << getVoltage() << "电流:" << getCurrent() << std::endl; -} - -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/system/logger.cpp b/src/ncrapi/system/logger.cpp deleted file mode 100644 index cc13bf3f..00000000 --- a/src/ncrapi/system/logger.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "ncrapi/system/logger.hpp" -#include "pros/rtos.hpp" -#include -#include - -namespace ncrapi -{ -#define RESET "\033[0m" -#define BLACK "\033[30m" /* Black */ -#define RED "\033[31m" /* Red */ -#define GREEN "\033[32m" /* Green */ -#define YELLOW "\033[33m" /* Yellow */ -#define BLUE "\033[34m" /* Blue */ -#define MAGENTA "\033[35m" /* Magenta */ -#define CYAN "\033[36m" /* Cyan */ -#define WHITE "\033[37m" /* White */ -#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */ -#define BOLDRED "\033[1m\033[31m" /* Bold Red */ -#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */ -#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */ -#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */ -#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */ -#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */ -#define BOLDWHITE "\033[1m\033[37m" /* Bold White */ -Logger::Logger(const size_t Level) -{ - for (size_t i = 0; i <= Level; i++) - { - _data.push_back(fopen(_level[i].c_str(), "a")); - if (_data.back() == nullptr) - std::cerr << _level[i] << " 创建失败,请检查SD卡!" << std::endl; - else - std::cout << _level[i] << " 创建成功" << std::endl; - } -} -void Logger::error(std::initializer_list val) -{ - output(val); - if (_data[ERROR] != nullptr) - fprintf(_data[ERROR], "#FF0000 %s#\n", _str.c_str()); - std::cout << RED << _str << std::endl; -} -void Logger::warnning(std::initializer_list val) -{ - output(val); - if (_data[WARNNING] != nullptr) - fprintf(_data[WARNNING], "#CCFF00 %s#\n", _str.c_str()); - std::cout << YELLOW << _str << std::endl; -} -void Logger::debug(std::initializer_list val) -{ - output(val); - if (_data[DEBUG] != nullptr) - fprintf(_data[DEBUG], "#3366FF %s#\n", _str.c_str()); - std::cout << BLUE << _str << std::endl; -} -void Logger::info(std::initializer_list val) -{ - output(val); - if (_data[INFO] != nullptr) - fprintf(_data[INFO], "#FFFFFF %s#\n", _str.c_str()); - std::cout << RESET << _str << std::endl; -} -bool Logger::showData(LEVEL level, std::string &str) -{ - if (_data[level] != nullptr) - { - fclose(_data[level]); - _data[level] = fopen(_level[level].c_str(), "r"); //先关闭写模式再以读模式打开 - char buf[1024]; - while (fgets(buf, 1024, _data[level]) != nullptr) - str += buf; - fclose(_data[level]); //先关闭读模式 - _data[level] = fopen(_level[level].c_str(), "a"); //再继续以写模式打开 - return true; - } - std::cerr << _level[level] << " 文件打开错误,请检查SD卡!" << std::endl; - return false; -} -bool Logger::close(LEVEL level) -{ - if (_data[level] != nullptr) - { - fclose(_data[level]); - _data[level] = nullptr; - return true; - } - std::cerr << _level[level] << " 文件打开错误,请检查SD卡!" << std::endl; - return false; -} -bool Logger::clean(LEVEL level) -{ - if (_data[level] != nullptr) - { - fclose(_data[level]); //先关闭 - _data[level] = fopen(_level[level].c_str(), "w"); //清空 先关闭写模式再以写模式打开 - fclose(_data[level]); //再关闭 - _data[level] = fopen(_level[level].c_str(), "a"); //再继续以写模式打开 - return true; - } - std::cerr << _level[level] << " 文件打开错误,请检查SD卡!" << std::endl; - return false; -} -size_t Logger::getLevel() -{ - return (_data.size() - 1); -} -void Logger::output(std::initializer_list &val) -{ - _str.clear(); - int nowTime = pros::millis(); - _str = "[" + std::to_string((nowTime % 3600000) / 60000) + ":" + std::to_string((nowTime % 60000) / 1000) + ":" + std::to_string(nowTime % 1000) + "]:"; - for (auto &it : val) - _str += it; -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/system/sysBase.cpp b/src/ncrapi/system/sysBase.cpp deleted file mode 100644 index e7348ccb..00000000 --- a/src/ncrapi/system/sysBase.cpp +++ /dev/null @@ -1,145 +0,0 @@ - -#include "ncrapi/ncrapi.hpp" -#include "ncrapi/system/logger.hpp" -namespace ncrapi -{ -SysBase::SysBase(const json &pragam) -{ - if (!readSDcard(pragam)) - { - logger->error({"从userConfig读取配置"}); - jsonVal = pragam; - if (!saveData()) - logger->error({"config.json无法保存, 请检查SD卡"}); - } - //系统信息录入 - robotInfo = jsonVal["系统信息"]["机器人类型"].get() + " " + jsonVal["系统信息"]["队伍编号"].get() + " " + jsonVal["系统信息"]["用户"].get(); - logger->info({"系统基类构造成功"}); -} - -/* - * 从SD中读取文件 存入数据容器 - * @tparam DATA 数据容器类型 - * @param data 数据容器 - * @param filePath 路径 - * @param name 名字 - */ -bool SysBase::readSDcard(json pragam) -{ - FILE *file = fopen("/usd/config.json", "r"); - if (file == nullptr) - { - logger->error({"json 文件打开错误"}); - return false; - } - char buf[1024]; - std::string line; - while (fgets(buf, 1024, file) != nullptr) //读取一行 - line += buf; - jsonVal = json::parse(line); - if (jsonVal["系统信息"]["用户"].get() != pragam["系统信息"]["用户"].get()) - { - logger->error({"用户输入错误!请修改robotSet.hpp"}); - logger->error({"SD卡上用户名为:", jsonVal["系统信息"]["用户"].get()}); - logger->error({"robotSet用户名为:", pragam["系统信息"]["用户"].get()}); - while (1) - ; - } - if (jsonVal["json版本号"] < pragam["json版本号"]) - { - float temp = pragam["json版本号"]; //先存下新的版本号 - pragam.merge_patch(jsonVal); //用新的合并老的数据 把SD卡数据替换默认数据 - jsonVal = pragam; - std::stringstream oss; //主要为了去掉小数点后多余的0 默认3位 - oss.setf(std::ios::fixed); //用定点格式显示浮点数,不会用科学计数法表示 - oss.precision(1); //由于用了定点格式,设置变为了保留1位小数 - oss << temp; - oss >> jsonVal["json版本号"]; - saveData(); - logger->debug({"json版本升级为:", std::to_string(jsonVal["json版本号"].get())}); - } - fclose(file); - return true; -} -/** - * 以vector 容器为基础修改保存文件 - * @tparam T 数据的类型 - * @param data 数据的名称 - * @param filePath 数据的路径 - * @return true 保存成功 - * @return false 保存失败 - */ - -bool SysBase::saveData() -{ - FILE *file = fopen("/usd/config.json", "w"); - if (file == nullptr) - { - logger->error({"json 保存失败"}); - return false; - } - fprintf(file, "%s", jsonVal.dump(4).c_str()); //保存 - logger->info({"json 保存成功"}); - fclose(file); - return true; -} - -/** - *增加部件名字 - * @param str 部件的名字 - */ -void SysBase::addObj(Obj *generic) -{ - obj.push_back(generic); -} -/** - *获取当前机器人部件总数 - * @return size_t 部件总数 - */ -size_t SysBase::getObjNums() -{ - return obj.size(); -} -/** - *停止所有部件运作 - */ -void SysBase::stopAllObj() -{ - for (auto &it : obj) - it->stop(); -} -void SysBase::print(const json &pragma, std::string_view ignore) -{ - for (auto &it : pragma.items()) - if (it.key() != ignore) - for (auto &it1 : it.value().items()) - { - std::cout << it1.key() << " "; - for (auto &it2 : it1.value().items()) - std::cout << it2.key() << ":" << it2.value() << " "; - std::cout << std::endl; - } -} -//递归打印 -void SysBase::recursionPrint(const json &pragma, std::string_view ignore) -{ - for (auto &[key, val] : pragma.items()) - { - if (key != ignore) - { - if (val.is_structured()) - { - std::cout << "\n" - << key << ": "; //这里可以右移 - recursionPrint(val, ignore); - } - else - { - std::cout << key << ":" << val << " "; - } - } - } - return; -} - -} // namespace ncrapi diff --git a/src/ncrapi/userDisplay/debug.cpp b/src/ncrapi/userDisplay/debug.cpp deleted file mode 100644 index 4183a0c9..00000000 --- a/src/ncrapi/userDisplay/debug.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "ncrapi/system/logger.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" -#include - -static lv_res_t clearAction(lv_obj_t *btn) -{ - lv_obj_t *debugLab = static_cast(lv_obj_get_free_ptr(btn)); - int level = lv_obj_get_free_num(debugLab); - if (logger->clean(static_cast(level))) - lv_label_set_text(debugLab, ""); - return LV_RES_INV; -} -namespace ncrapi -{ -void UserDisplay::createDebug(lv_obj_t *parent) -{ - std::vector Level = {"错误", "警告", "调试", "信息"}; - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLACK; - for (size_t i = 0; i <= logger->getLevel(); i++) - { - lv_obj_t *tabs = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], Level[i].c_str()); - std::string debugStr; - logger->showData(static_cast(i), debugStr); - lv_obj_t *debugLab = lv_label_create(tabs, nullptr); //创建文本条 - lv_label_set_long_mode(debugLab, LV_LABEL_LONG_ROLL); - lv_label_set_anim_speed(debugLab, 1); - lv_label_set_array_text(debugLab, debugStr.c_str(), debugStr.size()); - lv_obj_set_size(debugLab, LV_HOR_RES - 30, LV_VER_RES - 20); - lv_label_set_recolor(debugLab, true); - - //创建清空按钮 - lv_obj_t *clearBtn = lv_btn_create(tabs, nullptr); - lv_obj_set_pos(clearBtn, LV_HOR_RES - 140, LV_VER_RES - 79); - lv_obj_set_size(clearBtn, 50, 25); - lv_obj_t *clearLab = lv_label_create(clearBtn, nullptr); - lv_label_set_text(clearLab, "clear"); - lv_btn_set_action(clearBtn, LV_BTN_ACTION_CLICK, clearAction); - lv_obj_set_free_ptr(clearBtn, debugLab); - lv_obj_set_free_num(debugLab, i); - } - //退出按钮 - createExitBtn(OBJ_BTNM_SON); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/maintenanceInfo.cpp b/src/ncrapi/userDisplay/maintenanceInfo.cpp deleted file mode 100644 index 01f2af30..00000000 --- a/src/ncrapi/userDisplay/maintenanceInfo.cpp +++ /dev/null @@ -1,52 +0,0 @@ - -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" - -namespace ncrapi -{ -void UserDisplay::createMaintenanceInfo(lv_obj_t *parent) -{ - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLACK; - _tempData = sysData->jsonVal; - for (auto &it : sysData->obj) //遍历项目名字 - { - size_t posX = 0, posY = 0; - /*创建TABS*/ - lv_obj_t *tabs = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], it->showName().c_str()); - lv_page_set_scrl_fit(tabs, false, false); - lv_page_set_scrl_height(tabs, 600); //设置页面可滚动部分的高度 - for (auto &it : _tempData[it->showName()].items()) - { - if (it.key() == "马达" || it.key() == "ADI") - for (auto &it1 : it.value().items()) - { - lv_obj_t *lmeter = lv_lmeter_create(tabs, nullptr); //绘制滑块条 - lv_lmeter_set_range(lmeter, 0, 100); - lv_lmeter_set_value(lmeter, 100); - lv_obj_set_pos(lmeter, posX, posY); - lv_obj_set_size(lmeter, 85, 85); //设置滑块条大小 - lv_obj_t *val = lv_label_create(lmeter, nullptr); - lv_obj_align(val, nullptr, LV_ALIGN_CENTER, 0, 0); - lv_label_set_text(val, std::to_string(lv_lmeter_get_value(lmeter)).c_str()); //设置KEY的文本 //静态文本有问题 - lv_obj_t *key = lv_label_create(lmeter, nullptr); - lv_obj_align(key, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, 0); - lv_label_set_text(key, it1.key().c_str()); //设置KEY的文本 //静态文本有问题 - if (lv_obj_get_x(lmeter) >= 360) - { - posX = 0; - posY += 90; - } - else - posX += 120; - } - } - } - - //创建保存按钮 - createSaveBtn(OBJ_BTNM_SON); - //退出按钮 - createExitBtn(OBJ_BTNM_SON); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/odomPage.cpp b/src/ncrapi/userDisplay/odomPage.cpp deleted file mode 100644 index 9c640b1a..00000000 --- a/src/ncrapi/userDisplay/odomPage.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "ncrapi/ncrapi.hpp" -#include - -namespace ncrapi -{ -void UserDisplay::createOdom(lv_obj_t *parent) -{ - createUserObj(OBJ_BTNM_SON, false, "里程计页面", parent); - //创建图像 - lv_obj_t *img = lv_img_create(displayObj[OBJ_BTNM_SON], nullptr); - lv_img_set_src(img, &field); //将创建的文件设置为图像 -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/pidPage.cpp b/src/ncrapi/userDisplay/pidPage.cpp deleted file mode 100644 index f21aadb0..00000000 --- a/src/ncrapi/userDisplay/pidPage.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" -/** - * 标签栏按下后的动作 - * @param tab 标签 - * @param x 几号标签 - */ -static void tabChose(lv_obj_t *tab, uint16_t x) -{ -} -namespace ncrapi -{ -void UserDisplay::createPidTest(lv_obj_t *parent) -{ - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - - lv_obj_t *frTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "前后PID调试"); - lv_obj_t *rotateTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "左右PID调试"); - /*当选项卡按下后进行的操作*/ - lv_tabview_set_tab_load_action(displayObj[OBJ_BTNM_SON], tabChose); - //退出按钮 - createExitBtn(OBJ_BTNM_SON); -} - -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/setConfig.cpp b/src/ncrapi/userDisplay/setConfig.cpp deleted file mode 100644 index 89790db8..00000000 --- a/src/ncrapi/userDisplay/setConfig.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" - -namespace ncrapi -{ - -void UserDisplay::createConfig(lv_obj_t *parent) -{ - - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLACK; - std::vector key; - std::vector updownBtn; - static const char *updown[] = {"+", "-", ""}; - _tempData = sysData->jsonVal; - for (auto &it : sysData->obj) //遍历项目名字 - { - size_t posX = 0, posY = 10; - /*创建TABS*/ - lv_obj_t *tabs = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], it->showName().c_str()); - lv_page_set_scrl_fit(tabs, false, false); - lv_page_set_scrl_height(tabs, 600); //设置页面可滚动部分的高度 - for (auto &it : _tempData[it->showName()].items()) - { - if (it.key() != "PID参数") - for (auto &it1 : it.value().items()) - { - key.push_back(lv_label_create(tabs, nullptr)); //KEY就一个 - lv_obj_set_pos(key.back(), posX, posY); //设置key的位置 - lv_label_set_text(key.back(), it1.key().c_str()); //设置KEY的文本 //静态文本有问题 - int pos = 0; - for (auto &it2 : it1.value().items()) - { - /**value设置*/ - lv_obj_t *values = lv_label_create(tabs, nullptr); //新建子项目的val - lv_label_set_text(values, it2.value().dump().c_str()); //设置按钮的值 - if (!it1.value().is_array()) //如果他不是数组就创建key - { - /**key设置*/ - key.push_back(lv_label_create(tabs, nullptr)); //新建子项目的key - lv_label_set_text(key.back(), it2.key().c_str()); //设置子项目的key的文本信息 - if (pos == 0) - lv_obj_align(key.back(), *(key.end() - 2), LV_ALIGN_OUT_RIGHT_MID, 10, 0); //子项目key的位置紧贴上一个key的位置 - else - lv_obj_align(key.back(), updownBtn.back(), LV_ALIGN_OUT_RIGHT_MID, 10, 0); //子项目key的位置紧贴上一个upDownBtn的位置 - - /**value设置*/ - lv_obj_align(values, key.back(), LV_ALIGN_OUT_RIGHT_MID, 10, 0); //values的位置紧贴key的位置 - } - else //是数组 - { - /**value设置*/ - if (pos == 0) - lv_obj_align(values, key.back(), LV_ALIGN_OUT_RIGHT_MID, 10, 0); //values的位置紧贴key的位置 - else - lv_obj_align(values, updownBtn.back(), LV_ALIGN_OUT_RIGHT_MID, 10, 0); //values的位置紧贴key的位置 - } - - /**updownBtn设置*/ - updownBtn.push_back(lv_btnm_create(tabs, nullptr)); //新建updownBtn - lv_btnm_set_map(updownBtn.back(), updown); - lv_obj_set_size(updownBtn.back(), 50, 25); - - lv_obj_set_free_ptr(updownBtn.back(), values); //创建关键指针. btn关联values 这里主要为了实现刷新 - lv_obj_set_free_ptr(values, &it2.value()); //创建关键指针. values关联key - - lv_obj_align(updownBtn.back(), values, LV_ALIGN_OUT_RIGHT_MID, 10, 0); //设置updownbtn位置 - lv_btnm_set_action(updownBtn.back(), upDownAction); //设置updown按钮动作 - pos++; - }; - if (lv_obj_get_x(updownBtn.back()) > 230) //key表示偶数换行 it.szie()表示每行总共有2个数一个KEY 一个VAL - { - posX = 0; - posY += 35; - } - else - posX = 230; - } - } - } - - //创建保存按钮 - createSaveBtn(OBJ_BTNM_SON); - //退出按钮 - createExitBtn(OBJ_BTNM_SON); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/startPage.cpp b/src/ncrapi/userDisplay/startPage.cpp deleted file mode 100644 index e20019bc..00000000 --- a/src/ncrapi/userDisplay/startPage.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @Author: 陈昱安 - * @Date: 2018-10-22T22:01:37+08:00 - * @Email: 31612534@qq.com - * @Last modified by: 陈昱安 - * @Last modified time: 2018-10-28T22:09:06+08:00 - */ - -#include "ncrapi/system/logger.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" - -/** - * 按钮阵列的动作 - * @param btnm 按钮阵列 - * @param txt 按钮的名字 - * @return 系统值 - */ -static lv_res_t btnm_action(lv_obj_t *btnm, const char *txt) -{ - (void)btnm; /*Unused*/ - if (!strcmp(txt, "系统信息")) - userDisplay->createSysInfo(userDisplay->displayObj[BTNM_START]); //1 - else if (!strcmp(txt, "全局参数设置")) - userDisplay->createConfig(userDisplay->displayObj[BTNM_START]); //2 创建CONFIGSET页面 - else if (!strcmp(txt, "维护信息")) - userDisplay->createMaintenanceInfo(userDisplay->displayObj[BTNM_START]); //3 - else if (!strcmp(txt, "视觉传感器设置")) - userDisplay->createVision(userDisplay->displayObj[BTNM_START]); //4创建视觉页面 - else if (!strcmp(txt, "版本号")) - userDisplay->createVersion(userDisplay->displayObj[BTNM_START]); //5 - else if (!strcmp(txt, "日志信息")) - userDisplay->createDebug(userDisplay->displayObj[BTNM_START]); //6 - else if (!strcmp(txt, "PID调试")) - userDisplay->createPidTest(userDisplay->displayObj[BTNM_START]); //7 - else if (!strcmp(txt, "ODOM测试")) - userDisplay->createOdom(userDisplay->displayObj[BTNM_START]); //8 - logger->info({"选择 ", txt}); - return LV_RES_INV; -} -namespace ncrapi -{ -void UserDisplay::createStartObj() -{ - static const char *startBtnm[] = {"系统信息", "日志信息", "\n", - "全局参数设置", "维护信息", "\n", - "PID调试", "视觉传感器设置", "\n", - "ODOM测试", "版本号", ""}; - if (displayObj[BTNM_START] == nullptr) - displayObj[BTNM_START] = lv_btnm_create(displayObj[OBJ_OPCONTROL], nullptr); //创建按钮集群 - - lv_btnm_set_map(displayObj[BTNM_START], startBtnm); - lv_obj_set_size(displayObj[BTNM_START], LV_HOR_RES, LV_VER_RES - 20); - lv_obj_set_y(displayObj[BTNM_START], 20); - lv_btnm_set_action(displayObj[BTNM_START], btnm_action); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/sysInfo.cpp b/src/ncrapi/userDisplay/sysInfo.cpp deleted file mode 100644 index d3133b15..00000000 --- a/src/ncrapi/userDisplay/sysInfo.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @Author: 陈昱安 - * @Date: 2018-10-22T22:01:37+08:00 - * @Email: 31612534@qq.com - * @Last modified by: 陈昱安 - * @Last modified time: 2018-10-28T22:09:06+08:00 - */ -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" -#include -static void sysInfoTask(void *param) -{ - (void)param; /*Unused*/ - uint16_t temp = lv_tabview_get_tab_act(userDisplay->displayObj[OBJ_BTNM_SON]); - userDisplay->ostr.clear(); //1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); - userDisplay->ostr.str(""); //2:调用str("")将缓冲区清零,清除脏数据 - userDisplay->ostr << std::fixed << std::setprecision(1); //流操纵算子 //std::setw(6) 宽度控制 //精度控制会影响后面的输出 std::setprecision(1) - if (temp == 0) - for (auto &it : sysData->obj) - it->showSensor(); - else - sysData->obj[temp - 1]->showDetailedInfo(); - lv_label_set_text(userDisplay->otherLab, userDisplay->ostr.str().c_str()); -} - -/** - * 标签栏按下后的动作 - * @param tab 标签 - * @param x 几号标签 0开始的 - */ -static void tabChose(lv_obj_t *tab, uint16_t x) -{ - //这个似乎不能删 -} -namespace ncrapi -{ -void UserDisplay::createSysInfo(lv_obj_t *parent) -{ - - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLACK; - std::vector tabs; - tabs.push_back(lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "概览")); //先建立一个概览 - for (auto &it : sysData->obj) //遍历项目名字 - tabs.push_back(lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], it->showName().c_str())); //添加项目 - - /*当选项卡按下后进行的操作*/ - lv_tabview_set_tab_load_action(displayObj[OBJ_BTNM_SON], tabChose); - - //创建文本条 - otherLab = lv_label_create(displayObj[OBJ_BTNM_SON], nullptr); //创建基于INFOObj的标签 - lv_obj_set_y(otherLab, 30); //设置文本条位置 - - //重置传感器按钮 - createResetBtn(OBJ_BTNM_SON, LV_HOR_RES - 140, LV_VER_RES - 50); - //退出按钮 - createExitBtn(OBJ_BTNM_SON); - createUserTask(TASK_OTHER, sysInfoTask, 100, "系统信息"); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/userDisplay.cpp b/src/ncrapi/userDisplay/userDisplay.cpp deleted file mode 100644 index 3fe8b941..00000000 --- a/src/ncrapi/userDisplay/userDisplay.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/** - * @Author: 陈昱安 - * @Date: 2018-10-22T22:01:37+08:00 - * @Email: 31612534@qq.com - * @Last modified by: 陈昱安 - * @Last modified time: 2018-10-28T22:09:02+08:00 - */ - -#include "api.h" -#include "ncrapi/ncrapi.hpp" -#include - -namespace ncrapi -{ -/** - *构造函数初始化 - */ -UserDisplay::UserDisplay() -{ - displayObj[OBJ_BTNM_SON] = lv_obj_create(lv_scr_act(), nullptr); - lv_obj_set_size(displayObj[OBJ_BTNM_SON], LV_HOR_RES, LV_VER_RES); //设置页面大小 - //增加自定义字库 - lv_font_add(&ncrfont10, nullptr); - /*初始化外星人主题*/ - theme = lv_theme_alien_init(100, &ncrfont10); - //设置 tabview样式 - theme->tabview.indic->body.padding.inner = 1; - theme->tabview.btn.rel->text.font = &ncrfont10; //重新设置字体 - theme->tabview.btn.rel->body.padding.ver = 5; //释放按钮的垂直填充应用于所有按钮 - // theme->tabview.bg->body.padding.ver = 5; - // theme->tabview.bg->body.border.width = 0; - // theme->tabview.bg->text.line_space = 1; - //全局样式 - lv_style_copy(&mainStyle, &lv_style_pretty_color); //拷贝当前按钮样式 - mainStyle.text.font = &ncrfont10; - mainStyle.body.padding.ver = 5; - if (!sysData->jsonVal["自动赛"]["红方&蓝方"]) //设置默认颜色 - { - theme->tabview.bg->body.main_color = LV_COLOR_RED; - mainStyle.body.main_color = LV_COLOR_RED; - } - else - { - theme->tabview.bg->body.main_color = LV_COLOR_BLUE; - mainStyle.body.main_color = LV_COLOR_BLUE; - } - mainStyle.body.grad_color = LV_COLOR_BLACK; //渐变色黑色 - //设置LOGO - logoObj = lv_img_create(displayObj[OBJ_BTNM_SON], nullptr); - - lv_img_set_src(logoObj, &logo); //将创建的文件设置为图像 - lv_obj_align(logoObj, displayObj[OBJ_BTNM_SON], LV_ALIGN_IN_RIGHT_MID, 0, 0); - lv_obj_animate(logoObj, LV_ANIM_FLOAT_TOP, 3000, 100, nullptr); - //应用全局样式 - lv_obj_set_style(displayObj[OBJ_BTNM_SON], &mainStyle); /*设置Surand系统主题*/ - lv_theme_set_current(theme); - logger->info({"图像类构造成功"}); -} -/** - *自定义类创建 - * @param 页面名称 - * @param 是否重新绘制新屏幕 - * @param 控制台字符串 - * @param parent 父对象 - * @param labText 页面名称 - */ -void UserDisplay::createUserObj(obj_flag objname, bool isSrcLoad, const char *terminalText, lv_obj_t *parent, const char *labText) -{ - if (displayObj[objname] == nullptr) - { - if (isSrcLoad) - { - displayObj[objname] = lv_obj_create(parent, nullptr); - lv_scr_load(displayObj[objname]); - } - else - { - displayObj[objname] = lv_obj_create(parent, nullptr); - - lv_obj_set_size(displayObj[objname], LV_HOR_RES, LV_VER_RES - 10); //设置页面大小 - lv_obj_set_style(displayObj[objname], &mainStyle); //设置样式 - //退出按钮 - createExitBtn(objname); - } - logger->info({"图像类:", terminalText, " 构造成功"}); - } - else - logger->debug({"图像类:", terminalText, " 已经存在"}); - - if (labText != nullptr) - { - lv_obj_t *lab = lv_label_create(userDisplay->displayObj[objname], nullptr); - lv_label_set_text(lab, labText); - } -} -/** - * 使用LVGLTASK函数创建一个线程 - * @param taskName 线程名称 - * @param task 线程函数 - * @param loopTime 循环时间 - * @param terminalText 线程名称 - */ -void UserDisplay::createUserTask(task_flag taskName, void (*task)(void *), uint32_t loopTime, const char *terminalText, void *pragma) -{ - if (displayTask[taskName] == nullptr) - { - displayTask[taskName] = lv_task_create(task, loopTime, LV_TASK_PRIO_LOW, pragma); - logger->info({"图像类线程:", terminalText, " 构造成功"}); - } - else - logger->warnning({"图像类线程:", terminalText, " 已经存在"}); -} -/** - * 删除所有线程 - */ -void UserDisplay::delTasks() -{ - unsigned int flag = 1; - for (auto &it : userDisplay->displayTask) - { - if (it != nullptr) - { - lv_task_del(it); - it = nullptr; - std::cout << "删除图像类线程:" << flag << " 个" << std::endl; - flag++; - } - } -} -/** - * 删除所有对象 - */ -void UserDisplay::delObjs() -{ - unsigned int flag = 1; - for (auto &it : userDisplay->displayObj) - { - if (it != nullptr) - { - lv_obj_del(it); - it = nullptr; - logger->info({"删除图像类:", std::to_string(flag), " 个"}); - flag++; - } - } -} -/** - * 用于获取系统LOOP时间的静态函数 - * @param param - */ -void UserDisplay::loopTask(void *param) -{ - (void)param; /*Unused*/ - userDisplay->ostr.clear(); //1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); - userDisplay->ostr.str(""); //2:调用str("")将缓冲区清零,清除脏数据 - userDisplay->ostr << "loop:" << userDisplay->loopTime << "max:" << userDisplay->maxLoopTime << "min:" << userDisplay->minLoopTime << std::endl; - lv_label_set_text(userDisplay->loopLab, userDisplay->ostr.str().c_str()); -} -/** - * 创建遥控模块页面 - */ -void UserDisplay::createOpObj(const std::string &userInfo) -{ - delTasks(); - createUserTask(TASK_LOOP, loopTask, 100, "循环时间条"); - delObjs(); - createUserObj(OBJ_OPCONTROL, true, "遥控"); - if (!pros::competition::is_connected()) //没插场控 - createStartObj(); - lv_obj_t *robotInfoLab = lv_label_create(displayObj[OBJ_OPCONTROL], nullptr); - lv_obj_set_x(robotInfoLab, LV_HOR_RES / 2 - 30); - lv_label_set_static_text(robotInfoLab, userInfo.c_str()); - loopLab = lv_label_create(displayObj[OBJ_OPCONTROL], nullptr); - loopTask(nullptr); -} - -void UserDisplay::sensorsTask(void *param) -{ - (void)param; /*Unused*/ - userDisplay->ostr.clear(); //1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); - userDisplay->ostr.str(""); //2:调用str("")将缓冲区清零,清除脏数据 - userDisplay->ostr << std::fixed << std::setprecision(1) << std::setw(6); //流操纵算子 - for (auto &it : sysData->obj) - it->showSensor(); - std::string temp = userDisplay->ostr.str(); - lv_label_set_text(userDisplay->otherLab, temp.c_str()); -} -/** - * 自动赛选择时候的确认按钮的动作 - * @param btn 要实现动作的按钮的指针 - * @return 返回不知道啥.... - */ - -lv_res_t UserDisplay::confirmBtnIncomp(lv_obj_t *btn) -{ - int i = 0; - sysData->saveData(); - //获取开关状态 - std::string str; - for (auto &it : sysData->jsonVal["自动赛"].items()) - { - std::string tempStr = it.key(); - auto pos = tempStr.find("&"); //查找间隔符号 - if (pos != std::string::npos) - { - if (it.value()) - tempStr.erase(0, pos + 1); - else - tempStr.erase(pos, tempStr.length()); - str += (tempStr + "\n"); - } - else - logger->error({"自动赛json选项设置错误 请用&间隔"}); - i++; - } - // 创建确认页面 - lv_obj_t *confirm = lv_obj_create(userDisplay->displayObj[OBJ_COMPETITION], nullptr); - lv_obj_set_size(confirm, LV_HOR_RES, LV_VER_RES); - lv_obj_set_style(confirm, &userDisplay->mainStyle); - //显示自动赛选项 - lv_obj_t *autoinfoLab = lv_label_create(confirm, nullptr); //创建LAB条 - userDisplay->ostr.clear(); //1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); - userDisplay->ostr.str(""); //2:调用str("")将缓冲区清零,清除脏数据 - userDisplay->ostr << str << std::endl; - lv_label_set_text(autoinfoLab, userDisplay->ostr.str().c_str()); - // 传感器页面创建 - - userDisplay->otherLab = lv_label_create(confirm, nullptr); //创建基于INFOObj的标签 - lv_obj_align(userDisplay->otherLab, autoinfoLab, LV_ALIGN_OUT_RIGHT_TOP, 20, 0); //设置传感器栏目位置 - //重置传感器按钮 - userDisplay->createResetBtn(OBJ_COMPETITION, LV_HOR_RES - 80, LV_VER_RES - 30); - userDisplay->createUserTask(TASK_OTHER, sensorsTask, 100, "sensorInfo"); //创建一个线程 - return LV_RES_OK; -} - -/** - * 标签栏按下后的动作 - * @param tab 标签 - * @param x 几号标签 - */ -void UserDisplay::compTabChose(lv_obj_t *tab, uint16_t x) -{ - (void)tab; /*Unused*/ - if (x == 0) - { - sysData->jsonVal["自动赛"]["红方&蓝方"] = false; //红方0 - userDisplay->theme->tabview.bg->body.main_color = LV_COLOR_RED; - userDisplay->mainStyle.body.main_color = LV_COLOR_RED; - } - else if (x == 1) - { - sysData->jsonVal["自动赛"]["红方&蓝方"] = true; //红方0 - userDisplay->theme->tabview.bg->body.main_color = LV_COLOR_BLUE; - userDisplay->mainStyle.body.main_color = LV_COLOR_BLUE; - } - //应用全局样式 - lv_theme_set_current(userDisplay->theme); - // else if (x == 2) - // { - // sysData->autoIsMode = 1; //纯自动 - // sysData->autoSide = 0; //技能赛默认红方 - // userDisplay->theme->tabview.bg->body.main_color = LV_COLOR_BLACK; - // } -} -lv_res_t UserDisplay::swAction(lv_obj_t *sw) //SW的动作 -{ - json *tempData = static_cast(lv_obj_get_free_ptr(sw)); - *tempData = lv_sw_get_state(sw); - return LV_RES_OK; -} -void UserDisplay::createCompe() -{ - delTasks(); - delObjs(); - createUserObj(OBJ_COMPETITION, true, "竞赛等待"); - //创建标签栏 - lv_obj_t *tab = lv_tabview_create(displayObj[OBJ_COMPETITION], nullptr); - lv_obj_set_size(tab, LV_HOR_RES, LV_VER_RES); //设置位置 - lv_obj_t *redTab = lv_tabview_add_tab(tab, "红方"); - lv_obj_t *blueTab = lv_tabview_add_tab(tab, "蓝方"); - //lv_obj_t *skillAutoTab = lv_tabview_add_tab(tab, "技能赛"); - lv_tabview_set_tab_act(tab, sysData->jsonVal["自动赛"]["红方&蓝方"].get(), false); //设置默认红方还是蓝方 - /*当选项卡按下后进行的操作*/ - lv_tabview_set_tab_load_action(tab, compTabChose); - int posX = 10, posY = 50; - std::vector> compSw; // - //创建各种开关和文本条 附带位置设置 - for (auto &it : sysData->jsonVal["自动赛"].items()) - { - if (it.key() != "红方&蓝方") - { - compSw.push_back(std::make_pair(lv_label_create(displayObj[OBJ_COMPETITION], nullptr), lv_sw_create(displayObj[OBJ_COMPETITION], nullptr))); //创建文本条和开关 - lv_label_set_text(compSw.back().first, it.key().c_str()); /*设置文字*/ - lv_obj_set_size(compSw.back().second, 60, 25); - if (it.value().get()) - lv_sw_on(compSw.back().second); //设置按钮默认值 - else - lv_sw_off(compSw.back().second); //设置按钮默认值 - //位置设置 - lv_obj_set_pos(compSw.back().first, posX, posY); //设置lab文字的位置 - lv_obj_align(compSw.back().second, compSw.back().first, LV_ALIGN_OUT_RIGHT_MID, 10, 0); //设置开关的位置 - lv_sw_set_action(compSw.back().second, swAction); //设置按钮的动作 - lv_obj_set_free_ptr(compSw.back().second, &it.value()); //关联按钮和json - if (lv_obj_get_x(compSw.back().second) > 230) //key表示偶数换行 it.szie()表示每行总共有2个数一个KEY 一个VAL - { - posX = 10; - posY += 60; - } - else - posX = 260; - } - } - //确认按钮设置 - lv_obj_t *confirmBtn = lv_btn_create(displayObj[OBJ_COMPETITION], nullptr); //创建确认开关 - lv_obj_t *confirmLab = lv_label_create(confirmBtn, nullptr); //创建确认开关文本 这里设置按钮为父级 - lv_label_set_text(confirmLab, "确认"); - lv_obj_set_size(confirmBtn, 200, 50); //大小设置 - //设置确定按钮和其文本框的位置 - lv_obj_set_pos(confirmBtn, LV_HOR_RES - 200, LV_VER_RES - 50); - //确认按钮的动作 - lv_btn_set_action(confirmBtn, LV_BTN_ACTION_PR, confirmBtnIncomp); - //调用按钮页面 - //TODO 技能赛的动作 -} -lv_res_t UserDisplay::closeAction(lv_obj_t *btn) -{ - (void)btn; /*Unused*/ - if (userDisplay->displayObj[OBJ_BTNM_SON] != nullptr) - { - if (!sysData->jsonVal["自动赛"]["红方&蓝方"]) //设置默认颜色 - userDisplay->displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_RED; - else - userDisplay->displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLUE; - lv_obj_del(userDisplay->displayObj[OBJ_BTNM_SON]); - userDisplay->displayObj[OBJ_BTNM_SON] = nullptr; - } - if (userDisplay->displayTask[TASK_OTHER] != nullptr) - { - lv_task_del(userDisplay->displayTask[TASK_OTHER]); - userDisplay->displayTask[TASK_OTHER] = nullptr; - } - if (sysData->isOPcontrol == false) - sysData->isOPcontrol = true; - return LV_RES_INV; -} -void UserDisplay::createVersion(lv_obj_t *parent) -{ - - createUserObj(OBJ_BTNM_SON, false, "版本页面", parent); - displayObj[OBJ_BTNM_SON]->style_p->body.main_color = LV_COLOR_BLACK; - lv_obj_t *verLab = lv_label_create(displayObj[OBJ_BTNM_SON], nullptr); //创建LAB条 - userDisplay->ostr.clear(); //1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); - userDisplay->ostr.str(""); //2:调用str("")将缓冲区清零,清除脏数据 - userDisplay->ostr << "pros版本:" << PROS_VERSION_STRING << '\n' - << "LVGL版本:" << LVGL_VERSION_INFO << '\n' - << "JSON版本:" << NLOHMANN_JSON_VERSION_MAJOR << "." << NLOHMANN_JSON_VERSION_MINOR << "." << NLOHMANN_JSON_VERSION_PATCH << '\n' - << "UserJSON版本:" << sysData->jsonVal["json版本号"] << '\n' - << "NCRAPI版本:" << NCR_VERSION_STRING << std::endl; - lv_label_set_text(verLab, userDisplay->ostr.str().c_str()); -} -lv_res_t UserDisplay::resetAction(lv_obj_t *btn) -{ - (void)btn; /*Unused*/ - for (auto &it : sysData->obj) - it->resetAllSensors(); - return LV_RES_INV; -} -lv_res_t UserDisplay::saveAction(lv_obj_t *btn) -{ - json *tempData = static_cast(lv_obj_get_free_ptr(btn)); - sysData->jsonVal = *tempData; - sysData->saveData(); - return LV_RES_INV; -} -lv_res_t UserDisplay::upDownAction(lv_obj_t *btnm, const char *txt) -{ - lv_obj_t *labPtr = static_cast(lv_obj_get_free_ptr(btnm)); - json *valPtr = static_cast(lv_obj_get_free_ptr(labPtr)); //从btm获取关联的valus - static uint32_t time = 0; - static uint32_t flag = 1; - if (lv_tick_elaps(time) <= 200) - flag += 10; - else - flag = 1; - if (valPtr->is_number_integer()) - { - int temp = *valPtr; - if (!strcmp(txt, "+")) - temp += 1; - else if (!strcmp(txt, "-")) - temp -= 1; - *valPtr = temp; - } - else if (valPtr->is_boolean()) - { - bool temp = *valPtr; - if (!strcmp(txt, "+")) - temp = !temp; - else if (!strcmp(txt, "-")) - temp = !temp; - *valPtr = temp; - } - else if (valPtr->is_number_float()) - { - double_t temp = *valPtr; - if (!strcmp(txt, "+")) - temp += 0.001 * flag; - else if (!strcmp(txt, "-")) - temp -= 0.001 * flag; - std::stringstream oss; //主要为了去掉小数点后多余的0 默认3位 - oss.setf(std::ios::fixed); //用定点格式显示浮点数,不会用科学计数法表示 - oss.precision(3); //由于用了定点格式,设置变为了保留4位小数 - oss << temp; - oss >> *valPtr; - } - lv_label_set_text(labPtr, valPtr->dump().c_str()); - time = lv_tick_get(); - return LV_RES_OK; -} -void UserDisplay::createMbox(obj_flag objname, const char *txt1, const char *txt2, const char *txt3, lv_btnm_action_t action) //创建一个消息框 -{ - lv_obj_t *mbox = lv_mbox_create(displayObj[objname], nullptr); - lv_mbox_set_text(mbox, txt1); - static const char *btns[] = {txt2, txt3, ""}; /*Button description. '\221' lv_btnm like control char*/ - lv_mbox_add_btns(mbox, btns, nullptr); - lv_obj_set_width(mbox, 250); - lv_obj_align(mbox, displayObj[objname], LV_ALIGN_IN_LEFT_MID, 0, 20); /*Align to the corner*/ - lv_mbox_set_action(mbox, action); -} - -void UserDisplay::createExitBtn(obj_flag objname, const int x, const int y, const int width, const int high) //创建退出按钮 -{ - lv_obj_t *exitBtn = lv_btn_create(displayObj[objname], nullptr); - lv_obj_set_pos(exitBtn, x, y); - lv_obj_set_size(exitBtn, width, high); - lv_obj_t *exitLab = lv_label_create(exitBtn, nullptr); - lv_label_set_text(exitLab, "exit"); - lv_btn_set_action(exitBtn, LV_BTN_ACTION_CLICK, closeAction); -} -void UserDisplay::createSaveBtn(obj_flag objname, const int x, const int y, const int width, const int high) //创建退出按钮 -{ - lv_obj_t *saveBtn = lv_btn_create(displayObj[objname], nullptr); - lv_obj_set_pos(saveBtn, x, y); - lv_obj_set_size(saveBtn, width, high); - lv_obj_t *saveLab = lv_label_create(saveBtn, nullptr); - lv_label_set_text(saveLab, "save"); - lv_btn_set_action(saveBtn, LV_BTN_ACTION_CLICK, saveAction); - lv_obj_set_free_ptr(saveBtn, &_tempData); -} - -void UserDisplay::createResetBtn(obj_flag objname, const int x, const int y, const int width, const int high) -{ - //退出重制传感器按钮 - lv_obj_t *resetBtn = lv_btn_create(displayObj[objname], nullptr); - lv_obj_set_pos(resetBtn, x, y); - lv_obj_set_size(resetBtn, width, high); - lv_obj_t *resetLab = lv_label_create(resetBtn, nullptr); - lv_label_set_text(resetLab, "reset"); - lv_btn_set_action(resetBtn, LV_BTN_ACTION_CLICK, resetAction); -} - -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/userDisplay/visionPage.cpp b/src/ncrapi/userDisplay/visionPage.cpp deleted file mode 100644 index 115a87fd..00000000 --- a/src/ncrapi/userDisplay/visionPage.cpp +++ /dev/null @@ -1,21 +0,0 @@ - -#include "ncrapi/system/sysBase.hpp" -#include "ncrapi/userDisplay/userDisplay.hpp" -namespace ncrapi -{ -void UserDisplay::createVision(lv_obj_t *parent) -{ - - if (displayObj[OBJ_BTNM_SON] == nullptr) - displayObj[OBJ_BTNM_SON] = lv_tabview_create(parent, nullptr); - lv_obj_t *builtInSigTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "内置签名"); - - lv_obj_t *getSigTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "按数据0"); - lv_obj_t *getSizeTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "按数据1"); - lv_obj_t *getCodeTab = lv_tabview_add_tab(displayObj[OBJ_BTNM_SON], "按数据2"); - /*当选项卡按下后进行的操作*/ - - //退出按钮 - createExitBtn(OBJ_BTNM_SON); -} -} // namespace ncrapi \ No newline at end of file diff --git a/src/ncrapi/util/timer.cpp b/src/ncrapi/util/timer.cpp deleted file mode 100644 index ccccd5bc..00000000 --- a/src/ncrapi/util/timer.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @Author: 陈昱安 - * @Date: 2018-06-05T12:03:16+08:00 - * @Email: 31612534@qq.com - * @Last modified by: 陈昱安 - * @Last modified time: 2018-09-08T22:37:58+08:00 - */ - -#include "ncrapi/util/timer.hpp" -namespace ncrapi { - -Timer::Timer() : firstCalled(pros::millis()), lastCalled(0), mark(0), hardMark(-1), repeatMark(-1) {} - -/** - * 返回自上次调用此函数以来以ms为单位传递的时间。 - * @返回自上次调用此函数以来以ms为单位传递的时间。 - */ -uint32_t Timer::getDt() -{ - const uint32_t currTime = pros::millis(); - const uint32_t dt = currTime - lastCalled; - lastCalled = currTime; - return dt; -} -/** - * @返回当前时间 - * - * @return uint32_t 返回当前时间 - */ -uint32_t Timer::getNowTime() const -{ - return pros::millis(); -} - -/** - * 返回构造计时器的时间(以毫秒为单位)。 - * @返回构造计时器的时间(以毫秒为单位)。 - */ -uint32_t Timer::getStartingTime() const -{ - return firstCalled; //构造函数创建的时间 -} - -/** - * 返回自定时器构建以来以ms为单位传递的时间。 - * @返回自定时器构建以来以ms为单位传递的时间。 - */ -uint32_t Timer::getDtFromStart() const -{ - return pros::millis() - firstCalled; -} - -/** - * 放置时间标记。放置另一个标记将覆盖前一个标记 - * one - */ -void Timer::placeMark() -{ - mark = pros::millis(); -} - -/** - * 放置一个困难的时间标记。放置另一个硬标记不会覆盖前一个标记; - * 相反,clearHardMark()必须在另一个人被放置之前调用。 - */ -void Timer::placeHardMark() -{ - if (hardMark == -1) - hardMark = pros::millis(); -} - -/** - * 清除并返回当前的硬标记 - * @返回老的时间标记 - */ -uint32_t Timer::clearHardMark() -{ - const uint32_t old = hardMark; - hardMark = -1; - return old; -} - -/** - * 返回自标记放置以来的毫秒数。 - * @返回自标记放置以来的毫秒数。 - */ -uint32_t Timer::getDtFromMark() const -{ - return pros::millis() - mark; -} - -/** - *放置硬标记后,以毫秒为单位返回时间。 - * @放置硬标记后,以毫秒为单位返回时间。 - */ -uint32_t Timer::getDtFromHardMark() const -{ - return hardMark == -1 ? 0 : pros::millis() - hardMark; -} - -/** - * 当输入时间段已过时返回true,然后重置。意味着 - * 在循环中使用,以便在不阻塞的情况下运行许多毫秒的动作。 - * @param ms 毫秒 - * @return 当输入时间段通过时返回true,false后阅读真实,直到时间又过去了 - */ -bool Timer::repeat(uint32_t ms) -{ - if (repeatMark == -1) - repeatMark = pros::millis(); - if (pros::millis() - repeatMark >= ms) - { - repeatMark = -1; - return true; - } - return false; -} -} // namespace ncrapi \ No newline at end of file