#pragma once
//ServoSupport.h
//copyright 2022 https://robot-creation-diary.com/
//20230320角度周りの整数値を100倍にした
#include <Wire.h>
#include "SerialSupport.h"
#include "WheelSupport.h"
#include <Adafruit_PWMServoDriver.h>
#define SERBO_NUMBER (18)//サーボの数
#define DATA_NUMBER (20)//車輪も含めた数
#define WEAKNESS_ANGLE (100000)
#define ANGLE_MAX (22000)
#define PWM_FREQ (50)
#define PULSE_LENGTH ((long)1000000/PWM_FREQ)
#define MG996R_SERVOMIN ((long)400 * (long)4096 / PULSE_LENGTH) // 最小パルス幅(μs)
#define MG996R_SERVOMAX ((long)2600 * (long)4096 / PULSE_LENGTH) // 最大パルス幅(μs)
#define UNWKNOW_SERVOMIN ((long)500 * (long)4096 / PULSE_LENGTH) // 最小パルス幅(μs)
#define UNWKNOW_SERVOMAX ((long)2500 * (long)4096 / PULSE_LENGTH) // 最大パルス幅(μs)
#define MS18_SERVOMIN ((long)550 * (long)4096 / PULSE_LENGTH) // 最小パルス幅(μs)
#define MS18_SERVOMAX ((long)2400 * (long)4096 / PULSE_LENGTH) // 最大パルス幅(μs)
class CServoSupport{
public:
CServoSupport();
~CServoSupport();
void Continue();
int GetRecievedDataSize(); //受信したデータの大きさを得る
void SetSerialDataSize( int dsize); //シリアル通信で使うデータの大きさを設定
unsigned char GetIndexRecievedData(int i ); //シリアル通信で得た指定位置のデータを得る
int SetRecievedData(unsigned char rdata); //シリアル通信で得たデータをサーボの角度データとして保存
int GetIndexServoAngle(unsigned int i); //指定番号のサーボデータを設定
void SetSerovoData(); //保存されたサーボデータを実際にサーボモータに設定する
void SetAllWeakness(); //すべてのサーボを脱力する。
void _SetWeakness(int i, Adafruit_PWMServoDriver &pwm1, Adafruit_PWMServoDriver &pwm2); //すべてのサーボを脱力する。
private:
CSerialSupport mRecievedData; //シリアル通信からデータの受け取り
int mServoAngles[DATA_NUMBER]; //各サーボの角度
int mPreServoAngles[DATA_NUMBER];// サーボの角度設定を何度も呼ばないようにするために
Adafruit_PWMServoDriver mpwm1;
Adafruit_PWMServoDriver mpwm2;
int mError;
};