251 lines
6.5 KiB
C++
251 lines
6.5 KiB
C++
#include "JQ_UIDGenerate.h"
|
||
#include "stdint-gcc.h"
|
||
#include "string.h"
|
||
//#include "Common.h"
|
||
|
||
|
||
static uint32_t UINT32_ENDIAN_CHANGE(uint32_t val);
|
||
|
||
static bool YMUid_Valid_check(uint8_t *u8ArrayYMUid);
|
||
|
||
static uint8_t _CalcCrc8(uint8_t *Ptr,uint8_t num);
|
||
|
||
|
||
bool UidCode_JQ2YM(const PST_JQUID_TYPEDEF pstJQUID,PST_YMUID_TYPEDEF pstYMUID)
|
||
{
|
||
UNION_VALUE_CHANGE_TYPEDEF stDate;
|
||
UNION_VALUE_CHANGE_TYPEDEF stSerialCode ;
|
||
uint8_t i=0;
|
||
uint16_t u16Year = 0;
|
||
uint16_t u16Month = 0;
|
||
uint8_t u8Day = 0;
|
||
uint16_t u16Date =0;
|
||
ST_JQUID_TYPEDEF _stJQUID;
|
||
|
||
uint16_t sum=0;
|
||
|
||
for(i=0;i<8;i++)
|
||
{
|
||
sum=sum+pstJQUID->u8ArrayJQUidCode[i];
|
||
_stJQUID.u8ArrayJQUidCode[7-i]=pstJQUID->u8ArrayJQUidCode[i]; //逆序detid
|
||
}
|
||
memcpy(pstJQUID->u8ArrayJQUidCode,_stJQUID.u8ArrayJQUidCode,8);
|
||
|
||
if(sum == 0) //全0时,CRC码也为0,所以需要避免这种情况
|
||
return 0;
|
||
|
||
|
||
if(pstJQUID->u8ArrayJQUidCode[7] != _CalcCrc8(pstJQUID->u8ArrayJQUidCode,7))
|
||
return false;
|
||
|
||
pstYMUID->ucArrayYMUidCode[0] = pstJQUID->u8ArrayJQUidCode[0]/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[1] = pstJQUID->u8ArrayJQUidCode[0]%10+0x30;
|
||
|
||
|
||
|
||
pstYMUID->ucArrayYMUidCode[4] = pstJQUID->u8ArrayJQUidCode[1];//特征码
|
||
|
||
u16Date = pstJQUID->u8ArrayJQUidCode[2];
|
||
u16Date = u16Date<<8 | pstJQUID->u8ArrayJQUidCode[3];
|
||
|
||
u16Year = (u16Date>>9)&0x7F;
|
||
u16Month = (u16Date>>5)&0x0F;
|
||
u8Day = u16Date&0x1F;
|
||
|
||
pstYMUID->ucArrayYMUidCode[2] = u16Year/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[3] = u16Year%10+0x30;
|
||
|
||
pstYMUID->ucArrayYMUidCode[5] = u16Month/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[6] = u16Month%10+0x30;
|
||
|
||
pstYMUID->ucArrayYMUidCode[7] = u8Day/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[8] = u8Day%10+0x30;
|
||
|
||
|
||
memcpy(stSerialCode.u8Val+1,pstJQUID->u8ArrayJQUidCode+4,3);
|
||
stSerialCode.u32Value = UINT32_ENDIAN_CHANGE( stSerialCode.u32Value);
|
||
|
||
pstYMUID->ucArrayYMUidCode[DEF_YM_SPECIALCODE_INDEX] = (stSerialCode.u32Value>>17) & 0x7F;
|
||
stSerialCode.u32Value = stSerialCode.u32Value&0x1FFFF;
|
||
|
||
for(i=14;i>=10;i--)
|
||
{
|
||
pstYMUID->ucArrayYMUidCode[i] = (stSerialCode.u32Value%10+0x30);
|
||
stSerialCode.u32Value = stSerialCode.u32Value/10;
|
||
|
||
}
|
||
|
||
|
||
if(!YMUid_Valid_check(pstYMUID->ucArrayYMUidCode))
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
bool UidCode_JQ2YM_NoBackwardSequence(const PST_JQUID_TYPEDEF pstJQUID,PST_YMUID_TYPEDEF pstYMUID)
|
||
{
|
||
UNION_VALUE_CHANGE_TYPEDEF stDate;
|
||
UNION_VALUE_CHANGE_TYPEDEF stSerialCode ;
|
||
uint8_t i=0;
|
||
uint16_t u16Year = 0;
|
||
uint16_t u16Month = 0;
|
||
uint8_t u8Day = 0;
|
||
uint16_t u16Date =0;
|
||
|
||
if(pstJQUID->u8ArrayJQUidCode[7] != _CalcCrc8(pstJQUID->u8ArrayJQUidCode,7))
|
||
return false;
|
||
|
||
pstYMUID->ucArrayYMUidCode[0] = pstJQUID->u8ArrayJQUidCode[0]/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[1] = pstJQUID->u8ArrayJQUidCode[0]%10+0x30;
|
||
|
||
|
||
|
||
pstYMUID->ucArrayYMUidCode[4] = pstJQUID->u8ArrayJQUidCode[1];//特征码
|
||
|
||
u16Date = pstJQUID->u8ArrayJQUidCode[2];
|
||
u16Date = u16Date<<8 | pstJQUID->u8ArrayJQUidCode[3];
|
||
|
||
u16Year = (u16Date>>9)&0x7F;
|
||
u16Month = (u16Date>>5)&0x0F;
|
||
u8Day = u16Date&0x1F;
|
||
|
||
pstYMUID->ucArrayYMUidCode[2] = u16Year/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[3] = u16Year%10+0x30;
|
||
|
||
pstYMUID->ucArrayYMUidCode[5] = u16Month/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[6] = u16Month%10+0x30;
|
||
|
||
pstYMUID->ucArrayYMUidCode[7] = u8Day/10+0x30;
|
||
pstYMUID->ucArrayYMUidCode[8] = u8Day%10+0x30;
|
||
|
||
|
||
memcpy(stSerialCode.u8Val+1,pstJQUID->u8ArrayJQUidCode+4,3);
|
||
stSerialCode.u32Value = UINT32_ENDIAN_CHANGE( stSerialCode.u32Value);
|
||
|
||
pstYMUID->ucArrayYMUidCode[DEF_YM_SPECIALCODE_INDEX] = (stSerialCode.u32Value>>17) & 0x7F;
|
||
stSerialCode.u32Value = stSerialCode.u32Value&0x1FFFF;
|
||
|
||
for(i=14;i>=10;i--)
|
||
{
|
||
pstYMUID->ucArrayYMUidCode[i] = (stSerialCode.u32Value%10+0x30);
|
||
stSerialCode.u32Value = stSerialCode.u32Value/10;
|
||
|
||
}
|
||
|
||
|
||
if(!YMUid_Valid_check(pstYMUID->ucArrayYMUidCode))
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
bool UidCode_YM2JQ(PST_JQUID_TYPEDEF pstJQUID,const PST_YMUID_TYPEDEF pstYMUID)
|
||
{
|
||
UNION_VALUE_CHANGE_TYPEDEF stSerialCode ;
|
||
uint8_t i=0;
|
||
uint16_t u16Year = 0;
|
||
uint16_t u16Month = 0;
|
||
uint8_t u8Day = 0;
|
||
uint16_t u16Date =0;
|
||
|
||
if(!YMUid_Valid_check(pstYMUID->ucArrayYMUidCode))
|
||
return false;
|
||
|
||
|
||
|
||
stSerialCode.u32Value = 0;
|
||
|
||
pstJQUID->u8ArrayJQUidCode[0] = (pstYMUID->ucArrayYMUidCode[0]-0x30)*10 + (pstYMUID->ucArrayYMUidCode[1]-0x30);//企业代码
|
||
pstJQUID->u8ArrayJQUidCode[1] = pstYMUID->ucArrayYMUidCode[4];//特征码
|
||
|
||
u16Year = (pstYMUID->ucArrayYMUidCode[2]-0x30)*10 + (pstYMUID->ucArrayYMUidCode[3]-0x30);
|
||
u16Month = (pstYMUID->ucArrayYMUidCode[5]-0x30)*10 + (pstYMUID->ucArrayYMUidCode[6]-0x30);
|
||
u8Day = (pstYMUID->ucArrayYMUidCode[7]-0x30)*10 + (pstYMUID->ucArrayYMUidCode[8]-0x30);
|
||
u16Date = (u16Year&0x7F)<<9|(u16Month&0x0F)<<5|(u8Day&0x1F);
|
||
pstJQUID->u8ArrayJQUidCode[2] = (u16Date&0xFF00)>>8;
|
||
pstJQUID->u8ArrayJQUidCode[3] = (u16Date&0x00FF);
|
||
|
||
|
||
for(i=10;i<15;i++)
|
||
{
|
||
stSerialCode.u32Value = stSerialCode.u32Value*10 + (pstYMUID->ucArrayYMUidCode[i]-0x30);
|
||
}
|
||
|
||
stSerialCode.u32Value |= pstYMUID->ucArrayYMUidCode[DEF_YM_SPECIALCODE_INDEX]<<17;
|
||
stSerialCode.u32Value = UINT32_ENDIAN_CHANGE(stSerialCode.u32Value);;
|
||
|
||
memcpy(pstJQUID->u8ArrayJQUidCode+4,stSerialCode.u8Val+1,3);
|
||
|
||
pstJQUID->u8ArrayJQUidCode[7] = _CalcCrc8(pstJQUID->u8ArrayJQUidCode,7);
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
//============================================================================//
|
||
//8位CRC效验计算,只计算缓存区前6个字节
|
||
//输入参数:需要计算数据缓存区头指针
|
||
//返 回 值:效验值
|
||
//============================================================================//
|
||
static uint8_t _CalcCrc8(uint8_t *Ptr,uint8_t num)
|
||
{
|
||
uint8_t i,j,crc = 0;
|
||
|
||
for (j = 0; j < num; j++)
|
||
{
|
||
crc ^= *(Ptr+j);
|
||
for ( i = 0; i < 8; i++)
|
||
{
|
||
if ((crc & 0x01) != 0)
|
||
{
|
||
crc >>= 1;
|
||
crc ^= 0x8c;
|
||
}
|
||
else
|
||
{
|
||
crc >>= 1;
|
||
}
|
||
}
|
||
}
|
||
return crc;
|
||
}
|
||
|
||
static bool YMUid_Valid_check(uint8_t *u8ArrayYMUid)
|
||
{
|
||
uint8_t i=0;
|
||
uint8_t u8ValidDataCounter = 0;
|
||
|
||
for(i=0;i<15;i++)
|
||
{
|
||
if(u8ArrayYMUid[i] >= '0' && u8ArrayYMUid[i] <= '9')
|
||
{
|
||
u8ValidDataCounter++;
|
||
continue;
|
||
}
|
||
if(u8ArrayYMUid[i] >= 'A' && u8ArrayYMUid[i] <= 'Z')
|
||
{
|
||
u8ValidDataCounter++;
|
||
continue;
|
||
}
|
||
if(u8ArrayYMUid[i] >= 'a' && u8ArrayYMUid[i] <= 'z')
|
||
{
|
||
u8ValidDataCounter++;
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if(u8ValidDataCounter < 7)
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
static uint32_t UINT32_ENDIAN_CHANGE(uint32_t val)
|
||
{
|
||
|
||
return ((( val & 0x000000ff)<< 24 ) | ( ( val & 0x0000ff00 ) << 8 ) | ( ( val & 0x00ff0000 ) >> 8 ) | ( ( val & 0xff000000 ) >> 24 ));
|
||
}
|
||
|