# -*- coding: utf-8 -*-
"""
c01lib_ports.py  |  CORE-01 로봇2 하드웨어 대응표 (Port · 방향 · 각도)
배포 버전 1.6.3

대상 로봇 파일은 Book-CORE-01-SCRIPT(로봇2)입니다.
Book-CORE-01-CONTROLS(로봇1)는 이 라이브러리를 쓰지 않습니다.

로봇2의 부품이 어느 Port에 연결되어 있는지, 모터와 서보가 어느 방향으로
도는지, 조향과 화면이 몇 도까지 움직이는지를 이 파일 한곳에 모았습니다.
다른 c01lib_*.py 파일과 시작 파일는 이 값만 가져다 쓰고, Port 번호나
각도를 따로 적지 않습니다.

아래 값은 책과 함께 제공하는 로봇2에서 실제로 실행해 확인한 값입니다.
로봇을 직접 고쳐 만들어 부품 방향이 달라졌을 때만 바꿉니다.

[방향 보정은 이 파일에서만]
방향이 맞지 않을 때 키 배정을 바꾸거나 각도표를 하나씩 뒤집지 않습니다.
모터 방향은 FLIP_*_DRIVE, 조향 방향은 STEERING_SIGN_* 에서만 고칩니다.
같은 축을 두 곳에서 함께 뒤집으면 원래대로 돌아가 버리므로(중복 반전),
한 번에 한 축씩 바꾸고 다시 실행해 확인합니다.
"""

# ----------------------------------------------------------------
# 1. DC Motor (바퀴 구동) Port
# ----------------------------------------------------------------
PORT_FR_DRIVE = 1
PORT_RR_DRIVE = 2
PORT_RL_DRIVE = 3
PORT_FL_DRIVE = 4

# ----------------------------------------------------------------
# 2. Steering Servo (바퀴 조향) Port
# ----------------------------------------------------------------
PORT_FR_STEER = 5
PORT_RR_STEER = 6
PORT_RL_STEER = 7
PORT_FL_STEER = 8

# ----------------------------------------------------------------
# 3. 그 외 부품 Port
# ----------------------------------------------------------------
PORT_SCREEN_FOLD = 9    # 화면 펼침·접힘용 Screen-Fold Servo (Small)
PORT_TEXT_SCREEN = 10   # Text Screen
PORT_INPUT_LED = 0      # Input LED

# ----------------------------------------------------------------
# 4. 모터 장착 방향 보정 (MotorBase.flipped)
#    True 로 두면 시작할 때 그 모터에 flipped = True 를 적용합니다.
# ----------------------------------------------------------------
FLIP_FL_DRIVE = True   # 왼쪽 앞바퀴: 같은 명령에 반대로 회전
FLIP_FR_DRIVE = False
FLIP_RL_DRIVE = True   # 왼쪽 뒷바퀴: 같은 명령에 반대로 회전
FLIP_RR_DRIVE = False
# 이유: 네 바퀴에 모두 spin(+)을 보내면 차체가 제자리에서 돌고, 왼쪽에
# spin(-)·오른쪽에 spin(+)을 보내면 앞으로 갑니다. 좌우 모터가 서로 마주
# 보게 달려 있어 왼쪽만 회전 방향이 반대이기 때문입니다. 이 보정을 키
# 배정이 아니라 여기에서 해야 W·S·A·D·Q·E가 모두 이름대로 움직입니다.

FLIP_FL_STEER = False  # 조향 서보는 방향을 뒤집지 않고,
FLIP_FR_STEER = False  # 아래 STEERING_SIGN_* 으로 각도 부호를 맞춥니다.
FLIP_RL_STEER = False
FLIP_RR_STEER = False

# ----------------------------------------------------------------
# 5. 조향각 부호 보정
#    ServoMotor.spin_to_degrees(angle)은 양수 = CW, 음수 = CCW 입니다.
#    차체 기준 "오른쪽 +45도"가 서보의 어느 방향에 해당하는지는 서보를
#    어떻게 달았는지에 따라 달라지므로, 서보마다 +1 또는 -1을 둡니다.
# ----------------------------------------------------------------
STEERING_SIGN_FL = -1
STEERING_SIGN_FR = -1
STEERING_SIGN_RL = -1
STEERING_SIGN_RR = -1
# 이유: 이 로봇의 조향 서보는 양수 각도에서 바퀴가 왼쪽(반시계 방향)을
# 향합니다. 코드에서는 차체 기준 "오른쪽 = 양수"로 정했으므로 네 서보
# 모두 부호를 반대로 둡니다. 이 값이 맞지 않으면 Q를 눌렀을 때 바퀴가
# 10시가 아니라 2시 방향을 향합니다.

# ----------------------------------------------------------------
# 6. 조향각 제한 범위 (ServoMotor.limits_degrees, (ccw, cw) 순서)
#    대각선 이동과 제자리 회전에 45°가 필요하므로 여유를 두어 60°로
#    둡니다. 부품이 서로 부딪히면 이 값을 줄입니다.
# ----------------------------------------------------------------
STEERING_LIMIT_CCW_DEG = 60.0
STEERING_LIMIT_CW_DEG = 60.0

# ----------------------------------------------------------------
# 7. Screen-Fold Servo 목표 각도 (펼침 / 접힘)
# ----------------------------------------------------------------
SCREEN_FOLDED_DEG = 0.0      # 화면이 차체에 붙어 수납된 각도 (로봇을 불러온 직후 위치)
SCREEN_DEPLOYED_DEG = -90.0  # 화면이 차체 바깥쪽으로 펼쳐진 각도
# 이유: 0°에서 +90°로 보내면 화면이 차체 안쪽으로 움직입니다. 그래서
# 바깥쪽은 반대 방향인 -90°(CCW)입니다. 덜 펼쳐지면 -100, 너무 많이
# 펼쳐지면 -80처럼 조정합니다.

# 제한각은 (ccw, cw) 순서입니다. 펼침이 CCW 방향(-90°)이므로 CCW 쪽을
# 넓게, 차체 안쪽인 CW 쪽은 좁게 둡니다. SCREEN_DEPLOYED_DEG를 -100보다
# 더 크게 바꿀 때는 SCREEN_FOLD_LIMIT_CCW_DEG도 그보다 크게 맞춥니다.
SCREEN_FOLD_LIMIT_CCW_DEG = 100.0  # 바깥쪽(펼침) 허용 범위
SCREEN_FOLD_LIMIT_CW_DEG = 10.0    # 안쪽(차체 방향) 허용 범위

# ----------------------------------------------------------------
# 8. Text Screen 표시 한계
#    기본 글자 크기에서 한 줄에 약 9자, 4줄까지 보입니다. 그보다 길면
#    줄이 꺾이거나 아래 줄이 화면 밖으로 밀려납니다. 시작 파일의
#    TEXT_SCREEN_FONT_SIZE로 글자 크기를 바꾸면 이 한계도 달라집니다.
# ----------------------------------------------------------------
SCREEN_MAX_CHARS = 9
SCREEN_MAX_LINES = 4
