optical/NxFuncs/comm/mtcomm.c

461 lines
8.8 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#define _IN_MTCOMM_C
#include "mtcomm.h"
#include "crc8.h"
#include "trigger.h"
//------------------------------------------------------
//------------------------------------------------------
typedef struct
{
MtCommExFuncs commExFuncs; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MtCommPacket sendPacket; // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݰ<EFBFBD>
MtCommPacket resvPacket; // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><CCBF><EFBFBD>
int transEnable; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; 1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int transId; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ID
int sendStatus; // <20><><EFBFBD><EFBFBD>״̬, 0, <20><><EFBFBD><EFBFBD>; 1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; 2<><32><EFBFBD><EFBFBD><EFBFBD>ջذ<D5BB><D8B0><EFBFBD>; 3, <20><><EFBFBD>ɡ<EFBFBD>
int sendResult; // <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>, 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>ͳɹ<CDB3><C9B9><EFBFBD> 2<><32> <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD> 3<><33><EFBFBD>ȴ<EFBFBD><C8B4>ذ<EFBFBD><D8B0>ɹ<EFBFBD><C9B9><EFBFBD>4<EFBFBD><34> <20>ȴ<EFBFBD><C8B4>ذ<EFBFBD><D8B0><EFBFBD>ʱ
int sendSteps; // <20><><EFBFBD>Ϳ<EFBFBD><CDBF>Ʋ<EFBFBD><C6B2><EFBFBD>
int hasBack; // <20>Ƿ<EFBFBD><C7B7>лذ<D0BB><D8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ȴ<EFBFBD><C8B4>ذ<EFBFBD><D8B0><EFBFBD>
int resvStatus; // <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC> 0<><30> <20><><EFBFBD><EFBFBD>; 1, <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; 2, <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݰ<EFBFBD>; 3. <20><><EFBFBD><EFBFBD>ֹͣ
u32 ustimer;
}MtCommCtrl;
MtCommCtrl g_mtCommCtrl;
//------------------------------------------------------
// <20><>ʼ<EFBFBD><CABC>
// ע<><D7A2><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>485<38><35><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
void InitMtComm(MtCommExFuncs * pExFuncs)
{
memset(&g_mtCommCtrl, 0, sizeof(MtCommCtrl));
if (pExFuncs != NULL)
{
memcpy(&(g_mtCommCtrl.commExFuncs), pExFuncs, sizeof(MtCommExFuncs));
}
}
// <20><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>̡<EFBFBD>
// <20><>Ҫ<EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>
void MtCommAsyncTask(void)
{
if (g_mtCommCtrl.transEnable == 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
switch (g_mtCommCtrl.sendSteps)
{
case 0:
g_mtCommCtrl.sendStatus = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_mtCommCtrl.sendResult = 0;
g_mtCommCtrl.sendSteps++;
break;
case 1: // <20>򿪷<EFBFBD><F2BFAAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (g_mtCommCtrl.commExFuncs.Set485TxEnOn != NULL)
{
g_mtCommCtrl.commExFuncs.Set485TxEnOn(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
g_mtCommCtrl.ustimer = GetUsSoftTimer();
g_mtCommCtrl.sendSteps++;
break;
}
case 2: // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч, <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
{
u32 thisus;
thisus = GetUsSoftTimer();
if (thisus - g_mtCommCtrl.ustimer > 200)
{
if (g_mtCommCtrl.commExFuncs.SendMtCommData != NULL)
{
g_mtCommCtrl.commExFuncs.SendMtCommData((u8*)&g_mtCommCtrl.sendPacket, LEN_MTCOMM_PKT); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
g_mtCommCtrl.sendSteps++;
}
break;
}
case 3: // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
int freelen = 0;
if (g_mtCommCtrl.commExFuncs.GetTrsFreeLen != NULL)
{
freelen = g_mtCommCtrl.commExFuncs.GetTrsFreeLen();
}
if (freelen <= 0)
{
g_mtCommCtrl.ustimer = GetUsSoftTimer();
g_mtCommCtrl.sendSteps++;
}
break;
}
case 4: // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>رշ<D8B1><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
u32 thisus;
thisus = GetUsSoftTimer();
if (thisus - g_mtCommCtrl.ustimer > 200)
{
if (g_mtCommCtrl.commExFuncs.Set485TxEnOff != NULL)
{
g_mtCommCtrl.commExFuncs.Set485TxEnOff(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
}
g_mtCommCtrl.sendSteps++;
}
break;
}
case 5:
{
if (g_mtCommCtrl.hasBack != 0) // <20><><EFBFBD><EFBFBD><EFBFBD>лذ<D0BB>
{
g_mtCommCtrl.sendStatus = 2; // <20>ȴ<EFBFBD><C8B4>ذ<EFBFBD>״̬
g_mtCommCtrl.ustimer = GetUsSoftTimer(); // <20><>¼ʱ<C2BC><CAB1><EFBFBD><EFBFBD>
g_mtCommCtrl.resvStatus = 0;
g_mtCommCtrl.transEnable = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
g_mtCommCtrl.sendStatus = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_mtCommCtrl.sendResult = 1; // <20><><EFBFBD>ͳɹ<CDB3>
g_mtCommCtrl.transEnable = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
break;
}
default:
{
g_mtCommCtrl.sendStatus = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_mtCommCtrl.sendResult = 2; // <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
g_mtCommCtrl.transEnable = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
}
}
}
else if (g_mtCommCtrl.transEnable == 2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
int rsvlen = 0;
g_mtCommCtrl.resvStatus = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (g_mtCommCtrl.commExFuncs.Set485TxEnOff != NULL) // <20>رշ<D8B1><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
g_mtCommCtrl.commExFuncs.Set485TxEnOff(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
}
if (g_mtCommCtrl.commExFuncs.GetMtRsvLen != NULL)
{
rsvlen = g_mtCommCtrl.commExFuncs.GetMtRsvLen(); // <20>õ<EFBFBD><C3B5>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
}
if (rsvlen >= LEN_MTCOMM_PKT) // <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȹ<EFBFBD>
{
if (g_mtCommCtrl.commExFuncs.GetMtCommData != NULL)
{
g_mtCommCtrl.commExFuncs.GetMtCommData((u8*)&g_mtCommCtrl.resvPacket, LEN_MTCOMM_PKT); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
if (g_mtCommCtrl.hasBack != 0) // <20><><EFBFBD><EFBFBD><EFBFBD>лذ<D0BB>
{
g_mtCommCtrl.hasBack = 0;
g_mtCommCtrl.sendStatus = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_mtCommCtrl.sendResult = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
}
g_mtCommCtrl.resvStatus = 2; // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
g_mtCommCtrl.ustimer = GetUsSoftTimer(); // <20><>¼ʱ<C2BC><CAB1><EFBFBD><EFBFBD>
g_mtCommCtrl.transEnable = 0; // <20>رմ<D8B1><D5B4><EFBFBD>
}
else
{
if (g_mtCommCtrl.hasBack != 0) // <20><><EFBFBD><EFBFBD><EFBFBD>лذ<D0BB>
{
u32 thisus;
thisus = GetUsSoftTimer();
if (thisus - g_mtCommCtrl.ustimer > 10000) // 10ms <20><>ʱ
{
g_mtCommCtrl.resvStatus = 3; // <20><><EFBFBD><EFBFBD>ֹͣ
g_mtCommCtrl.hasBack = 0;
g_mtCommCtrl.sendStatus = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_mtCommCtrl.sendResult = 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
g_mtCommCtrl.transEnable = 0; // <20>رմ<D8B1><D5B4><EFBFBD>
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>
}
}
}
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ʲôҲ<C3B4><D2B2><EFBFBD><EFBFBD>
{
}
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>CRC
int PacketAMtComm(MtCommPacket * pPacket)
{
if (pPacket == NULL)
{
return -1;
}
memcpy(pPacket->sync, MTCOMM_SYNC, MT_SYNC_LEN);
pPacket->crc8 = CalcCrc8((u8*)pPacket, MT_CHECK_LEN);
return 0;
}
// У<><D0A3>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><>֤ͬ<D6A4><CDAC><EFBFBD>ֺ<EFBFBD>CRC
// <20><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int CheckAMtPacket(MtCommPacket * pPacket)
{
int rslt;
if (pPacket == NULL)
{
return -1;
}
rslt = memcmp(pPacket->sync, MTCOMM_SYNC, MT_SYNC_LEN);
if (rslt == 0)
{
u8 crc;
crc = CalcCrc8((u8*)pPacket, MT_CHECK_LEN);
if (pPacket->crc8 != crc)
{
rslt = -2;
}
}
return rslt;
}
// <20><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>buff
void ReadMtCommBuffEmpty(void)
{
int rslt, len;
u8 temp;
len = 0;
if (g_mtCommCtrl.commExFuncs.GetMtRsvLen != NULL)
{
len = g_mtCommCtrl.commExFuncs.GetMtRsvLen();
}
while (len > 0)
{
if (g_mtCommCtrl.commExFuncs.GetMtCommData != NULL)
{
rslt = g_mtCommCtrl.commExFuncs.GetMtCommData(&temp, 1);
}
else
{
break;
}
if (rslt != 1)
{
rslt = 0;
break;
}
len--;
}
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>ID
int SendAMtPacket(MtCommPacket * pPacket, int hasback)
{
if (pPacket == NULL)
{
return -1;
}
if (g_mtCommCtrl.sendStatus != 0 || g_mtCommCtrl.sendStatus != 3)
{
return -2;
}
g_mtCommCtrl.transEnable = 0;
g_mtCommCtrl.sendStatus = 0;
g_mtCommCtrl.sendResult = 0;
g_mtCommCtrl.sendSteps = 0;
// <20>Ƿ<EFBFBD><C7B7>ȴ<EFBFBD><C8B4>ذ<EFBFBD>
g_mtCommCtrl.hasBack = hasback;
g_mtCommCtrl.transId++; // <20><><EFBFBD><EFBFBD> ID <20><><EFBFBD><EFBFBD>
if (g_mtCommCtrl.transId < 10 || g_mtCommCtrl.transId > 10000000)
{
g_mtCommCtrl.transId = 10;
}
memcpy(&g_mtCommCtrl.sendPacket, pPacket, LEN_MTCOMM_PKT);
g_mtCommCtrl.transEnable = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return g_mtCommCtrl.transId; // <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʹ<D1AF><CAB9>
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
int GetSendStatus(int id)
{
int sta;
if (g_mtCommCtrl.transId != id)
{
return -1;
}
sta = g_mtCommCtrl.sendStatus;
if (sta == 3)
{
g_mtCommCtrl.sendStatus = 0; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
}
return sta;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
int GetSendResult(int id)
{
if (g_mtCommCtrl.transId != id)
{
return -1;
}
return g_mtCommCtrl.sendResult;
}
// <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD> <20>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pPacket<65><74>
int GetAMtPacket(MtCommPacket * pPacket)
{
if (g_mtCommCtrl.transEnable != 2) // <20>ǽ<EFBFBD><C7BD><EFBFBD>״̬
{
g_mtCommCtrl.transEnable = 0;
g_mtCommCtrl.resvStatus = 0;
ReadMtCommBuffEmpty();
g_mtCommCtrl.transEnable = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
#define MAX_MTCOMM_SCAN 128 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (1)
{
int rslt, len;
int i;
int phase;
u8 temp;
u8 rdBuf[LEN_MTCOMM_PKT];
MtCommPacket * pDat;
if (pPacket == NULL ||
g_mtCommCtrl.commExFuncs.GetMtRsvLen == NULL ||
g_mtCommCtrl.commExFuncs.GetMtCommData == NULL ||
0 )
{
return -1;
}
i = 0; // ɨ<><C9A8><EFBFBD>ֽڼ<D6BD><DABC><EFBFBD><EFBFBD><EFBFBD>
pDat = (MtCommPacket *)rdBuf;
do
{
len = g_mtCommCtrl.commExFuncs.GetMtRsvLen();
if (len < LEN_MTCOMM_PKT)
{
rslt = -3;
break; // û<><C3BB><EFBFBD><EFBFBD><E3B9BB><EFBFBD><EFBFBD>
}
phase = 0;
rslt = 0;
// <20>ӽ<EFBFBD><D3BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
while(((len + phase) >= LEN_MTCOMM_PKT) && (phase < LEN_MTCOMM_PKT))
{
if (phase == 0 && i > MAX_MTCOMM_SCAN)
{
rslt = -4;
break; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󵥴<EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
}
rslt = g_mtCommCtrl.commExFuncs.GetMtCommData(&temp, 1); // <20><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
if (rslt != 1)
{
printf("error at GetMtCommData rslt\r\n");
rslt = -8;
break;
}
rslt = 0;
i++; // ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
len--; // ʣ<><EFBFBD>ȼ<EFBFBD>С
if (phase < MT_SYNC_LEN) // ʶ<><CAB6>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (temp != MTCOMM_SYNC[phase])
{
phase = 0;
rslt = 0;
break;
}
}
rdBuf[phase] = temp; // <20><><EFBFBD><EFBFBD>
phase++;
}
if (rslt != 0)
{
break;
}
if (phase >= LEN_MTCOMM_PKT) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
{
u8 crc8;
crc8 = CalcCrc8(rdBuf, MT_CHECK_LEN);
if (crc8 == pDat->crc8)
{
// <20>õ<EFBFBD><C3B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD>
memcpy(pPacket, pDat, LEN_MTCOMM_PKT);
// printf("GetAMtCommPacket ok\r\n");
rslt = LEN_MTCOMM_PKT;
break;
}
else
{
// CRC <20><><EFBFBD><EFBFBD>ȷ
printf("1. crc error in GetAMtCommPacket\r\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>жϵ<D0B6><CFB5><EFBFBD><EFBFBD><EFBFBD>
// continue;
}
}
else
{
// û<><C3BB><EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
// continue;
}
}while(1);
return rslt;
}
}