/*
 * ****************************************************
 * @file    : scheduler.c
 * @brief   : scheduler Program Body
 * @author  : sohee kim / Something by People
 * @data    : 2023. 05. 25
 * ****************************************************
 */

#include "scheduler.h"

timetask taskinfo;
timecnt taskCnt;

// Private function prototypes -----------------------------------------------
void (*User_Task_Every_1ms)()=(void *)0;
void (*User_Task_Every_5ms)()=(void *)0;
void (*User_Task_Every_10ms)()=(void *)0;
void (*User_Task_Every_10ms_1)()=(void *)0;
void (*User_Task_Every_50ms)()=(void *)0;
void (*User_Task_Every_100ms)()=(void *)0;
void (*User_Task_Every_500ms)()=(void *)0;
void (*User_Task_Every_1s)()=(void *)0;
void (*User_Task_Every_60s)()=(void *)0;
void (*User_Task_Every_User)()=(void *)0;
uint16_t User_Time = 0;

void HAL_SYSTICK_Callback(void)
{
  if((void *)User_Task_Every_1ms!=(void *)0)                                      (*User_Task_Every_1ms)();
  if((void *)User_Task_Every_5ms!=(void *)0    && (Get_Time()%    5)==0)          (*User_Task_Every_5ms)();
  if((void *)User_Task_Every_10ms!=(void *)0   && (Get_Time()%   10)==1)          (*User_Task_Every_10ms)();
  if((void *)User_Task_Every_10ms_1!=(void *)0 && (Get_Time()%   10)==2)          (*User_Task_Every_10ms_1)();
  if((void *)User_Task_Every_50ms!=(void *)0   && (Get_Time()%   50)==3)          (*User_Task_Every_50ms)();
  if((void *)User_Task_Every_100ms!=(void *)0  && (Get_Time()%  100)==4)          (*User_Task_Every_100ms)();
  if((void *)User_Task_Every_500ms!=(void *)0  && (Get_Time()%  500)==6)          (*User_Task_Every_500ms)();
  if((void *)User_Task_Every_1s!=(void *)0     && (Get_Time()% 1000)==7)          (*User_Task_Every_1s)();
  if((void *)User_Task_Every_60s!=(void *)0    && (Get_Time()%60000)==8)          (*User_Task_Every_60s)();
  if((void *)User_Task_Every_User!=(void *)0   && (Get_Time()%User_Time)==User_Time-1)    (*User_Task_Every_User)();
}

void Task_Start_1ms(void(*task)())
{
  User_Task_Every_1ms=task;
}
void Task_Start_5ms(void(*task)())
{
  User_Task_Every_5ms=task;
}
void Task_Start_10ms(void(*task)())
{
  User_Task_Every_10ms=task;
}
void Task_Start_10ms_1(void(*task)())
{
  User_Task_Every_10ms_1=task;
}
void Task_Start_50ms(void(*task)())
{
  User_Task_Every_50ms=task;
}
void Task_Start_100ms(void(*task)())
{
  User_Task_Every_100ms=task;
}
void Task_Start_500ms(void(*task)())
{
  User_Task_Every_500ms=task;
}
void Task_Start_1s(void(*task)())
{
  User_Task_Every_1s=task;
}
void Task_Start_60s(void(*task)())
{
  User_Task_Every_60s=task;
}
void Task_Start_User(void(*task)(), uint16_t msec)
{
  User_Time = msec;
  User_Task_Every_User=task;
}

void Task_Stop_1ms(void)
{
  User_Task_Every_1ms=(void *)0;
}
void Task_Stop_5ms(void)
{
  User_Task_Every_5ms=(void *)0;
}
void Task_Stop_10ms(void)
{
  User_Task_Every_10ms=(void *)0;
}
void Task_Stop_50ms(void)
{
  User_Task_Every_50ms=(void *)0;
}
void Task_Stop_10ms_1(void)
{
  User_Task_Every_10ms_1=(void *)0;
}
void Task_Stop_100ms(void)
{
  User_Task_Every_100ms=(void *)0;
}
void Task_Stop_500ms(void)
{
  User_Task_Every_500ms=(void *)0;
}
void Task_Stop_1s(void)
{
  User_Task_Every_1s=(void *)0;
}
void Task_Stop_60s(void)
{
  User_Task_Every_60s=(void *)0;
}
void Task_Stop_User(void)
{
  User_Task_Every_User=(void *)0;
  User_Time = 0;
}

///////////////////////   Private Function  ///////////////////////////
extern void MyBLEFuncEnc(void);
void Task1ms(void)
{
  taskCnt._1ms++;
//  DirectionDetector();
  //HAL_IncTick();
}

void Task2ms(void)
{
  taskCnt._2ms++;

}

void Task5ms(void)
{
  taskCnt._5ms++;
}

void Task10ms(void)
{
  taskCnt._10ms++;
//  HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
//  Regen_Resistor_Control_HSW();
}

void Task10ms_1(void)
{
  taskCnt._10ms_1++;
  WeightBLEtoSetTask(0.025f);
}

void Task50ms(void)
{
  taskCnt._50ms++;
//  Return_4x1byte(WEIGHTPLUS, WP_Gym.WeightSet[L]*4, WP_Gym.WeightMode[L], WP_Gym.WeightSet[R]*4, WP_Gym.WeightMode[R]);
//  if(cnt_DropReleaseLED > 0){
//
//    int LED_R = -65 + 15 * (cnt_DropReleaseLED + 2);
//    if (LED_R > 150) LED_R = 150;
//    if (LED_R < 5) LED_R = 5;
//
//    int LED_B = 65 - 10 * cnt_DropReleaseLED;
//    if (LED_B < 5) LED_B = 5;
//
//    LED_Blink_ALL(LED_R,5,LED_B,20);
//    //    delay_msec(5);
//    cnt_DropReleaseLED--;
//  }

}
int cnt_Off = 0;
void Task100ms(void)
{
  switch(Status_VoltRprt){
    case ON:
      Report_Vdc();
      break;
    case OFF:
      break;
  }

  taskCnt._100ms++;
//  UART_printf(&huart3,"100ms\r\n");
//  MyBLEFuncEnc();
  if(LED_MotionAutoWeight > 0) {
    LED_Blink_ALL(5, 50, 50, 20);
    LED_MotionAutoWeight--;
  } else if (LED_MotionAutoWeight < 0) {
    LED_Blink_ALL(80, 20, 5, 20);
    LED_MotionAutoWeight++;
  } else {
    if(WP_Weight.Ctrl.OnOffScale[L] >= 1.0f && Debug_LED_Display_Level == 0){
      cnt_Off = 0;
      LED_Display_Level(LED_MODE_HALF_CENTER, WP_Gym.Position[R], WP_Gym.Position[L], LED_Weight_R, LED_Weight_G, LED_Weight_B, 3, 3, 3);
      //    LED_Display_Level(LED_MODE_FULL_LEFT, WP_Gym.Position[R], WP_Gym.Position[L], LED_Weight_R, LED_Weight_G, LED_Weight_B, 3, 3, 3);
    } else if(WP_Weight.Ctrl.OnOffScale[L] <= 0.1f && cnt_Off == 0){
      for(int i=1; i<LED_NUMBER; i++) {
        LED_Send_Wait(i,3,3,3);
      }
      LED_Send_Now(LED_NUMBER,3,3,3);
      cnt_Off++;
    }
  }
}

void Task500ms(void)
{
  taskCnt._500ms++;
}

void Task1s(void)
{
  taskCnt._1s++;
}

void Task60s(void)
{
  taskCnt._60s++;
}
