移植到stm32f1,实现手动线赋码控制器功能

This commit is contained in:
ranchuan
2023-09-09 17:27:06 +08:00
parent 8d779a68f3
commit 7baa63de05
382 changed files with 36618 additions and 148064 deletions

View File

@@ -0,0 +1,86 @@
#include "JQ_PSDGenerate.h"
/********************************************************************************************************************
* 新版密码支持BCD码 *
********************************************************************************************************************/
static u32 GetSpecialCodeIndex(u8 ucSpecialCode)
{
if (ucSpecialCode >= '0' && ucSpecialCode <= '9')
{
return ucSpecialCode - 0x30;
}
else if (ucSpecialCode >= 'A' && ucSpecialCode <= 'Z')
{
return ucSpecialCode - 'A' + 10;
}
else if (ucSpecialCode >= 'a' && ucSpecialCode <= 'z')
{
return ucSpecialCode - 'a' + 36;
}
else
return 63;
}
static u32 GetiDateInfo(u8 *ucpDate)
{
u8 ucMonth = ucpDate[0]*10 + ucpDate[1];
u8 ucDay = ucpDate[2]*10 + ucpDate[3];
return ucMonth << 5 | ucDay;
}
//public static string GetPasswordByShellCode(string shellcode)
//{
// string ssp = shellcode.Substring(7, 1);
// string sdate = shellcode.Substring(3, 4);
// string sindex = shellcode.Substring(8, 5);
// UInt32 u32BCD = (UInt32)(((GetiDateInfo(sdate) & 0x1FF) << 23) |
// ((GetSpecialCodeIndex(ssp) & 0x3F) << 17) |
// (GetiIndex(sindex) & 0x1FFFF));
// return U32tohexstr(u32BCD);
//}
u8 JQ_GetPasswordByUidCode(const u8 *uidcode,u8* psd)
{
u8 ucSpecialCode = 0;
u8 usaDate[4] = {0};
u32 ulIndex = 0;
u32 ulBCDPsd = 0;
u8 i=0;
//581900230A12345
ucSpecialCode = uidcode[9];
for(i=5;i<9;i++)
usaDate[i-5] = uidcode[i]-0x30;
for(i=10;i<15;i++)
{
ulIndex *= 10;
ulIndex += (uidcode[i]-0x30);
}
ulBCDPsd = (GetiDateInfo(usaDate) & 0x1FF) << 23 |
(GetSpecialCodeIndex(ucSpecialCode) & 0x3F) << 17 |
ulIndex & 0x1FFFF;
// psd[0] = (ulBCDPsd&0xFF000000)>>24;
// psd[1] = (ulBCDPsd&0x00FF0000)>>16;
// psd[2] = (ulBCDPsd&0x0000FF00)>>8;
// psd[3] = ulBCDPsd&0x000000FF;
// 反序
psd[3] = (ulBCDPsd&0xFF000000)>>24;
psd[2] = (ulBCDPsd&0x00FF0000)>>16;
psd[1] = (ulBCDPsd&0x0000FF00)>>8;
psd[0] = ulBCDPsd&0x000000FF;
return 0;
}

View File

@@ -0,0 +1,13 @@
#ifndef __JQ_PSDGENERATE_H__
#define __JQ_PSDGENERATE_H__
#include <stdio.h>
#include <stdbool.h>
#include "stm32f10x.h"
u8 JQ_GetPasswordByUidCode(const u8 *uidcode,u8* psd);
#endif

View File

@@ -0,0 +1,250 @@
#include "JQ_UIDGenerate.h"
#include "stm32f10x.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 u8 _CalcCrc8(u8 *Ptr,u8 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;
u16 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 u8 _CalcCrc8(u8 *Ptr,u8 num)
{
u8 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 ));
}

View File

@@ -0,0 +1,37 @@
#ifndef __JQ_UIDGENERATE_H__
#define __JQ_UIDGENERATE_H__
#include <stdio.h>
#include <stdbool.h>
#include "stm32f10x.h"
#define DEF_YM_SPECIALCODE_INDEX 9
#pragma pack(1)
typedef struct
{
unsigned char ucArrayYMUidCode[15];
}ST_YMUID_TYPEDEF,*PST_YMUID_TYPEDEF;
typedef struct
{
uint8_t u8ArrayJQUidCode[8];
}ST_JQUID_TYPEDEF,*PST_JQUID_TYPEDEF;
typedef union
{
uint32_t u32Value;
uint8_t u8Val[4];
}UNION_VALUE_CHANGE_TYPEDEF,*PST_VALUE_CHANGE_TYPEDEF;
#pragma pack()
bool UidCode_YM2JQ(PST_JQUID_TYPEDEF pstJQUID,const PST_YMUID_TYPEDEF pstYMUID);
bool UidCode_JQ2YM(const PST_JQUID_TYPEDEF pstJQUID,PST_YMUID_TYPEDEF pstYMUID);
bool UidCode_JQ2YM_NoBackwardSequence(const PST_JQUID_TYPEDEF pstJQUID,PST_YMUID_TYPEDEF pstYMUID);
#endif

View File

@@ -197,12 +197,91 @@ uint8_t coder_judge(const uint8_t *data)
}
// 检测电容
TASK_FIND_NEXT(8);
TASK_FIND_NEXT(12);
temp=TASK_DATA(0);
if((temp>task->range[0].max)||(temp<task->range[0].min))
{
return 2;
}
// temp=TASK_DATA(1);
// if((temp>task->range[1].max)||(temp<task->range[1].min))
// {
// return 2;
// }
// temp=TASK_DATA(2);
// if((temp>task->range[2].max)||(temp<task->range[2].min))
// {
// return 2;
// }
return 0;
}
uint8_t coder_judge_jq(const uint8_t *data)
{
int temp,temp2;
int index=0;
const scheme_task_def *task=0;
// 开总线
TASK_FIND_NEXT(0);
{
if(get_ack(data,0))
{
// 上电错误,检测器异常
return 1;
}
}
// 上电充能
TASK_FIND_NEXT(1);
{
temp=TASK_DATA(0);
if(temp<task->range[0].min)
{
// 电压无法上升,检测器异常
return 1;
}
temp=TASK_DATA(1);
if((temp>39000)||(temp<1)){
// 充能失败,检测电流
}
}
// 检测uid
int chip_err=0;
TASK_FIND_NEXT(4);
if(get_ack(data,task->taskindex))
{
// 芯片错误
chip_err=5;
}
// 检测电流
TASK_FIND_NEXT(3);
temp=TASK_DATA(0);
temp2=TASK_DATA(1);
if((temp<10)&&(temp2<10))
{
// 接触异常
return 3;
}
else if(((temp>task->range[0].max)&&(temp<1500))||
((temp2>task->range[0].max)&&(temp2<1500)))
{
// 过流
return 7;
}else if((temp>1500)&&(temp2>1500))
{
// 短路
return 8;
}
// 检测电容
TASK_FIND_NEXT(11);
temp=TASK_DATA(1);
if((temp>task->range[1].max)||(temp<task->range[1].min))
{
@@ -214,8 +293,27 @@ uint8_t coder_judge(const uint8_t *data)
return 2;
}
return 0;
return chip_err;
}
// 根据方案获取模块芯片类型
int coder_extract_chip(int id)
{
const scheme_def *s=check_scheme();
if(id==0) id=s->plan_id;
// 日bit0~bit4 月bit5~bit8 年bit9~bit15
int sid=(id>>0)&0x7f;
int modele=(id>>7)&0x1f;
int chip=(id>>12)&0xf;
int day=(id>>16)&0x1f;
int month=(id>>21)&0xf;
int year=((id>>25)&0x7f)+2022;
return chip;
}

View File

@@ -7,7 +7,9 @@
uint8_t coder_judge(const uint8_t *data);
uint8_t coder_judge_jq(const uint8_t *data);
int coder_extract_chip(int id);

View File

@@ -111,6 +111,27 @@ int coder_shell_to_uid(const char *year,const char *shell_code,char *uid_code)
// JQ管壳码转uid码
int coder_shell_to_uid_jq(const char *year,const char *shell_code,char *uid_code)
{
int ret=0;
memset(uid_code,0,16);
// 添加雷管厂代号(2byte)
memcpy(&uid_code[0],&shell_code[0],2);
// 添加年份(2y=byte)
ret=coder_calc_year(year,shell_code[2],&uid_code[2]);
// 添加0(1byte)
memcpy(&uid_code[4],"0",1);
// 添加月日特征码流水号
memcpy(&uid_code[5], &shell_code[3],10);
return ret;
}
// 转换hex字符串为一个byte
static int coder_strhex_to_byte(const char *str_hex)
{
@@ -212,3 +233,5 @@ int coder_uid_to_shell(const char *uid_code,char *shell_code)

View File

@@ -26,7 +26,8 @@ int coder_uid_to_shell(const char *uid_code,char *shell_code);
// JQ管壳码转UID
int coder_shell_to_uid_jq(const char *year,const char *shell_code,char *uid_code);