/*
 * ****************************************************
 * @file    : flash.h
 * @brief   : Flash Header
 * @author  : HSW / WESPION
 * @data    : 2025. 05. 06
 * ****************************************************
 */
#ifndef __FLASH_H_
#define __FLASH_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"
#include "WESPION.h"
#include "WESPION_Def.h"

//////////////////    Compiling Options   ////////////////////

/////////////////   COSTANT Declarations  ///////////////////

#define EEPROM  __attribute__((section(".1st_Secter"))) const
#define BACKUP  __attribute__((section(".2nd_Secter"))) const
//#define EEPROM  __attribute__((section(".1st_Secter")))
//#define BACKUP  __attribute__((section(".2nd_Secter")))

#define FLASH_ORIGIN_SECTOR   FLASH_SECTOR_2
#define FLASH_BACKUP_SECTOR   FLASH_SECTOR_3

#define SECTOR_SIZE           0x4000        //16KB
#define FLASH_VALID_CODE      0x12345678


/////////////////    System Constants    ////////////////////
#define HW_MODEL                        0x01    //RoomFit
//#define HW_VER                        3       //in main.h

//  아래 3개는 이제 사용 안할 예정 -> 다른 걸로 활용하기!! (25.05.03)
#define VER_MAJER                       0x01
#define VER_MINER                       0x00    //  12
#define VER_SUB                         0x01    //

#define VER_YEAR                        2025
#define VER_MONTH                       0x06
#define VER_DATE                        0x30    //
// 위의 6개는 여기서 수정해봐야 아무 의미 없음 -> Initialize_WESPION()에서 수정해야 함!

#define MOTOR_PARA_POLE                 10     // BS10510               //uint8_t
//#define MOTOR_PARA_POLE                 8      // JKONG                 //uint8_t
#define MOTOR_PARA_Ld                   0.0f
#define MOTOR_PARA_Lq                   0.0f
#define MOTOR_PARA_Rs                   0.0f
#define MOTOR_PARA_PhaiF                (72.2f * 0.001f * MT_1_OVR_SQ3)     //  BS10510
//#define MOTOR_PARA_PhaiF                (25.3f * 0.001f * MT_1_OVR_SQ3)   //  JKONG

#define MOTOR_GAINCURD_Kp               1.0f
#define MOTOR_GAINCURD_Ki               0.011f
#define MOTOR_GAINCURD_Kaw              (1.0f/MOTOR_GAINCURD_Kp)
#define MOTOR_GAINCURQ_Kp               1.0f
#define MOTOR_GAINCURQ_Ki               0.011f
#define MOTOR_GAINCURQ_Kaw              (1.0f/MOTOR_GAINCURQ_Kp)

#define MOTOR_GAINSPD_Kp                0.0022f
#define MOTOR_GAINSPD_Ki                0.00001f
#define MOTOR_GAINSPD_Kaw               (1.0f/MOTOR_GAINSPD_Kp)

#define MOTOR_GAINFWEAK_Kp              2.0f
#define MOTOR_GAINFWEAK_Ki              0.002f

#define MOTOR_ANG_ENCPULSE              (4096*4)//  BS10510 - TLE5012B    //uint16_t
//#define MOTOR_ANG_ENCPULSE              (1000*4)//  JKONG                 //uint16_t
#define MOTOR_ANG_ANGLESCALE            (360.0f/(float)MOTOR_ANG_ENCPULSE)
#define MOTOR_ANG_SPEEDSCALE            (1000.0f*60.0f/MOTOR_ANG_ENCPULSE)

  //  ENCORDER

//  양산 #000 - 에러테스트
//  #define MOTOR1_ANG_ANGLEELCOFFSET        90.0f
//  #define MOTOR2_ANG_ANGLEELCOFFSET       256.0f
//  양산 #001
//#define MOTOR1_ANG_ANGLEELCOFFSET       313.0f    // Mtr#1-1  25.05.07
//#define MOTOR2_ANG_ANGLEELCOFFSET       338.0f    // Mtr#1-2  25.05.07
//  양산 #002
//#define MOTOR1_ANG_ANGLEELCOFFSET       338.0f    // Mtr#1-3  25.05.07
//#define MOTOR2_ANG_ANGLEELCOFFSET        60.0f    // Mtr#1-2  25.05.07
//  양산 #003
//#define MOTOR1_ANG_ANGLEELCOFFSET         278.0f    // Mtr#11-3  25.05.07
//#define MOTOR2_ANG_ANGLEELCOFFSET         123.0f    // Mtr#1-2  25.05.07
//  양산 #004  - 25.05.08
//#define MOTOR1_ANG_ANGLEELCOFFSET         152.0f    // Mtr#26-3
//#define MOTOR2_ANG_ANGLEELCOFFSET          17.0f    // Mtr#26-4
//  양산 #005  - 25.05.08
//#define MOTOR1_ANG_ANGLEELCOFFSET         155.0f    // Mtr#36-1
//#define MOTOR2_ANG_ANGLEELCOFFSET         234.0f    // Mtr#36-2
////  양산 #006  - 25.05.08
//#define MOTOR1_ANG_ANGLEELCOFFSET          92.0f    // Mtr#21-1
//#define MOTOR2_ANG_ANGLEELCOFFSET         207.0f    // Mtr#21-2
////  양산 #007  - 25.05.08
//#define MOTOR1_ANG_ANGLEELCOFFSET           8.0f    // Mtr#21-3
//#define MOTOR2_ANG_ANGLEELCOFFSET         260.0f    // Mtr#21-4
////  양산 #008  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET            32.0f    // Mtr#36-3
//#define MOTOR2_ANG_ANGLEELCOFFSET           328.0f    // Mtr#36-4
////  양산 #009  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET             5.0f    // Mtr#51-1
//#define MOTOR2_ANG_ANGLEELCOFFSET           195.0f    // Mtr#51-2
////  양산 #010  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET             248.0f    // Mtr#46-1
//#define MOTOR2_ANG_ANGLEELCOFFSET             192.0f    // Mtr#46-2
////  양산 #011  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET            16.0f    // Mtr#46-3
//#define MOTOR2_ANG_ANGLEELCOFFSET            68.0f    // Mtr#46-4
////  양산 #012  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET            306.0f    // Mtr#71-1
//#define MOTOR2_ANG_ANGLEELCOFFSET            311.0f    // Mtr#71-2
////  양산 #013  - 25.05.09
//#define MOTOR1_ANG_ANGLEELCOFFSET             294.0f    // Mtr#71-3
//#define MOTOR2_ANG_ANGLEELCOFFSET              36.0f    // Mtr#71-4
//  양산 #014  - 25.05.14
//#define MOTOR1_ANG_ANGLEELCOFFSET             331.0f    // Mtr#61-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              14.0f    // Mtr#7-2
//  양산 #015  - 25.05.14
//#define MOTOR1_ANG_ANGLEELCOFFSET               75.0f    // Mtr#2-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              330.0f    // Mtr#2-4
//  양산 #016  - 25.05.14
//#define MOTOR1_ANG_ANGLEELCOFFSET               25.0f    // Mtr#3-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              185.0f    // Mtr#3-2
////  양산 #017  - 25.05.14
//#define MOTOR1_ANG_ANGLEELCOFFSET               188.0f    // Mtr#3-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               235.0f    // Mtr#3-4
//  양산 #018  - 25.05.14
//#define MOTOR1_ANG_ANGLEELCOFFSET                 189.0f    // Mtr#4-1
//#define MOTOR2_ANG_ANGLEELCOFFSET                 241.0f    // Mtr#4-2
//  양산 #019  - 25.05.15
//#define MOTOR1_ANG_ANGLEELCOFFSET               138.0f    // Mtr#5-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               255.0f    // Mtr#5-4
//  양산 #020  - 25.05.15
//#define MOTOR1_ANG_ANGLEELCOFFSET               286.0f    // Mtr#6-3
//#define MOTOR2_ANG_ANGLEELCOFFSET                92.0f    // Mtr#6-4
//  양산 #021  - 25.05.15
//#define MOTOR1_ANG_ANGLEELCOFFSET               318.0f    // Mtr#7-1
//#define MOTOR2_ANG_ANGLEELCOFFSET               228.0f    // Mtr#61-2
////  양산 #022  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               66.0f    // Mtr#7-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               76.0f    // Mtr#7-4
////  양산 #023  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               358.0f    // Mtr#8-1
//#define MOTOR2_ANG_ANGLEELCOFFSET               150.0f    // Mtr#8-2
////  양산 #024  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               77.0f    // Mtr#9-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              243.0f    // Mtr#9-2
////  양산 #025  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               28.0f    // Mtr#9-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               10.0f    // Mtr#9-4
////  양산 #026  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               171.0f    // Mtr#10-1
//#define MOTOR2_ANG_ANGLEELCOFFSET               229.0f    // Mtr#10-2
////  양산 #027  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               285.0f    // Mtr#10-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               105.0f    // Mtr#10-4
////  양산 #028  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               343.0f    // Mtr#12-1
//#define MOTOR2_ANG_ANGLEELCOFFSET               228.0f    // Mtr#61-2
////  양산 #029  - 25.05.19
//#define MOTOR1_ANG_ANGLEELCOFFSET               305.0f    // Mtr#12-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               295.0f    // Mtr#12-4
////  양산 (내부용 예정) #030  - 25.05.
//#define MOTOR1_ANG_ANGLEELCOFFSET               0.0f    // Mtr#
//#define MOTOR2_ANG_ANGLEELCOFFSET               0.0f    // Mtr#
//  양산 #031  - 25.05.22
//#define MOTOR1_ANG_ANGLEELCOFFSET               140.0f    // Mtr#14-1
//#define MOTOR2_ANG_ANGLEELCOFFSET               110.0f    // Mtr#14-2
//  양산 #032  - 25.05.22
//#define MOTOR1_ANG_ANGLEELCOFFSET               280.0f    // Mtr#14-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               105.0f    // Mtr#14-4
//  양산 #033  - 25.05.22
//#define MOTOR1_ANG_ANGLEELCOFFSET               300.0f    // Mtr#15-1
//#define MOTOR2_ANG_ANGLEELCOFFSET                 1.0f    // Mtr#15-2
//  양산 #034  - 25.05.22
//#define MOTOR1_ANG_ANGLEELCOFFSET               78.0f    // Mtr#15-3
//#define MOTOR2_ANG_ANGLEELCOFFSET              195.0f    // Mtr#15-4
//  양산 #035  - 25.05.23
//#define MOTOR1_ANG_ANGLEELCOFFSET              90.0f    // Mtr#16-3
//#define MOTOR2_ANG_ANGLEELCOFFSET             222.0f    // Mtr#16-4
//  양산 #036  - 25.05.23
//#define MOTOR1_ANG_ANGLEELCOFFSET              25.0f    // Mtr#17-1
//#define MOTOR2_ANG_ANGLEELCOFFSET             270.0f    // Mtr#17-2
//  양산 #037  - 25.05.23
//#define MOTOR1_ANG_ANGLEELCOFFSET              281.0f    // Mtr#17-3
//#define MOTOR2_ANG_ANGLEELCOFFSET               52.0f    // Mtr#17-4
//  양산 #038  - 25.05.23
//#define MOTOR1_ANG_ANGLEELCOFFSET              95.0f    // Mtr#18-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              92.0f    // Mtr#18-2
//  양산 #039  - 25.05.26
//#define MOTOR1_ANG_ANGLEELCOFFSET              235.0f    // Mtr#19-1
//#define MOTOR2_ANG_ANGLEELCOFFSET              356.0f    // Mtr#19-2
//  양산 #040  - 25.05.26
//  #define MOTOR1_ANG_ANGLEELCOFFSET              113.0f    // Mtr#20-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              148.0f    // Mtr#20-2
//  양산 #041  - 25.05.26
//  #define MOTOR1_ANG_ANGLEELCOFFSET              356.0f    // Mtr#20-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET               50.0f    // Mtr#20-4
//  양산 #042  - 25.05.26
//  #define MOTOR1_ANG_ANGLEELCOFFSET              182.0f    // Mtr#22-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET               75.0f    // Mtr#22-2
//  양산 #043  - 25.05.27
//  #define MOTOR1_ANG_ANGLEELCOFFSET              97.0f    // Mtr#23-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              91.0f    // Mtr#23-2
//  양산 #044  - 25.05.27
//  #define MOTOR1_ANG_ANGLEELCOFFSET              312.0f    // Mtr#23-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET               13.0f    // Mtr#23-4
//  양산 #045  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              308.0f    // Mtr#25-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              246.0f    // Mtr#25-2
//  양산 #046  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              143.0f    // Mtr#24-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET                6.0f    // Mtr#24-2
//  양산 #047  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              56.0f    // Mtr#27-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET             265.0f    // Mtr#27-4
//  양산 #048  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              72.0f    // Mtr#28-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET             174.0f    // Mtr#28-4
//  양산 #049  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              173.0f    // Mtr#28-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              261.0f    // Mtr#28-2
//  양산 #050  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET                7.0f    // Mtr#29-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              267.0f    // Mtr#29-2
//  양산 #051  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              325.0f    // Mtr#30-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              190.0f    // Mtr#30-2
//  양산 #052  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              166.0f    // Mtr#29-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              120.0f    // Mtr#29-4
//  양산 #053  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              188.0f    // Mtr#31-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              139.0f    // Mtr#31-2
//  양산 #054  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              355.0f    // Mtr#32-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              100.0f    // Mtr#32-2
//  양산 #055  - 25.05.28
//  #define MOTOR1_ANG_ANGLEELCOFFSET              118.0f    // Mtr#31-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              308.0f    // Mtr#31-4
  //  양산 #000B (내부용)  - 25.05.30
//    #define MOTOR1_ANG_ANGLEELCOFFSET              118.0f    // Mtr#33-2
//    #define MOTOR2_ANG_ANGLEELCOFFSET              143.0f    // Mtr#33-3

//  양산 #056  - 25.06.03
//  #define MOTOR1_ANG_ANGLEELCOFFSET              270.0f    // Mtr#33-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET               14.0f    // Mtr#34-2
//  양산 #057  - 25.06.03
//  #define MOTOR1_ANG_ANGLEELCOFFSET              340.0f    // Mtr#34-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              348.0f    // Mtr#34-4
//  양산 #058  - 25.06.03
//  #define MOTOR1_ANG_ANGLEELCOFFSET                4.0f    // Mtr#35-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              270.0f    // Mtr#35-4
//  양산 #059  - 25.06.03
//  #define MOTOR1_ANG_ANGLEELCOFFSET              155.0f    // Mtr#35-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              331.0f    // Mtr#35-2
//  양산 #060  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              70.0f    // Mtr#37-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET             357.0f    // Mtr#37-2
//  양산 #061  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              112.0f    // Mtr#37-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              233.0f    // Mtr#37-4
//  양산 #062  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              332.0f    // Mtr#38-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              275.0f    // Mtr#38-2
//  양산 #063  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              65.0f    // Mtr#38-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              55.0f    // Mtr#38-4
//  양산 #064  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              308.0f    // Mtr#39-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              270.0f    // Mtr#39-2
//  양산 #065  - 25.06.04
//  #define MOTOR1_ANG_ANGLEELCOFFSET              120.0f    // Mtr#39-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              165.0f    // Mtr#39-4
//  양산 #066  - 25.06.05
//  #define MOTOR1_ANG_ANGLEELCOFFSET              67.0f    // Mtr#40-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET             268.0f    // Mtr#40-3
//  양산 #067  - 25.06.09
//  #define MOTOR1_ANG_ANGLEELCOFFSET              15.0f    // Mtr#40-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET             171.0f    // Mtr#41-1
//  양산 #068  - 25.06.09
//  #define MOTOR1_ANG_ANGLEELCOFFSET              341.0f    // Mtr#41-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET               48.0f    // Mtr#42-1
//  양산 #069  - 25.06.09
//  #define MOTOR1_ANG_ANGLEELCOFFSET              341.0f    // Mtr#42-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              168.0f    // Mtr#42-4
//  양산 #070  - 25.06.09
//  #define MOTOR1_ANG_ANGLEELCOFFSET              98.0f    // Mtr#43-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET             352.0f    // Mtr#43-3
//  양산 #071  - 25.06.10
//  #define MOTOR1_ANG_ANGLEELCOFFSET              58.0f    // Mtr#43-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET             182.0f    // Mtr#44-1
//  양산 #072  - 25.06.10
//  #define MOTOR1_ANG_ANGLEELCOFFSET              176.0f    // Mtr#44-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET              172.0f    // Mtr#44-3
//  양산 #073  - 25.06.10
//  #define MOTOR1_ANG_ANGLEELCOFFSET              177.0f    // Mtr#44-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              255.0f    // Mtr#45-1
//  양산 #074  - 25.06.10
//  #define MOTOR1_ANG_ANGLEELCOFFSET              83.0f    // Mtr#45-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET             315.0f    // Mtr#45-3
//  양산 #075  - 25.06.11
//  #define MOTOR1_ANG_ANGLEELCOFFSET              75.0f    // Mtr#45-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              10.0f    // Mtr#47-1
//  양산 #076  - 25.06.11
//  #define MOTOR1_ANG_ANGLEELCOFFSET              283.0f    // Mtr#47-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET              291.0f    // Mtr#47-4
//  양산 #077  - 25.06.11
//  #define MOTOR1_ANG_ANGLEELCOFFSET              213.0f    // Mtr#48-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET              243.0f    // Mtr#48-3
//  양산 #078  - 25.06.11
//  #define MOTOR1_ANG_ANGLEELCOFFSET               62.0f    // Mtr#48-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              331.0f    // Mtr#49-3
//  양산 #079  - 25.06.12
//  #define MOTOR1_ANG_ANGLEELCOFFSET              28.0f    // Mtr#49-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET             160.0f    // Mtr#50-2
//  양산 #080  - 25.06.12
//  #define MOTOR1_ANG_ANGLEELCOFFSET              209.0f    // Mtr#50-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              250.0f    // Mtr#50-4
//  양산 #081  - 25.06.12
//  #define MOTOR1_ANG_ANGLEELCOFFSET              96.0f    // Mtr#52-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              70.0f    // Mtr#52-4
//  양산 #082  - 25.06.12
//  #define MOTOR1_ANG_ANGLEELCOFFSET              115.0f    // Mtr#53-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              236.0f    // Mtr#53-2
//  양산 #083  - 25.06.12
//  #define MOTOR1_ANG_ANGLEELCOFFSET              280.0f    // Mtr#53-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              202.0f    // Mtr#53-4
//  양산 #084  - 25.06.13
//  #define MOTOR1_ANG_ANGLEELCOFFSET              314.0f    // Mtr#13-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              210.0f    // Mtr#40-3
//  양산 #085  - 25.06.13
//  #define MOTOR1_ANG_ANGLEELCOFFSET              88.0f    // Mtr#54-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET             133.0f    // Mtr#54-2
//  양산 #086  - 25.06.13
//  #define MOTOR1_ANG_ANGLEELCOFFSET              42.0f    // Mtr#54-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              41.0f    // Mtr#54-3
//  양산 #087  - 25.06.13
//  #define MOTOR1_ANG_ANGLEELCOFFSET              221.0f    // Mtr#25-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              305.0f    // Mtr#51-4
//  양산 #088  - 25.06.13
//  #define MOTOR1_ANG_ANGLEELCOFFSET               13.0f    // Mtr#55-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              179.0f    // Mtr#55-2
//  양산 #089  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              293.0f    // Mtr#4-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET               22.0f    // Mtr#5-1
//  양산 #090  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              198.0f    // Mtr#56-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              358.0f    // Mtr#56-2
//  양산 #091  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              133.0f    // Mtr#19-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              118.0f    // Mtr#22-4
//  양산 #092  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              270.0f    // Mtr#6-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET               43.0f    // Mtr#13-1
//  양산 #093  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              291.0f    // Mtr#57-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET               97.0f    // Mtr#57-2
//  양산 #094  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              80.0f    // Mtr#57-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET             127.0f    // Mtr#57-4
//  양산 #095  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              32.0f    // Mtr#58-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET             240.0f    // Mtr#58-2
//  양산 #096  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              152.0f    // Mtr#58-3
//  #define MOTOR2_ANG_ANGLEELCOFFSET              174.0f    // Mtr#58-4
//  양산 #097  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              352.0f    // Mtr#24-4
//  #define MOTOR2_ANG_ANGLEELCOFFSET              183.0f    // Mtr#56-4
//  양산 #098  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET               87.0f    // Mtr#59-1
//  #define MOTOR2_ANG_ANGLEELCOFFSET              158.0f    // Mtr#59-2
//  양산 #099  - 25.06.15
//  #define MOTOR1_ANG_ANGLEELCOFFSET              272.0f    // Mtr#26-2
//  #define MOTOR2_ANG_ANGLEELCOFFSET              325.0f    // Mtr#59-3

//  RF1#000A (250702 체크)
#define MOTOR1_ANG_ANGLEELCOFFSET       90.0f    // Mtr#61-4
#define MOTOR2_ANG_ANGLEELCOFFSET      256.0f    // Mtr#61-3
//  양산 테스트#1 25.04.21
//#define MOTOR1_ANG_ANGLEELCOFFSET       69.0f    // 25.04.21
//#define MOTOR2_ANG_ANGLEELCOFFSET       10.0f    // 25.04.21
  //  BS10510 - check every re-assemble of sensor
  //    SPX25 - 25.03.26
//#define MOTOR1_ANG_ANGLEELCOFFSET       246.0f    // 25.03.26
//#define MOTOR2_ANG_ANGLEELCOFFSET       223.0f    // 25.03.26
  //    최종 목업 - 25.03.25
//#define MOTOR1_ANG_ANGLEELCOFFSET       108.0f    // 25.03.25
//#define MOTOR2_ANG_ANGLEELCOFFSET       112.0f    // 25.03.25
  //  PT4B-Sample - 25.02.29
//#define MOTOR1_ANG_ANGLEELCOFFSET       183.0f    //
//#define MOTOR2_ANG_ANGLEELCOFFSET        20.0f    //
  //  SPOEX#1 (white)
//#define MOTOR1_ANG_ANGLEELCOFFSET       345.0f    // 24.09.23 - Motor#6
//#define MOTOR2_ANG_ANGLEELCOFFSET       330.0f    // 24.09.26 - Motor#7
//  SPOEX#2 (black) - 24.02.21
//#define MOTOR1_ANG_ANGLEELCOFFSET       186.0f    // 24.02.21 - Motor#2
//#define MOTOR2_ANG_ANGLEELCOFFSET        53.0f    // 24.12.13 - Motor#3
  //  SPOEX#3 (naked) - 24.05.03
//#define MOTOR1_ANG_ANGLEELCOFFSET       180.0f    // Motor#5
//#define MOTOR2_ANG_ANGLEELCOFFSET       120.0f    // Motor#3 ??
  //  PT6KC - 24.06.08
//#define MOTOR1_ANG_ANGLEELCOFFSET       132.0f    // MotorV3#1
//#define MOTOR2_ANG_ANGLEELCOFFSET       185.0f    // MotorV3#1 on Inv2
//#define MOTOR2_ANG_ANGLEELCOFFSET       000.0f    // MotorV3#2
//  MR
#define MOTOR_ANG_MR_MAX_SIN            0                               //uint16_t
#define MOTOR_ANG_MR_MAX_COS            0                               //uint16_t
#define MOTOR_ANG_MR_MIN_SIN            4095                            //uint16_t
#define MOTOR_ANG_MR_MIN_COS            4095                            //uint16_t
#define MOTOR_ANG_MR_MID_SIN            0                               //uint16_t
#define MOTOR_ANG_MR_MID_COS            0                               //uint16_t
#define MOTOR_ANG_MR_GAIN_SIN           1.0f
#define MOTOR_ANG_MR_GAIN_COS           1.0f

#define INV_PARA_HWADCSCALE             (3.3f/4095.0f)
#define INV_PARA_HWVDCSCALE             (1.0f/(30.0f+1.0f))
#define INV_PARA_HWISCALE               (0.002f*15.0f/1.0f)

#if   defined(TIM_8KHZ)
  #define INV_PARA_TSAMP                (1.0f/8000.0f)
#elif defined(TIM_10KHZ)
  #define INV_PARA_TSAMP                (1.0f/10000.0f)
#elif defined(TIM_16KHZ)
  #define INV_PARA_TSAMP                (1.0f/16000.0f)
#elif defined(TIM_20KHZ)
  #define INV_PARA_TSAMP                (1.0f/20000.0f)
#else
  #define INV_PARA_TSAMP                (1.0f/10000.0f)
#endif

#define INV_PARA_PWM_MAX                TIM_PERIOD
#define INV_PARA_PWM_MID                ((TIM_PERIOD+1)>>1)
#define INV_PARA_VDCMARGIN              0.90f      // original 0.90f (HSW 24.02.21)

#define LPFVDC_FC                       1000.0f
#define LPFVDC_FS                       (1.0f/INV_PARA_TSAMP)

#define LPFCUR_FC                       10.0f
#define LPFCUR_FS                       (1.0f/INV_PARA_TSAMP)

#define LPFSPD_FC                       100.0f
#define LPFSPD_FS                       1000.0f

#define ERRREF_ISENSOROPEN              3908.0f
#define ERRREF_ISENSORSHORT             186.0f
#define ERRREF_OVERCURRENT              35.0f      // original 30.0 (HSW 24.02.21)
#define ERRREF_OVERSPEED                8000.0f    // original 4000 (HSW 24.02.21)
#define ERRREF_OVERVOLTAGE              70.0
#define ERRREF_UNDERVOLTAGE             30.0
#define ERRREF_ISENSOROFFSETMAX         (2048.0f+50.0f)
#define ERRREF_ISENSOROFFSETMIN         (2048.0f-50.0f)

#define INV_CTRL_VDCLIMFWEAK            49.0f
#define INV_CTRL_ILIMFWEAK              (ERRREF_OVERCURRENT*0.8f)

#define MOTOR_ANG_RPMLIM                (ERRREF_OVERSPEED*0.8f)
#define MOTOR_ANG_SPDCTRLOUTLIM         (ERRREF_OVERCURRENT*0.8f)

#define MACHINE_SENSOR_GEAR_RATIO       3.0f
#define MACHINE_SPOOL_DIAMETER          60.0f         // [mm]
#define MACHINE_MAX_WEIGHT              30.0f         // [kg]인데 현재는 A, 테스트 안전을 위해 막아둠
#define MACHINE_CABLE_MAX_LENGTH        2650          // [mm]
#define MACHINE_SCALE_WEIGHT2CURRENT    0.5f          // [kg/A] -> C샘플, BS-105-10 기준 약 2
#define MACHINE_SOFT_WINDING_HEIGHT     20            // [mm]

#define MACHINE_DEFAULT_WEIGHT          1.0           // [A]
#define MACHINE_FRICTION_WEIGHT         0.45          // [A]
#define MACHINE_FRICTION_SPEED_PLUS     (-20.0f)
#define MACHINE_FRICTION_SPEED_MINUS    90.0f

#define DFU_Status                      DFU_STATUS_FACTORY      // Flash 초기상태를 의도한 값. 참고용

/////////////////   Structure Declarations  ///////////////////


typedef struct {
  uint8_t model[2];                     //0x0000
  uint8_t VerMajer;
  uint8_t VerMiner;

  uint16_t VerYear;                     //0x0004
  uint8_t VerMonth;
  uint8_t VerDate;

  uint8_t Motor_Para_Pole;              //0x0008
  uint8_t VerSub;                       ///somebp 2024.02.07
  uint16_t Motor_Ang_EncPulse;

  float Motor_Para_Ld;                  //0x000C
  float Motor_Para_Lq;                  //0x0010
  float Motor_Para_Rs;                  //0x0014
  float Motor_Para_Phaif;               //0x0018

  float Motor_GainCurD_Kp;              //0x001C
  float Motor_GainCurD_Ki;              //0x0020
  float Motor_GainCurD_Kaw;             //0x0024
  float Motor_GainCurQ_Kp;              //0x0028
  float Motor_GainCurQ_Ki;              //0x002C
  float Motor_GainCurQ_Kaw;             //0x0030

  float Motor_GainSpd_Kp;               //0x0034
  float Motor_GainSpd_Ki;               //0x0038
  float Motor_Gainspd_Kaw;              //0x003C

  float Motor_GainFweak_Kp;             //0x0040
  float Motor_GainFweak_Ki;             //0x0044

  float Motor_Ang_AngleScale;           //0x0048
  float Motor_Ang_SpeedScale;           //0x004C
  float Motor1_Ang_AngleElecOffset;     //0x0050
  float Motor2_Ang_AngleElecOffset;     //0x0054

  uint16_t Motor_Ang_MR_Max_Sin;        //0x0058
  uint16_t Motor_Ang_MR_Max_Cos;
  uint16_t Motor_Ang_MR_Min_Sin;        //0x005C
  uint16_t Motor_Ang_MR_Min_Cos;
  uint16_t Motor_Ang_MR_Mid_Sin;        //0x0060
  uint16_t Motor_Ang_MR_Mid_Cos;
  float Motor_Ang_MR_Gain_Sin;          //0x0064
  float Motor_Ang_MR_Gain_Cos;          //0x0068

  float Inv_Para_HwAdcScale;            //0x006C
  float Inv_Para_HwVdcScale;            //0x0070
  float Inv_Para_HwiScale;              //0x0074

  float Inv_Para_Tsamp;                 //0x0078

  float Inv_Para_PWM_Max;               //0x007C
  float Inv_Para_PWM_Mid;               //0x0080
  float Inv_Para_VdcMargin;             //0x0084

  float LPFVdc_fc;                      //0x0088
  float LPFVdc_fs;                      //0x008C

  float LPFCur_fc;                      //0x0090
  float LPFCur_fs;                      //0x0094

  float LPFSpd_fc;                      //0x0098
  float LPFSpd_fs;                      //0x009C

  float ErrRef_IsensorOpen;             //0x00A0
  float ErrRef_IsensorShort;            //0x00A4
  float ErrRef_OverCurrent;             //0x00A8
  float ErrRef_OverSpeed;               //0x00AC
  float ErrRef_OverVoltage;             //0x00B0
  float ErrRef_UnderVoltage;            //0x00B4
  float ErrRef_IsensorOffsetMax;        //0x00B8
  float ErrRef_IsensorOffsetMin;        //0x00BC

  float Inv_Ctrl_VdcLimFweak;           //0x00C0
  float Inv_Ctrl_IlimFweak;             //0x00C4

  float Motor_Ang_RpmLim;               //0x00C8
  float Motor_Ang_SpdCtrlOutLim;        //0x00CC

  float Machine_SensorGearRatio;        //0x00D0
  float Machine_SpoolDiameter;          //0x00D4
  float Machine_MaxWeight;              //0x00D8
  float Machine_CableMaxLength;         //0x00DC
  float Machine_Scale_Weight2Current;   //0x00E0
  float Machine_SoftWindingHeight;      //0x00E4

  float Machine_DefaultWeight;          //0x00E8
  float Machine_FrictionWeight;         //0x00EC
  float Machine_FrictionSpeedPlus;      //0x00F0
  float Machine_FrictionSpeedMinus;     //0x00F4

  uint32_t DFU_Status;                  //0x00F8    (25.05.06 HSW)

  uint32_t check;   //FLASH_VALID_CODE  //0x00FC
} Data_Form_RAM;

typedef struct {
  uint8_t model[2];                     //0x0000
  uint8_t VerMajer;
  uint8_t VerMiner;

  uint16_t VerYear;                     //0x0004
  uint8_t VerMonth;
  uint8_t VerDate;

  uint8_t Motor_Para_Pole;              //0x0008
  uint8_t VerSub;                       ///somebp 2024.02.07
  uint16_t Motor_Ang_EncPulse;

  float Motor_Para_Ld;                  //0x000C
  float Motor_Para_Lq;                  //0x0010
  float Motor_Para_Rs;                  //0x0014
  float Motor_Para_Phaif;               //0x0018

  float Motor_GainCurD_Kp;              //0x001C
  float Motor_GainCurD_Ki;              //0x0020
  float Motor_GainCurD_Kaw;             //0x0024
  float Motor_GainCurQ_Kp;              //0x0028
  float Motor_GainCurQ_Ki;              //0x002C
  float Motor_GainCurQ_Kaw;             //0x0030

  float Motor_GainSpd_Kp;               //0x0034
  float Motor_GainSpd_Ki;               //0x0038
  float Motor_Gainspd_Kaw;              //0x003C

  float Motor_GainFweak_Kp;             //0x0040
  float Motor_GainFweak_Ki;             //0x0044

  float Motor_Ang_AngleScale;           //0x0048
  float Motor_Ang_SpeedScale;           //0x004C
  float Motor1_Ang_AngleElecOffset;     //0x0050
  float Motor2_Ang_AngleElecOffset;     //0x0054

  uint16_t Motor_Ang_MR_Max_Sin;        //0x0058
  uint16_t Motor_Ang_MR_Max_Cos;
  uint16_t Motor_Ang_MR_Min_Sin;        //0x005C
  uint16_t Motor_Ang_MR_Min_Cos;
  uint16_t Motor_Ang_MR_Mid_Sin;        //0x0060
  uint16_t Motor_Ang_MR_Mid_Cos;
  float Motor_Ang_MR_Gain_Sin;          //0x0064
  float Motor_Ang_MR_Gain_Cos;          //0x0068

  float Inv_Para_HwAdcScale;            //0x006C
  float Inv_Para_HwVdcScale;            //0x0070
  float Inv_Para_HwiScale;              //0x0074

  float Inv_Para_Tsamp;                 //0x0078

  float Inv_Para_PWM_Max;               //0x007C
  float Inv_Para_PWM_Mid;               //0x0080
  float Inv_Para_VdcMargin;             //0x0084

  float LPFVdc_fc;                      //0x0088
  float LPFVdc_fs;                      //0x008C

  float LPFCur_fc;                      //0x0090
  float LPFCur_fs;                      //0x0094

  float LPFSpd_fc;                      //0x0098
  float LPFSpd_fs;                      //0x009C

  float ErrRef_IsensorOpen;             //0x00A0
  float ErrRef_IsensorShort;            //0x00A4
  float ErrRef_OverCurrent;             //0x00A8
  float ErrRef_OverSpeed;               //0x00AC
  float ErrRef_OverVoltage;             //0x00B0
  float ErrRef_UnderVoltage;            //0x00B4
  float ErrRef_IsensorOffsetMax;        //0x00B8
  float ErrRef_IsensorOffsetMin;        //0x00BC

  float Inv_Ctrl_VdcLimFweak;           //0x00C0
  float Inv_Ctrl_IlimFweak;             //0x00C4

  float Motor_Ang_RpmLim;               //0x00C8
  float Motor_Ang_SpdCtrlOutLim;        //0x00CC

  float Machine_SensorGearRatio;        //0x00D0
  float Machine_SpoolDiameter;          //0x00D4
  float Machine_MaxWeight;              //0x00D8
  float Machine_CableMaxLength;         //0x00DC
  float Machine_Scale_Weight2Current;   //0x00E0
  float Machine_SoftWindingHeight;      //0x00E4

  float Machine_DefaultWeight;          //0x00E8
  float Machine_FrictionWeight;         //0x00EC
  float Machine_FrictionSpeedPlus;      //0x00F0
  float Machine_FrictionSpeedMinus;     //0x00F4

  uint32_t DFU_Status;                  //0x00F8    (25.05.06 HSW)

  uint32_t check;   //FLASH_VALID_CODE  //0x00FC

  uint8_t   unused[SECTOR_SIZE-sizeof(Data_Form_RAM)];
} Data_Form;

////////////////    Public Variables    ///////////////////

extern  EEPROM  Data_Form           Origin_Data;      //EEPROM Area in Flash(1st Sector : 0x08008000)
extern  BACKUP  Data_Form           Backup_Data;      //BACKUP Area in Flash(2nd Sector : 0x0800C000)
extern  const   Data_Form_RAM       Defualt_RAM_Data; //Constants   in Flash(Program Code)
extern          Data_Form_RAM       RAM_Data;         //Buffer Area in RAM  for Protocol

///////////////     Public Functions    //////////////////

#define   EEPROM_Save()   Flash_Write(FLASH_ORIGIN_SECTOR)

// DFUv2 (25.05.06)
#define DFU_STATUS_FACTORY     0xFFFFFFFF  // 초기 상태 (공장 출하 상태)
#define DFU_STATUS_DOWNLOADING 0xA5A5A5A5  // DFU 다운로드 중 (실패했을 가능성 있음)
#define DFU_STATUS_COMPLETED   0x5A5A5A5A  // DFU 완료됨 (안전하게 실행 가능)

void Flash_Init(void);                          //Backup or Restore on Startup
HAL_StatusTypeDef Flash_Write(uint8_t sector);  //Save Flash
HAL_StatusTypeDef Flash_Erase(uint32_t sector);

#ifdef __cplusplus
}
#endif

#endif /* __FLASH_H_ */
