#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 osTimerId_t myTimer01Handle;

// uint8_t send_buf[8] = {0x01,0x03,0x00,0x00,0x00,0x04,0x44,0x09};
uint8_t send_buf[24] = {0x01,0x03,0x00,0x00,0x00,0x04,0x44,0x09,0x01,0x03,0x00,0x00,0x00,0x04,0x44,0x09,0x01,0x03,0x00,0x00,0x00,0x04,0x44,0x09};
// uint8_t rcv_buf[14] = {0};
// uint8_t rcv_buf_2[13] = {0};

// uint8_t wk2xxx_rcvbuf[1024] ={ 0};
WK2114_Sub_Uart_TypeDef  *sub_uart1 = NULL;
uint8_t sub_uart1_receive_buf[1024];

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

    // usart6_receive_enable();

}


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

    int st ;
    st = wk2114_sub_uart_send( wk2114->sub_uart[0], send_buf, sizeof(send_buf) );
    log_e("send_buf  ok addr %d  .... st %d  " ,send_buf, st);

            // osEventFlagsSet(wk2114EventHandle, 
            //                 MODULE_WK2114_EVENT_EXTI_IT_SOURCE_SENDING);
    // sc6.start();
    // oscar.start();
    // ph.start();
    // // my_ads1115.start();
    // memset((void* )result, 0 , 12);
}


void measureTask(void *argument)
{
    int step =0;
    for (;;)
    { 
        osDelay(40);
    }
}

static void Default_Task_Init()
{
    // measuring_flag = 0;
    uint64_t ticks = 0;
    if ( 0 == Led_Port() ) {
        log_i("Led Port int Ok .... ");
    }
    led_set_state( &led_0, LED_STATE_FLICKER_SLOW );


//WK2xxx 初始化
if(0==WK2114_Init())
{
    log_d("wk2114 Init Ok...");
}else{
    log_w("wk2114 Init Failure...");
}


// 启动任务, 多次重试baud
WK2114_Port();
// 状态机初始化
wk2114->state= WK2114_WORK_STATE_START;
while( wk2114->state!=WK2114_WORK_TEST_OK ) {osDelay(1);}
log_d("wk2114 test ok...");
wk2114->state= WK2114_WORK_STATE_ADD_SUB_UART;
while( wk2114->state!=WK2114_WORK_STATE_OK ) {osDelay(1);}
log_d("wk2114 init subuart ok...");
// HAL_Delay(2000);
        // wk2114_mainport_rcv( wk2114);
        // osEventFlagsSet(wk2114EventHandle, 
        //                     MODULE_WK2114_EVENT_EXTI_IT_SOURCE_SENDING);
//   int st;      
//     // memset(rcvbuf, 0, 1024);
//     // __HAL_UART_ENABLE_IT(pWK2114Uart, UART_IT_IDLE);
//     // st =HAL_UART_Receive_DMA(pWK2114Uart, rcvbuf, 1024);

        // wk2114_read_global_reg( wk2114, 0x00);
//         // osDelay(1);

//     //     // wk2114->cmd = (WK2114_CMD_READ_REG<<6)+WK2114_G_REG_GIFR;
//         // HAL_UART_Transmit(pWK2114Uart, &wk2114->cmd, 1, 0xFFF);
//         st = HAL_UART_Receive(pWK2114Uart,  &wk2114->reg_readout,  1  , 0xFFF);
//         log_i(" wk2114->reg_readout 0x%02X   st  %d ", wk2114->reg_readout,st);
        // wk2114_inter_callback( wk2114);

 
// // 注册子串口，初始化
// sub_uart1 =  (WK2114_Sub_Uart_TypeDef *)malloc(sizeof(WK2114_Sub_Uart_TypeDef));
// if (0!=wk2114_sub_uart_register(wk2114, sub_uart1,WK2114_S_UART_1,sub_uart1_receive_buf,1024, &huart2, Sub_rcv_callback))
// {
//     log_e("sub-uart 1 register Failure ! ");
// };
// if (0!=wk2114_sub_uart_init( sub_uart1,115200,WK2114_SUB_UART_MODE_MASK_TX|WK2114_SUB_UART_MODE_MASK_RX,WK2114_SUB_UART_FIFO_MODE_MASK_TX|WK2114_SUB_UART_FIFO_MODE_MASK_RX,WK2114_UART_PARITY_NONE,WK2114_UART_STOP_BITS_1))
// {
//     log_e("sub-uart 1 init Failure ! ");
// }

// log_w( "  sub uart init ok ....   "   );
// log_w( "  --->>>> count  %d " , osMessageQueueGetCount(wk2114->cmd_queue) );

            // memset(rcvbuf, 0, 1024);
            // __HAL_UART_ENABLE_IT(pWK2114Uart, UART_IT_IDLE);
            // HAL_UART_Receive_DMA(pWK2114Uart, rcvbuf, 1024);

// while (osMessageQueueGetCount(wk2114->cmd_queue) > 0)
// {
//     wk2114_send(wk2114);
// }
// log_i("sub-uart 1 init success ! ");

// // 启动任务
// WK2114_Port();
// // 状态机初始化
// wk2114->state= WK2114_WORK_STATE_START;





    // if ( 0 == ds1302_port() )
    // {
    //     log_i("ds1302 init Ok .... ");
    // }

    // ph.init();
    // ph.port();
    // ph.test();

    // viper.init();
    // viper.port();
    // viper.test();

    // oscar.init();
    // oscar.port();
    // oscar.test();

    // sc6.init();
    // sc6.port();
    // sc6.test();

    // ramses.init();
    // ramses.port();
    // ramses.test();

    // wh_lte.init();
    // wh_lte.port();
    // wh_lte.start();

    // wk2114.init();
    // wh_lte.port();
    // wh_lte.start();
    // ticks = osKernelGetTickCount();
    // while ( viper.state!=Viper_State_Ready  )
    // {
    //     if ( ( osKernelGetTickCount() -ticks) > 3000 )
    //     {
    //        log_e(" VIPER_ state error.... ") ;
    //         break;
    //     }
    //     osDelay(10);
    // }
    // log_d(" VIPER_ state OK.... ") ;


    // Modbus_Port( );
    RTOS_Port( );
    extern osTimerId_t measureTimerHandle;
    osTimerStart( measureTimerHandle, 5000 );

}


void StartDefaultTask(void *argument)
{
    HAL_GPIO_WritePin( LED0_GPIO_Port,LED0_Pin,RESET);
    // max3243_enable( );
    Init_Logger();
    log_i(" ****** System is initiating ****** ");
 
    Default_Task_Init();

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

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_pin)
{
    // log_i( "  irq  ..... %d  ",osKernelGetTickCount() );

}

//  void EXTI9_5_IRQHandler(void)
// {
//     log_i( "  irq  ..... %d  ",osKernelGetTickCount() );
// //     if(  (osEventFlagsGet(wk2114EventHandle) &  MODULE_WK2114_EVENT_EXTI_IT_SOURCE_SENDING) !=0){
// //         return;
// //     }
// //     osEventFlagsSet(wk2114EventHandle, MODULE_WK2114_EVENT_EXTI_IT_SOURCE_SENDING); 
// //     log_i( "   exti  ..... %d  ",osKernelGetTickCount() );
// //   HAL_GPIO_EXTI_IRQHandler(WK2114_INT_Pin);

// 	// if(__HAL_GPIO_EXTI_GET_IT(WK2XXX_INT_GPIO_PIN) != RESET) 
// 	// {
//     //     // 在中断处理函数中对GT911的寄存器0X814E写0
//     // log_i("WK2XXX_INT_IRQHandler ......");
//     // // GTP_TouchProcess();
//     // // INT_Callback();
//     // __HAL_GPIO_EXTI_CLEAR_IT(WK2XXX_INT_GPIO_PIN);    
 
// 	// }  
// }

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

}


/*

    // printf("test.... \r\n");
    // printf ( "max3243 ...  %d \r\n", HAL_GPIO_ReadPin( MAX3242_EN_GPIO_Port,MAX3242_EN_Pin));
    // HAL_UART_Transmit(&huart1, pH_send_buf, 8,1000);
    // HAL_UART_Transmit(&huart2, pH_send_buf, 8,1000);
    // HAL_UART_Transmit(&huart4, pH_send_buf, 8,1000);

    // usart6_send_enable();
    // HAL_UART_Transmit(&huart6, pH_send_buf, 8,1000);

    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);
 
//   }
// }



    // if ( 0 == ads1115_test(hi2c1) )
    // {
    //     log_i("ads1115 test Ok .... ");
    // }else{
    //     log_i("ads1115 test failure .... ");

    // }