#include "base.h"
// #define USE_USB_HS
extern osSemaphoreId_t elog_dma_lockHandle;
int _write(int fd, char *ch, int len)
{
    //  HAL_UART_Transmit(&huart1, (uint8_t *)ch, len, 0xFFFF);
    if (osOK == osSemaphoreAcquire(elog_dma_lockHandle, osWaitForever))
    {
        HAL_UART_Transmit_DMA(&huart2, (uint8_t *)ch, len);
    }
    return len;
}

// extern struct led led_0;
// extern struct led led_1;

extern struct ds1302 ds1302;
extern SD_HandleTypeDef hsd;

extern volatile uint16_t aa ;
extern volatile uint16_t bb ;
extern volatile uint16_t cc ;
extern volatile uint16_t dd ;
// extern osTimerId_t myTimer01Handle;

 
//  H2s 相关参数
double a0 = 3.149951E+00;
double a1 = -1.768957E-01;
double a2 = 3.656828E-03;
double a3 = -1.176627E-05;

double a20 = 7.939553E-03;
double Ug = 7.0E+00;

double h2s;
double phval;
double tempval;

uint8_t  measure_step = 0;
uint64_t timebase;
float result[3] ;   /* H2S  T  pH */

void MY_INIT( )
{
    // // 使能 3243   供电
    max3243_enable();
    uart2_power_enable();
    uart3_power_enable();
    uart4_power_enable();
    uart6_power_enable();

    // HAL_TIM_Base_Start_IT(&htim2);
    // __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);					// 使能定时器更新中断
}

 void measureTimer_Callback(void *argument)
{
    log_i("measure timer begin ....  " );
    // led_set_state( LED_SEQ_0, LED_STATE_FLICKER_QUICK );

    // 打开测量
    if (measure_step == 0 )
    {
        led_set_state( LED_SEQ_0, LED_STATE_FLICKER_QUICK );
        measure_step = 1;
        timebase = osKernelGetTickCount();
    }else{
        log_w(" still measuring .... measurestep -> %d",measure_step);
    }

}

/*  判断测量是否完成，完成进行完成操作 */
void measureTask( void *argument )
{
    for (;;)
    { 
        if ( measure_step == 0    )
        {
            osDelay(20);
        }
        //  开始采集 
        if ( measure_step == 1    )
        {
            timebase = osKernelGetTickCount();
            my_ads1115.start();     // ADS1115
            my_pH.start();          // pH
            measure_step++;
            // log_i( " ph->state = %d, my_ads1115.state = %d   ",ph->state,  my_ads1115.state );
            osDelay(2);
        }

        // 等待数据采集完成 
        if ( measure_step==2 )
        {
            // log_i( "  step == 2 ->  %d    %d " ,ph->state , my_ads1115.state);
            if ( ph->state == PH_Status_DATA_OK && my_ads1115.state==ADS1115_WORK_STATE_DATA_OK)
            {
                measure_step++ ;
                continue;
            }
            osDelay(20);
        }

        //  采集完成，停止，处理数据
        if ( measure_step==3 )
        {
            my_ads1115.stop();     
            my_pH.stop();          
            measure_step++ ;
            continue;
        }

        // 数据处理
        if ( measure_step==4 )
        {   
            // log_i( "4444 ph->state = %d, my_ads1115.state = %d   ",ph->state,  my_ads1115.state );
            double temp_h2s_mv = 0.0;
            uint16_t voltage; 
            uint16_t coeff; 

            coeff = ADS1115_Get_Coeff_BY_128();   // 获得放大系数  * 128
            // log_i( " coeff  %d,    ",coeff );

            phval     = (my_ads1115.result[0]*256 + my_ads1115.result[1] )/100.0;
            tempval    = (my_ads1115.result[0]*256 + my_ads1115.result[1] )/10.0;

            voltage       = my_ads1115.result[0]*256 + my_ads1115.result[1] ;  // 电压整数
            temp_h2s_mv  =  (double)voltage * coeff / 128.0 /1000.0;            // 电压毫伏
            h2s =  ( temp_h2s_mv - Ug) * a20 *( a3*tempval*tempval*tempval+ a2*tempval*tempval + a1*tempval + a0 );  // 温度校正

            result[0] = h2s;
            result[1] = tempval;
            result[2] = phval;
    
            measure_step++ ;
            continue;
        }
        // // send to screen
        if ( measure_step==5 )
        {     
            HAL_UART_Transmit_DMA(&huart1, (uint8_t *)result, 12);
            measure_step++ ;
            continue;
        }
        // 等发送完成
        if ( measure_step==6 )
        {          
            osDelay(2);
        }
        // 改写 modbus数据
        if ( measure_step==7 )
        {          
            log_i( "  measure_step == 7 ...   " );
            measure_step++ ;
            continue;
        }

        // // 数据完成 等待
        if ( measure_step==8 )
        {          
            log_i( "  measure_step == 8 ...   " );
            measure_step = 0;
        }
        osDelay(2);
    }
}


static void Default_Task_Init()
{
    // measuring_flag = 0;

    my_led.init();
    if ( 0 == my_led.port(200) ) {
        log_i("Led Port init Ok .... ");
    }else {
        log_e("Led Port init Failure .... ");            
    };

    led_set_state( LED_SEQ_0, LED_STATE_FLICKER_SLOW );

    my_eeprom.init();
    if ( 0 == Eeprom_Test( ) ) {
        log_i("Eeeprom Test Ok .... ");        
    } else {
        log_e("Eeeprom Test Failure .... ");            
    };


    if ( 0 == ds1302_port() )
    {
        log_i("ds1302 init Ok .... ");
    }else {
        log_e("ds1302 init  Failure .... ");            
    };

    /* ads1115 */
    if ( 0 == my_ads1115.init() )
    {
        log_i( "ads1115 init Ok .... " );
    }else
    {
        log_e( "ads1115 init Failure .... " );
    }

    osDelay(10);
    
    my_ads1115.port();
    osDelay(10);

    // pH init  port

    if ( 0!= my_pH.init() )
    {
        log_e( "pH init Failure .... " );

    }else{
        log_i( "pH init ok .... " );
    };

    my_pH.port();


    // // SD_Test();
    // // Test_Port();

    RTOS_Port( );

    Modbus_Port( );
    extern osTimerId_t measureTimerHandle;
    osTimerStart( measureTimerHandle, 3000);

    // MX_USB_DEVICE_Init();
}

void StartDefaultTask(void *argument)
{
    Init_Logger();
    log_i( "System is initiating.... " );

    Default_Task_Init();

    // MX_USB_DEVICE_Init();  /* USB 初始化需要写在任务中 */

    for (;;)
    {
        // log_i("looo... ");
        //  CDC_Transmit_HS(send_buf, 8);
        osDelay( 1000 );
        // log_i(" aa bb  cc  dd : %d   %d  %d   %d ",aa, bb,cc, dd);
    }
}

void USART1_IRQHandler(void)
{
    if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != RESET)
    {
        // log_i(" uart1  tc..... ");
        // osSemaphoreRelease(elog_dma_lockHandle);
        measure_step++;
        huart1.gState = HAL_UART_STATE_READY;
        __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC);
    }
    HAL_UART_IRQHandler(&huart1);
}

void USART2_IRQHandler(void)
{
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) != RESET)
    {
        // HAL_UART_Transmit(&huart3, (uint8_t*)"tddddd", 6,0xFF);
        // extern osSemaphoreId_t elog_dma_lockHandle;
        osSemaphoreRelease( elog_dma_lockHandle );
        huart2.gState = HAL_UART_STATE_READY;
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);
    }
    HAL_UART_IRQHandler(&huart2);
}

// void USART3_IRQHandler(void)
// {

//     if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) != RESET)
//     {
//         log_i(" uart3  tc..... ");
//         max3160_485_receive_mode();
//         // huart3.gState = HAL_UART_STATE_READY;
//         __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
//     }

//     if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) != RESET)
//     {
//         log_i("....huart3 IDLE....");
//         __HAL_UART_CLEAR_IDLEFLAG(&huart3);
//     }
//     HAL_UART_IRQHandler(&huart3);
// }

void UART4_IRQHandler(void)
{
//   if (__HAL_UART_GET_FLAG(&huart4,  UART_IT_TXE) ==SET )
//   {
//         log_i("....huart4 tc callback....");
//     //  HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET);
//     // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET);
//     __HAL_UART_CLEAR_FLAG(&huart4, UART_IT_TXE);
//   }
    HAL_UART_IRQHandler(&huart4);
}

// void USART6_IRQHandler(void)
// {

//     HAL_UART_IRQHandler(&huart6);
// }

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == huart2.Instance)
    {
        // log_i("....huart2 rx callback....");
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
    }

    // if (huart->Instance == huart3.Instance)
    // {
    //     // measure_step++;
    //     pH_rcv_flag = 1;
    //     log_i("....huart3 rx callback....  " );
    //     // log_i( "rcvbuf : %d  %d %d %d  %d %d", rcv_buf_2[0], rcv_buf_2[1], rcv_buf_2[2],rcv_buf_2[3], rcv_buf_2[4], rcv_buf_2[5]);
    //     __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE);
    // }
}


void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{

//   if (huart->Instance == huart3.Instance)
//   {
//     /* 拷贝数据 到菜单 */
//     log_i("huart3 Ex idle....");
//     __HAL_UART_CLEAR_IDLEFLAG(&huart3);
// //  __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_IDLE);
//   }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{

//   if (huart->Instance == huart3.Instance)
//   {
//     max3160_485_receive_mode();
//     // huart3.gState = HAL_UART_STATE_READY;
//     __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
//   }

//   if (huart->Instance == huart6.Instance)
//   {
//     HAL_UART_Transmit(&huart3, (uint8_t*)"tccccc", 6,0xFF);
//     // HAL_GPIO_TogglePin(GRN_GPIO_Port,GRN_Pin);
//     // extern osSemaphoreId_t elog_dma_lockHandle;
//     osSemaphoreRelease(elog_dma_lockHandle);
//     __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC);
//   }
}

 
void TIM2_IRQHandler(void)
{
    if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE))			// 更新中断标记被置位
    {
  
    }
    HAL_TIM_IRQHandler( &htim2 );
}
 

void Soft_Reboot()
{
    __set_FAULTMASK(1);//关闭总中断
    NVIC_SystemReset();//请求单片机重启

}


void SD_Test()
{
    // BSP_SD_Init();
    // // printf_sdcard_info( );
    // if (Init_FatFas_Mount())
    // {
    //     log_i("SD mount failure .. ");
    // }
    // else
    // {
    //     log_i(" SD mount success.. ");
    // }
    // // extern SD_HandleTypeDef hsd;

    // if ( open_file( "0:aa.txt") == 0)
    // {
    //     write_file( (char*)"data\r\n", 6 );
    //     // close_file();
    // }
    // else
    // {
    //     log_e(" open file failure .. ");
    // }    
}

/*
    log_i("test uart2 .... ");
    HAL_GPIO_WritePin(UART_EN_GPIO_Port,UART_EN_Pin, SET);
    HAL_UART_Transmit(&huart2, (uint8_t*)"usart2\r\n", 8,0xFF);

    HAL_UART_Transmit_IT(&huart4, send_buf, 8 );
    // while ( __HAL_UART_GET_FLAG(&huart4, UART_FLAG_TC) == RESET);
    // HAL_UART_Receive_IT(&huart4, rcv_buf_2, 13 );

    // HAL_GPIO_WritePin(UART_EN_GPIO_Port,UART_EN_Pin,RESET);

    log_i("test uart6 485.... ");
    HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin, SET);
    // HAL_UART_Transmit(&huart6, (uint8_t*)"uart66\r\n", 8,0xFF);
    HAL_UART_Transmit_IT(&huart6, send_buf, 8 );
    while ( __HAL_UART_GET_FLAG(&huart6, UART_FLAG_TC) == RESET);
    HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin,RESET);
    HAL_UART_Receive_IT(&huart6, rcv_buf, 13 );


    // log_i("test uart3 3160 232.... ");
    // HAL_GPIO_WritePin(SEL_232_485_GPIO_Port,SEL_232_485_Pin, RESET);
    // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET);
    // // HAL_UART_Transmit(&huart3, (uint8_t*)"uart3160\r\n", 10,0xFF);
    // // HAL_UART_Transmit(&huart3, send_buf, 8,0xFF);
    // HAL_UART_Receive_IT(&huart3, rcv_buf_2, 13 );
    // HAL_UART_Transmit_IT(&huart3, send_buf, 8 );
    // while ( __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET);


    // log_i("test uart3 3160 485.... ");
    // HAL_GPIO_WritePin(SEL_232_485_GPIO_Port,SEL_232_485_Pin, SET);
    // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, RESET);
    // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, SET);
    // // HAL_UART_Transmit(&huart3, (uint8_t*)"uart3160\r\n", 10,0xFF);
    // // HAL_UART_Transmit(&huart3, send_buf, 8,0xFF);

    // // HAL_UART_Receive_IT(&huart3, rcv_buf_2, 13 );
    // HAL_UART_Transmit_IT(&huart3, send_buf, 8 );
    // while ( __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET);
    //     HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET);
    //   HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET);  
    // // HAL_UART_Receive_IT (&huart3, rcv_buf_2,2 );
    // if ( HAL_UART_Receive (&huart3, rcv_buf_2, 2 ,2000) ==HAL_OK) 
    // {
    //     log_i("rcv ok");
    // }

    // log_i( "rcvbuf : %d  %d %d", rcv_buf_2[0], rcv_buf_2[1], rcv_buf_2[2]);

    // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET);
    // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET);


*/

// void measureTimer_Callback(void *argument)
// {
//     log_i("measure timer begin ....  " );
//     // led_set_state( &led_0, LED_STATE_FLICKER_QUICK );
//     // voltage = 0.0;
//     // H2S = 0.0;
//     // memset(pH_rcv_buf, 0, 9 ); 
//     // memset(result, 0, 12 ); 
//     // timebase = osKernelGetTickCount();
//     // measuring_flag = 1;
//     // pH_send_flag = 0;
//     // pH_rcv_flag = 0;
//     // pH_measuring_flag = 0;
//     // pH_measure_ok = 0;
//     // voltage_measure_ok = 0;
//     // measure_step = 0;
// }

// void pH_Task(void *argument)
// {
//     max3160_485_receive_mode();
//   for(;;)
//   {

//     // if ( pH_measure_ok ==0  && pH_send_flag == 0)
//     // {
//     //     log_i(" send stage ... "); 
//     //     HAL_UART_Receive_DMA(&huart3, pH_rcv_buf, 9 );
//     //     timebase = osKernelGetTickCount();
//     //     max3160_485_send_mode();
//     //     pH_send_flag = 1;
//     //     HAL_UART_Transmit_DMA(&huart3, pH_send_buf, 8 );
//     // }
//     // if ( pH_measure_ok ==0  && pH_send_flag == 1  && pH_rcv_flag == 0 )
//     // {
//     //     uint64_t time_ticks = osKernelGetTickCount() ;
//     //     // log_i( " time_ticks :%d " , time_ticks);
//     //     if ( (time_ticks - timebase ) >400) 
//     //     {
//     //         log_i( " pH timeout ..... "  );
//     //         measureTimer_Callback(NULL);   
//     //     }
//     // }
//     // if ( pH_measure_ok ==0  && pH_rcv_flag == 1  )
//     // {
//     //     log_i( " pH ok ..... "  );
//     //     pH_measure_ok = 1;
//     // }
//     // if ( pH_measure_ok ==1     )
//     // {
//     //     ;
//     // }
//     osDelay(50);
//   }
// }


// void Measure_Task(void *argument)
// {
//   for (;;)
//   { 
//     // /* convert */
//     // if ( measure_step==0 && pH_measure_ok == 1 && voltage_measure_ok == 1  )
//     // {
//     //     /** TODO  ...*/
//     //     result[1] = (pH_rcv_buf[5]*256 + pH_rcv_buf[6])/10.0;  /* Temp /10.0*/
//     //     result[2]  = (pH_rcv_buf[3]*256 + pH_rcv_buf[4])/100.0;  /* pH /10.0*/
//     //     // log_i( " temperature :%.6f   pH :  %.6f " , temperature ,pH_value);
//     //     get_h2s_2(&H2S_concentration , voltage, result[1]);
//     //     result[0]  = H2S_concentration;   
//     //     led_set_state(&led_0, LED_STATE_FLICKER_SLOW);
//     //     // log_i( "H2S :  %.6f    " ,H2S);
//     //     measure_step++;
//     // }

//     // /* 写modbus数据 */
//     // if ( measure_step==1 )
//     // {
//     //     /*   写modbus   临界区 */
//     //     log_i( "-------> H2S: %.6f  TEMP: %.6f pH: %.6f   ", result[0]  , result[1], result[2]);
//     //     // 数据全反过来   40db851f41a80000402771f2 -》 f2712740......//
 
//     //     Modbus_Set_HoldingBuff( (uint8_t *)result,  12,   0);
 
//     //     measure_step++;
//     //     /*pH 686 : 40db851f 41a80000  402771f2  */
//     // }
//     // /* 输出数据 uart1 */
//     // if ( measure_step==2 ) 
//     // {
//     //     log_i( "send to screen...    " );
//     //     int ret= HAL_UART_Transmit_IT(&huart1, (uint8_t *)result, 12);
//     //     if( ret==HAL_OK)
//     //         log_i( "send ok..    " );

//     //     measure_step++;
//     // }
//     // if ( measure_step==3 ) 
//     // {
//     //     osDelay(2);
//     // }
//     osDelay(20);
 
//   }
// }


//  void pHTask(void *argument)
// {
//     for (;;)
//     { 
//         // log_i(" ph... pH_measure_ok  %d", pH_measure_ok); 
//         if ( pH_measure_ok ==0  && pH_send_flag == 0)
//         {
//             log_i(" pH send  ... "); 
//             HAL_UART_Receive_DMA( &huart3, pH_rcv_buf, 9 );
//             timebase = osKernelGetTickCount();
//             max3160_485_send_mode();
//             pH_send_flag = 1;
//             HAL_UART_Transmit_DMA( &huart3, pH_send_buf, 8 );
//         }
//         if ( pH_measure_ok ==0  && pH_send_flag == 1  && pH_rcv_flag == 0 )
//         {
//             uint64_t time_ticks = osKernelGetTickCount() ;
//             log_i( " time_ticks :%d   %d" , time_ticks, timebase);
//             if ( (time_ticks - timebase ) >400) 
//             {
//                 log_i( " pH timeout ..... "  );
//                 measureTimer_Callback(NULL);   
//             }
//         }
//         if ( pH_measure_ok ==0  && pH_rcv_flag == 1  )
//         {
//             log_i( " pH ok .....  %d   %d " ,pH_rcv_buf[5],pH_rcv_buf[6]  );
//             pH_measure_ok = 1;
//         }
//         if ( pH_measure_ok ==1     )
//         {
//             ;
//         }
//         osDelay(50); 
//     }
// }

// void voltageTask(void *argument)
// {
//     for ( ; ; )
//     { 
//         if (voltage_measure_ok ==0)
//         {
//             int16_t t =  ads1115_read_data( hi2c1 );
//             log_i( "ads1115 ttt  ....  %d ", t );
//             // double vol  = ads1115_get_voltage_val( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L );
//             //  ads1115_get_voltage_val( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L );
//             // int vol = ads1115_get ( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L );
//             // log_w( " voltage :%.6f    " , voltage);
//             voltage_measure_ok = 1;
//         }
//         osDelay(20); 
//     }
// }


    // log_i( "ads1115 set ****  .... " );
    // ads1115_set_state( ADS1115_WORK_STATE_SET_REGISTER );
     
    // osDelay(10);
    // res = my_ads1115.read( );
    // log_i( "ads1115 result .... %d " , my_ads1115.result );

    

    // ads1115_config_register( hi2c1, 0x01, CONFIG_REG_H, CONFIG_REG_L );
    
    // int16_t t =  ads1115_read_data( hi2c1 );
    //     log_i( "ads1115 ttt  ....  %d ", t );

    // float vol;

    // vol = 100.0/1000;

    // log_i( "  float ... " );
    // // log_i("  flaot %.6f" , vol); 
    // // log_i("  fl %.6f ", vol) ;
    // log_i( "  float end " );
