Skip to content

Commit

Permalink
chore: 警告を増やし、警告発生時にエラーになるように変更 (#283)
Browse files Browse the repository at this point in the history
* chore: 警告を増やし、警告発生時にエラーになるように変更

* chore: 辞書ファイルを更新

* fix: mbedをビルドするときは警告をエラーにしない

* fix: mbed-osがビルドされる時は警告をエラーにしない

* fix: ビルドエラーを解消

* test: MSVCの警告を /Wall から /W4 に変更し、今まで出ていた警告を消した

* fix: 誤って設定ファイルを変更したものを戻した

* fix: clangの警告を抑制
  • Loading branch information
yutotnh authored Sep 16, 2023
1 parent 45f0748 commit 431c9f2
Show file tree
Hide file tree
Showing 15 changed files with 328 additions and 319 deletions.
1 change: 1 addition & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"USBRX",
"USBTX",
"vcpkg",
"Werror",
"Wextra",
"yutotnh"
],
Expand Down
13 changes: 8 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@ project(spirit

add_library(spirit STATIC)

if(MSVC)
target_compile_options(spirit PUBLIC /W4)
else()
target_compile_options(spirit PUBLIC -O2 -Wall -Wextra)
if(DEFINED MBED_PATH)
# mbed-os のビルドに影響を与えるため、最適化オプションを指定せず、警告をエラーにしない
target_compile_options(spirit PUBLIC -Wall -Wextra -pedantic)
elseif(MSVC)
target_compile_options(spirit PUBLIC /W4 /WX /utf-8)
else() # GCC or Clang
target_compile_options(spirit PUBLIC -O2 -Wall -Wextra -pedantic-errors -Werror)
endif()

target_include_directories(spirit
Expand Down Expand Up @@ -56,7 +59,7 @@ if(DEFINED MBED_PATH)
if(MSVC)
target_compile_options(spirit-platform-mbed PUBLIC /W4)
else()
target_compile_options(spirit-platform-mbed PUBLIC -O2 -Wall -Wextra)
target_compile_options(spirit-platform-mbed PUBLIC -Wall -Wextra -pedantic)
endif()

target_include_directories(spirit-platform-mbed
Expand Down
2 changes: 1 addition & 1 deletion src/spirit/include/Id.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ static constexpr uint32_t motor_prefix = 0x1;
static constexpr uint32_t motor_prefix_size = 2;

/// spiritでCANでモーター制御に使う場合に使うIDのDIPスイッチの最大ビット幅
static constexpr uint32_t dip_switch_size = 5;
static constexpr uint32_t dip_switch_width = 5;

/**
* @brief CAN通信時のモーターIDを取得する
Expand Down
230 changes: 115 additions & 115 deletions src/spirit/include/SpeedController.h
Original file line number Diff line number Diff line change
@@ -1,115 +1,115 @@
#ifndef SPIRIT_SPEED_CONTROLLER_H
#define SPIRIT_SPEED_CONTROLLER_H

#include <stdint.h>

#include "InterfaceInterruptIn.h"

namespace spirit {

class SpeedController {
public:
/**
* @brief コンストラクタ
* @param a_phase RotaryEncoder A phase pin
* @param b_phase RotaryEncoder B phase pin
*/
SpeedController(InterfaceInterruptIn& a_phase, InterfaceInterruptIn& b_phase);

/**
* @brief 目標rpsを与えると速度制御の計算結果を返す
* @param target_rps 速度制御の目標rps
* @param dt 制御周期(s)
*/
float calculation(float target_rps, float dt);

/**
* @brief 速度制御の計算結果にかける上限値と下限値を設定
* @param high_limit 速度制御の計算結果の最大値
* @param low_limit 速度制御の計算結果の最小値
*/
void limit(float high_limit, float low_limit);

/**
* @brief PID制御のゲイン係数を設定
* @param kp 比例ゲイン
* @param ki 積分ゲイン
* @param kd 微分ゲイン
* @retval false ゲイン変更なし
* @retval true ゲイン変更あり
*/
bool pid_gain(float kp, float ki, float kd);

/**
* @brief ロータリーエンコーダの計算値をリセット
*/
void reset();

/**
* @brief ロータリーエンコーダの角度を返す
*/
float angle();

/**
* @brief rpsを返す
* @return rps
*/
float rps();

private:
InterfaceInterruptIn& _a_phase;
InterfaceInterruptIn& _b_phase;

float _kp{0.0f};
float _ki{0.0f};
float _kd{0.0f};

static constexpr int _ppr{200};
static constexpr float _deg_unit{360.0f / _ppr / 4.0f};

int _angle_counter;

bool first_loop;

/// @note モータの最低回転速度によっては変更の余地あり(ppr=200で0.15[rps]以下が目安??)
static constexpr int _angle_buff_max{10};
int _angle_buff_index;
int _angle_buff[_angle_buff_max];

float _rps{0.00f};

float _sum_error;
float _delta_error;
float _last_error;

float _high_limit{0.00f};
float _low_limit{0.00f};

/**
* @brief rpsを算出して返す
* @param dt rps
* @return 算出されたrps
*/
float rps_calculation(float dt);

/**
* @brief 元の数値にリミッターをかける
* @param val 元の数値
* @return リミッターをかけた数値
*/
float limiter(float val);

/**
* @brief ロータリーエンコーダのA相が変化した際の処理を行う
*/
void a_phase_interrupt();

/**
* @brief ロータリーエンコーダのB相が変化した際の処理を行う
*/
void b_phase_interrupt();
};

} // namespace spirit

#endif // SPIRIT_SPEED_CONTROLLER_H
#ifndef SPIRIT_SPEED_CONTROLLER_H
#define SPIRIT_SPEED_CONTROLLER_H

#include <stdint.h>

#include "InterfaceInterruptIn.h"

namespace spirit {

class SpeedController {
public:
/**
* @brief コンストラクタ
* @param a_phase RotaryEncoder A phase pin
* @param b_phase RotaryEncoder B phase pin
*/
SpeedController(InterfaceInterruptIn& a_phase, InterfaceInterruptIn& b_phase);

/**
* @brief 目標rpsを与えると速度制御の計算結果を返す
* @param target_rps 速度制御の目標rps
* @param dt 制御周期(s)
*/
float calculation(float target_rps, float dt);

/**
* @brief 速度制御の計算結果にかける上限値と下限値を設定
* @param high_limit 速度制御の計算結果の最大値
* @param low_limit 速度制御の計算結果の最小値
*/
void limit(float high_limit, float low_limit);

/**
* @brief PID制御のゲイン係数を設定
* @param kp 比例ゲイン
* @param ki 積分ゲイン
* @param kd 微分ゲイン
* @retval false ゲイン変更なし
* @retval true ゲイン変更あり
*/
bool pid_gain(float kp, float ki, float kd);

/**
* @brief ロータリーエンコーダの計算値をリセット
*/
void reset();

/**
* @brief ロータリーエンコーダの角度を返す
*/
float angle();

/**
* @brief rpsを返す
* @return rps
*/
float rps();

private:
InterfaceInterruptIn& _a_phase;
InterfaceInterruptIn& _b_phase;

float _kp{0.0f};
float _ki{0.0f};
float _kd{0.0f};

static constexpr int _ppr{200};
static constexpr float _deg_unit{360.0f / _ppr / 4.0f};

int _angle_counter;

bool first_loop;

/// @note モータの最低回転速度によっては変更の余地あり(ppr=200で0.15[rps]以下が目安??)
static constexpr int _angle_buff_max{10};
int _angle_buff_index;
int _angle_buff[_angle_buff_max];

float _rps{0.00f};

float _sum_error;
float _delta_error;
float _last_error;

float _high_limit{0.00f};
float _low_limit{0.00f};

/**
* @brief rpsを算出して返す
* @param dt rps
* @return 算出されたrps
*/
float rps_calculation(float dt);

/**
* @brief 元の数値にリミッターをかける
* @param val 元の数値
* @return リミッターをかけた数値
*/
float limiter(float val);

/**
* @brief ロータリーエンコーダのA相が変化した際の処理を行う
*/
void a_phase_interrupt();

/**
* @brief ロータリーエンコーダのB相が変化した際の処理を行う
*/
void b_phase_interrupt();
};

} // namespace spirit

#endif // SPIRIT_SPEED_CONTROLLER_H
17 changes: 9 additions & 8 deletions src/spirit/src/Id.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@ namespace {

/**
* @brief DIPスイッチの値がビット幅を超えていないかチェックする
* @param dip_switch_size DIPスイッチの値
* @param value DIPスイッチの値
* @param width DIPスイッチのビット幅
* @retval true ビット幅を超えていない (正常)
* @retval false ビット幅を超えている (異常)
*/
bool dip_switch_is_valid(uint32_t dip_switch, std::size_t dip_switch_size)
bool dip_switch_is_valid(uint32_t value, std::size_t width)
{
// DIPスイッチの値がビット幅を超えていないかチェックする
// 例えば、DIPスイッチの値が0b1111で、ビット幅が3の場合、0b1111は3bitで表現できないため、エラーとする
return (dip_switch >> dip_switch_size) == 0;
return (value >> width) == 0;
}

/**
Expand Down Expand Up @@ -75,10 +76,10 @@ uint32_t get_motor_id(const uint32_t motor_count, const uint32_t motor, const ui
return 0;
}

if (!dip_switch_is_valid(dip_switch, dip_switch_size)) {
if (!dip_switch_is_valid(dip_switch, dip_switch_width)) {
Error::get_instance().warning(Error::Type::IllegalCombination, 0, __FILE__, __func__, __LINE__,
"DIP switch value (%d) exceeds maximum bit width (%d)", dip_switch,
dip_switch_size);
dip_switch_width);
return 0;
}

Expand All @@ -95,7 +96,7 @@ uint32_t get_motor_id(const uint32_t motor_count, const uint32_t motor, const ui
id |= 0x00 << (can_id_size - motor_prefix_size - motor_count_prefix_size);

// DIPスイッチの値をそのままIDに反映する
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - dip_switch_size);
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - dip_switch_width);

return id;
case 1:
Expand All @@ -106,7 +107,7 @@ uint32_t get_motor_id(const uint32_t motor_count, const uint32_t motor, const ui
id |= motor << (can_id_size - motor_prefix_size - motor_count_prefix_size - 1);

// DIPスイッチの値をそのままIDに反映する
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - 1 - dip_switch_size);
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - 1 - dip_switch_width);

return id;
case 2:
Expand All @@ -117,7 +118,7 @@ uint32_t get_motor_id(const uint32_t motor_count, const uint32_t motor, const ui
id |= motor << (can_id_size - motor_prefix_size - motor_count_prefix_size - 2);

// DIPスイッチの値をそのままIDに反映する
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - 2 - dip_switch_size);
id |= dip_switch << (can_id_size - motor_prefix_size - motor_count_prefix_size - 2 - dip_switch_width);

return id;
default:
Expand Down
2 changes: 1 addition & 1 deletion src/spirit/src/PwmDataConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ void PwmDataConverter::set_duty_cycle(const float duty_cycle, uint8_t* buffer) c
{
/// @todo デューティー比がマイナスを取ることはないため、その場合はエラーにする

const uint16_t duty_cycle_16bit = 65535 * duty_cycle; // 2^16 - 1 = 65535
const uint16_t duty_cycle_16bit = (uint16_t)(65535 * duty_cycle); // 2^16 - 1 = 65535
set_range_value(duty_cycle_16bit, 2, 16, 8, buffer);
}

Expand Down
Loading

0 comments on commit 431c9f2

Please sign in to comment.