diff --git a/common/SH_CommonFunc.hpp b/common/SH_CommonFunc.hpp index 135a685..a6366ba 100644 --- a/common/SH_CommonFunc.hpp +++ b/common/SH_CommonFunc.hpp @@ -55,6 +55,10 @@ typedef struct statfs DISK,*pDISK; #define BUILD_UINT2(x,y) (((x) << 2u) | (y)) // 生成UINT32 数据 #define BUILD_UINT32(u,v,x,y) (((u & 0x00FFu) << 24u) | (v & 0x00FFu) << 16u) | (((x & 0x00FFu) << 8u) | (y & 0x00FFu)) + +// 生成UINT64 数据 +#define BUILD_UINT48(u,v,x,y,x1,y1) ( ((u & 0x00FFu) << 40u)| ((u & 0x00FFu) << 32u) |((x & 0x00FFu) << 24u) | (y & 0x00FFu) << 16u) | (((x1 & 0x00FFu) << 8u) | (y1 & 0x00FFu)) + // 获取UINT32的高低字节 #define UINT32_HIGH_1(x) ((x & 0xFF000000u) >> 24u) #define UINT32_HIGH_2(x) ((x & 0x00FF0000u) >> 16u) diff --git a/common/SH_global.h b/common/SH_global.h index 606fabe..614818d 100644 --- a/common/SH_global.h +++ b/common/SH_global.h @@ -24,8 +24,8 @@ enum enumZigBeeTransmitStatus { //#define Q4G_MODULE //#define WIFI_MODULE //#define NR5G_MEIGE -#define G2UL_GATEWAY -//#define IMX6UL_GATEWAY +//#define G2UL_GATEWAY +#define IMX6UL_GATEWAY class GlobalConfig { diff --git a/jsonparse/SH_JsonCmd.cpp b/jsonparse/SH_JsonCmd.cpp index ecd8fb6..0c43d18 100644 --- a/jsonparse/SH_JsonCmd.cpp +++ b/jsonparse/SH_JsonCmd.cpp @@ -568,6 +568,7 @@ void JsonData::DataNodeStatusCheck() int lNowTime = atoi(nowTimetamp.c_str()); int onlineCheck = readIntValue( "config", "online",(char*)GlobalConfig::Config_G.c_str()); int loseTime = readIntValue( "config", "loseTime",(char*)GlobalConfig::Config_G.c_str()); + int nodeOnline = readIntValue( "config", "nodeOnline",(char*)GlobalConfig::Config_G.c_str()); int count = 0; if (nSize > 0) { for (int i = 0; i < nSize; i++) { @@ -606,7 +607,7 @@ void JsonData::DataNodeStatusCheck() } } } - if (count == nSize) + if (count == nSize && nodeOnline) { LOG_ERROR("ALL Node offline,count = %d\n",count); exit(0); diff --git a/uart/SH_Uart.cpp b/uart/SH_Uart.cpp index f667e0c..958f2f8 100644 --- a/uart/SH_Uart.cpp +++ b/uart/SH_Uart.cpp @@ -210,9 +210,9 @@ Uart::Uart():mUart(mIoSev),mStrand(mIoSev) m_waveCountX = 0; m_waveCountY = 0; m_waveCountZ = 0; - VecWaveDataX.reserve(300000); - VecWaveDataY.reserve(300000); - VecWaveDataZ.reserve (500000); + VecWaveDataX.reserve(1000); + VecWaveDataY.reserve(1000); + VecWaveDataZ.reserve (1500); } Uart::~Uart() { @@ -2059,7 +2059,7 @@ void Uart::DealDataNodeFeature(const char *pData, int flag) //根据数据包中的传感器的短地址获取数据库中长地址(MAC),在下面判断该传感器是否存在,如果不存在则把数据包丢弃 sprintf(getLongAddr_sql, "zigbeeShortAddr='%s'", strShortAddr.c_str()); //std::string strLongAddr = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(ZIGBEELONGADDR), getLongAddr_sql); - vec_t vecResult = sql_ctl->GetDataSingleLine(T_SENSOR_INFO(TNAME)," softVersion,dataNodeNo,MeasurementID ",getLongAddr_sql); + vec_t vecResult = sql_ctl->GetDataSingleLine(T_SENSOR_INFO(TNAME)," softVersion,dataNodeNo,MeasurementID,ProductNo ",getLongAddr_sql); if (vecResult.size() < 1) { LOG_ERROR("device info not found %02x%02x\n",pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]); @@ -2070,6 +2070,7 @@ void Uart::DealDataNodeFeature(const char *pData, int flag) std::string strLongAddr = vecResult[1]; std::string strMeasurementID = vecResult[2]; + std::string strProductNo = vecResult[3]; if (1 == flag) { tcflush(fd,TCIOFLUSH); @@ -2122,9 +2123,42 @@ void Uart::DealDataNodeFeature(const char *pData, int flag) tempchannel.compressChannelX = GET_BIT(compressChannel ,0); tempchannel.compressChannelY = GET_BIT(compressChannel ,2); tempchannel.compressChannelZ = GET_BIT(compressChannel ,4); - tempchannel.CountX = BUILD_UINT16(pRecvData->Data[55],pRecvData->Data[54]); - tempchannel.CountY = BUILD_UINT16(pRecvData->Data[57],pRecvData->Data[56]); - tempchannel.CountZ = BUILD_UINT16(pRecvData->Data[59],pRecvData->Data[58]); + if (strProductNo == "01") + { + tempchannel.CountX = BUILD_UINT16(pRecvData->Data[55],pRecvData->Data[54]); + tempchannel.CountY = BUILD_UINT16(pRecvData->Data[57],pRecvData->Data[56]); + tempchannel.CountZ = BUILD_UINT16(pRecvData->Data[59],pRecvData->Data[58]); + }else if (strProductNo == "02") + { + int CountX = 0; + int CountY = 0; + int CountZ = 0; + unsigned char buffer[6]={0x00}; + + memcpy(buffer,&pRecvData->Data[55],1); + memcpy(buffer + 1,&pRecvData->Data[54],1); + memcpy(buffer + 2,&pRecvData->Data[57],1); + memcpy(buffer + 3,&pRecvData->Data[56],1); + memcpy(buffer + 4,&pRecvData->Data[59],1); + memcpy(buffer + 5,&pRecvData->Data[58],1); + + uint64_t packed_data = 0; + for (int i = 0; i < 6; i++) { + packed_data |= (uint64_t)buffer[i] << (8 * (5 - i)); // 从高位开始组合 + } + // 输出结果 + printf("Resulting 48-bit integer: 0x%012llX\n", packed_data); + // 提取 15 位的第一个数据 + tempchannel.CountX = (packed_data >> 33) & 0x7FFF; // 提取最高的 15 位 + + // 提取 15 位的第二个数据 + tempchannel.CountY = (packed_data >> 18) & 0x7FFF; // 提取中间的 15 位 + // 提取 18 位的第三个数据 + tempchannel.CountZ = packed_data & 0x3FFFF; // 提取最低的 18 位 + + + } + g_mapCompress[strShortAddr] = tempchannel; print_info("count X = %d,Y = %d,Z = %d\n",tempchannel.CountX,tempchannel.CountY,tempchannel.CountZ); @@ -3691,9 +3725,10 @@ std::vector Uart::DealData(int iChannel,float coe,int sampleRate,int ACCS compress = g_mapCompress[strShortAddr].compressChannelZ; count = g_mapCompress[strShortAddr].CountZ; } + print_info("len = %d,data = %02x,iChannel = %d,compress = %d,count = %d\n",j,data[0],iChannel,compress,count); if(j * 92 < count) return vecData; - print_info("len = %d,data = %02x,iChannel = %d,compress = %d,count = %d\n",j,data[0],iChannel,compress,count); + if(compress){ print_info("iChannel = %d,compress = %d\n",iChannel,compress); int r = lzo1x_decompress(data,count,outdata,&new_len,NULL); @@ -3812,7 +3847,7 @@ void Uart::DealWave() } if (m_waveCountY > 0 || VecWaveDataY.size() > 0) { - print_info("m_waveCountX = %d,VecWaveData = %d\n",m_waveCountY,VecWaveDataY.size()); + print_info("m_waveCountY = %d,VecWaveData = %d\n",m_waveCountY,VecWaveDataY.size()); coe = Calcoe(n,4,strProduct,range); vecData = DealData(4,coe,sampleRate,ACCSampleTime,strProduct); WriteDatFile(sampleRate, strMeasurementID, 4,vecData);