#ifndef INC_STEPPER_H_
#define INC_STEPPER_H_

#include "main.h"
#include "delay_us.h"

#define STEPS_PER_REVOLUTION		4096
#define DIR_CW						0		// 시계 방향
#define DIR_CCW						1		// 반시계 방향

#define IN1_GPIO_Port				GPIOB
#define IN1_Pin						GPIO_PIN_1
#define IN2_GPIO_Port				GPIOB
#define IN2_Pin						GPIO_PIN_15
#define IN3_GPIO_Port				GPIOB
#define IN3_Pin						GPIO_PIN_14
#define IN4_GPIO_Port				GPIOB
#define IN4_Pin						GPIO_PIN_13

void stepMotor(uint8_t step);
void rotateSteps(uint16_t steps, uint8_t direction);
void rotateDegrees(uint16_t degrees, uint8_t direction);

#endif /* INC_STEPPER_H_ */
// stepper.c
#include "stepper.h"

// Stepper 회전을 위한 Half Step 방식 배열
static const uint8_t HALF_STEP_SEQ[8][4] = {
		{1, 0, 0, 0},
		{1, 1, 0, 0},
		{0, 1, 0, 0},
		{0, 1, 1, 0},
		{0, 0, 1, 0},
		{0, 0, 1, 1},
		{0, 0, 0, 1},
		{1, 0, 0, 1}
};

// Stepper 입력
void stepMotor(uint8_t step) {
	HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, HALF_STEP_SEQ[step][0]);
	HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, HALF_STEP_SEQ[step][1]);
	HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, HALF_STEP_SEQ[step][2]);
	HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, HALF_STEP_SEQ[step][3]);
}

// Stepper Step 단위 이동 함수
void rotateSteps(uint16_t steps, uint8_t direction) {
	for (uint16_t i = 0; i < steps; i++) {
		uint8_t step;
		if (direction == DIR_CW) {
			step = i % 8;			// 시계 방향
		}
		else {
			step = 7 - (i % 8);		// 반시계방향
		}
		stepMotor(step);
		delay_us(1000);
	}
}

// Stepper 각도 단위 이동 함수
void rotateDegrees(uint16_t degrees, uint8_t direction) {
	// 각도에 해당하는 Step 수 계산
	uint16_t steps = (uint16_t)((uint32_t)(degrees * STEPS_PER_REVOLUTION / 360));

	rotateSteps(steps, direction);
}