#include <pthread.h>
#include <sys/times.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include "can_inf.h"


/**
 * @brief       获取1ms tick
 * @return      uint32_t
 * @retval      1ms tick
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023-01-06           JHC        创建初始版本          \n
*/
uint32_t TimeSet_GetSysTickCount1ms()
{
    uint32_t ticks = 0;
    struct timespec ts;

    clock_gettime(CLOCK_MONOTONIC, &ts);
    ticks = (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
    return ticks;
}

/*-----------------------------------------------------------------------------------------
 Discription:  Com 写入数据
 Param:        @Para1:操作的虚拟HandleId
               @Para2:操作数据的数据指针
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Ret_Type Rte_Comm_Write(ComIf_Handle_Type handle, ComIfData *pComIfData)
{
    CanMsg can;

    can.CanId = pComIfData->infor.id;
    can.IDE = pComIfData->infor.ide;
    can.DLC = pComIfData->bufSize;
    memcpy(&can.Data[0],pComIfData->buffer,pComIfData->bufSize);
    return canInf_sendMsg(handle,&can);
}

uint8_t Bit1_GetState(uint8_t* buf, uint8_t index)
{
    uint8_t i = index >> 3;
    uint8_t j = (index & 7U);

    return (*(buf + i) >> j) & 0x1U;
}

uint32_t Bit_GetValue(uint8_t* buf, uint8_t bitIndex, uint8_t bitLen)
{
    uint32_t i = 0;
    uint32_t value = 0;

    for (i = bitIndex; i < (bitLen + bitIndex); i++)
    {
        value |= Bit1_GetState(buf, i) << (i- bitIndex);
        //printf("value=%d\r\n", value);
    }
    return value;

}

/**
  * @brief       获取时间差
  * @details
  * @param[in]   last_tick上一次的tick
  * @param[in]   new_tick当前的tick
  * @return      时间差
  * */
uint32_t get_interval_by_tick(uint32_t old_tick, uint32_t new_tick)
{
    if(new_tick >= old_tick)
    {
    	return new_tick - old_tick;
    }
    return new_tick + ((uint32_t)0xFFFFFFFFUL - old_tick);
}

char* itoa(int num,char* str,int radix)
{
    char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//索引表
    unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数
    int i=0,j,k;//i用来指示设置字符串相应位，转换之后i其实就是字符串的长度；转换后顺序是逆序的，有正负的情况，k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
 
    //获取要转换的整数的绝对值
    if(radix==10&&num<0)//要转换成十进制数并且是负数
    {
        unum=(unsigned)-num;//将num的绝对值赋给unum
        str[i++]='-';//在字符串最前面设置为'-'号，并且索引加1
    }
    else unum=(unsigned)num;//若是num为正，直接赋值给unum
 
    //转换部分，注意转换后是逆序的
    do
    {
        str[i++]=index[unum%(unsigned)radix];//取unum的最后一位，并设置为str对应位，指示索引加1
        unum/=radix;//unum去掉最后一位
 
    }while(unum);//直至unum为0退出循环
 
    str[i]='\0';//在字符串最后添加'\0'字符，c语言字符串以'\0'结束。
 
    //将顺序调整过来
    if(str[0]=='-') k=1;//如果是负数，符号不用调整，从符号后面开始调整
    else k=0;//不是负数，全部都要调整
 
    char temp;//临时变量，交换两个值时用到
    for(j=k;j<=(i-1)/2;j++)//头尾一一对称交换，i其实就是字符串的长度，索引最大值比长度少1
    {
        temp=str[j];//头部赋值给临时变量
        str[j]=str[i-1+k-j];//尾部赋值给头部
        str[i-1+k-j]=temp;//将临时变量的值(其实就是之前的头部值)赋给尾部
    }
 
    return str;//返回转换后的字符串
 
}