Initial Commit

main
BlueMatthew 1 year ago
parent 028aef0ce7
commit df99be7d50

@ -0,0 +1,31 @@
d:\project\htslvservice\debug\vc120.pdb
d:\project\htslvservice\debug\vc120.idb
d:\project\htslvservice\debug\static_model.obj
d:\project\htslvservice\debug\htbusidatabase.obj
d:\project\htslvservice\debug\htconfig.obj
d:\project\htslvservice\debug\htdatabase.obj
d:\project\htslvservice\debug\htglobal.obj
d:\project\htslvservice\debug\htinitutils.obj
d:\project\htslvservice\debug\htlogger.obj
d:\project\htslvservice\debug\htmodbus.obj
d:\project\htslvservice\debug\htpublic.obj
d:\project\htslvservice\debug\htslvservice.obj
d:\project\htslvservice\debug\htstrconvert.obj
d:\project\htslvservice\debug\httcpsocket.obj
d:\project\htslvservice\debug\htthread.obj
d:\project\htslvservice\debug\htunit.obj
d:\project\htslvservice\debug\htxmlmethod.obj
d:\project\htslvservice\debug\htntptime.obj
d:\project\htslvservice\debug\htsntpc.obj
d:\project\htslvservice\debug\htsntpd.obj
d:\project\htslvservice\debug\htiec61850.obj
d:\project\htslvservice\debug\htiec61850thread.obj
d:\project\htslvservice\debug\htslvservice.ilk
d:\project\htslvservice\debug\htslvservice.exe
d:\project\htslvservice\debug\htslvservice.pdb
d:\project\htslvservice\debug\htslvservice.tlog\cl.command.1.tlog
d:\project\htslvservice\debug\htslvservice.tlog\cl.read.1.tlog
d:\project\htslvservice\debug\htslvservice.tlog\cl.write.1.tlog
d:\project\htslvservice\debug\htslvservice.tlog\link.command.1.tlog
d:\project\htslvservice\debug\htslvservice.tlog\link.read.1.tlog
d:\project\htslvservice\debug\htslvservice.tlog\link.write.1.tlog

@ -0,0 +1,35 @@
Build started 10/26/2020 10:06:01 PM.
1>Project "D:\project\HTSLVService\HTSLVService.vcxproj" on node 2 (Build target(s)).
1>ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /Zi /nologo /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D _LIB_IEC_61850 /D _CRT_SECURE_NO_WARNINGS /D _WINSOCK_DEPRECATED_NO_WARNINGS /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TP /analyze- /errorReport:prompt src\HTSLVService.cpp
HTSLVService.cpp
1>src\HTSLVService.cpp(169): warning C4566: character represented by universal-character-name '\u00B2' cannot be represented in the current code page (936)
1>src\HTSLVService.cpp(170): warning C4566: character represented by universal-character-name '\u00B2' cannot be represented in the current code page (936)
1>src\HTSLVService.cpp(171): warning C4566: character represented by universal-character-name '\u00B2' cannot be represented in the current code page (936)
Link:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"D:\project\HTSLVService\Debug\HTSLVService.exe" /INCREMENTAL /NOLOGO modbus.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:\project\HTSLVService\Debug\HTSLVService.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:\project\HTSLVService\Debug\HTSLVService.lib" /MACHINE:X86 Debug\static_model.obj
Debug\HTBusiDatabase.obj
Debug\HTConfig.obj
Debug\HTDatabase.obj
Debug\HTGlobal.obj
Debug\HTIEC61850.obj
Debug\HTIEC61850Thread.obj
Debug\HTInitUtils.obj
Debug\HTLogger.obj
Debug\HTModbus.obj
Debug\HTPublic.obj
Debug\HTSLVService.obj
Debug\HTStrConvert.obj
Debug\HTTcpSocket.obj
Debug\HTThread.obj
Debug\HTUnit.obj
Debug\HTXmlMethod.obj
Debug\HTNtptime.obj
Debug\HTSntpc.obj
Debug\HTSntpd.obj
HTSLVService.vcxproj -> D:\project\HTSLVService\Debug\HTSLVService.exe
1>Done Building Project "D:\project\HTSLVService\HTSLVService.vcxproj" (Build target(s)).
Build succeeded.
Time Elapsed 00:00:01.57

@ -0,0 +1,2 @@
#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
Debug|Win32|D:\project\HTSLVService\|

Binary file not shown.

Binary file not shown.

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HTSLVService", "HTSLVService.vcxproj", "{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}.Debug|Win32.ActiveCfg = Debug|Win32
{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}.Debug|Win32.Build.0 = Debug|Win32
{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}.Release|Win32.ActiveCfg = Release|Win32
{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{A5344D4E-D2AE-4B18-98D9-13E88A6FAA31}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>HTSLVService</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>D:\Project\HTSLVService\include;D:\devel\mysql-5.5.60-win32\include;D:\Project\HTSLVService\include\modbus;D:\Project\HTSLVService\include\sntp;D:\devel\libiec61850\include\libiec61850;D:\project\HTSLVService\scl_tool;$(IncludePath)</IncludePath>
<LibraryPath>D:\Project\HTSLVService\libs;D:\devel\mysql-5.5.60-win32\lib;D:\devel\libiec61850\lib;D:\devel\libiec61850\bin;$(LibraryPath)</LibraryPath>
<ExecutablePath>D:\Project\HTSLVService\libiec61850-1.4.2.1\bin;$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB_IEC_61850;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>modbus.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="scl_tool\static_model.c" />
<ClCompile Include="src\HTBusiDatabase.cpp" />
<ClCompile Include="src\HTConfig.cpp" />
<ClCompile Include="src\HTDatabase.cpp" />
<ClCompile Include="src\HTGlobal.cpp" />
<ClCompile Include="src\HTIEC61850.cpp" />
<ClCompile Include="src\HTIEC61850Thread.cpp" />
<ClCompile Include="src\HTInitUtils.cpp" />
<ClCompile Include="src\HTLogger.cpp" />
<ClCompile Include="src\HTModbus.cpp" />
<ClCompile Include="src\HTPublic.cpp" />
<ClCompile Include="src\HTSLVService.cpp" />
<ClCompile Include="src\HTStrConvert.cpp" />
<ClCompile Include="src\HTTcpSocket.cpp" />
<ClCompile Include="src\HTThread.cpp" />
<ClCompile Include="src\HTUnit.cpp" />
<ClCompile Include="src\HTXmlMethod.cpp" />
<ClCompile Include="src\sntp\HTNtptime.cpp" />
<ClCompile Include="src\sntp\HTSntpc.cpp" />
<ClCompile Include="src\sntp\HTSntpd.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\HTBusiDatabase.h" />
<ClInclude Include="include\HTConfig.h" />
<ClInclude Include="include\HTConst.h" />
<ClInclude Include="include\HTDatabase.h" />
<ClInclude Include="include\HTDataStruct.h" />
<ClInclude Include="include\HTError.h" />
<ClInclude Include="include\HTGlobal.h" />
<ClInclude Include="include\HTIEC61850.h" />
<ClInclude Include="include\HTIEC61850Thread.h" />
<ClInclude Include="include\HTInitUtils.h" />
<ClInclude Include="include\HTLogger.h" />
<ClInclude Include="include\HTModbus.h" />
<ClInclude Include="include\HTMutex.h" />
<ClInclude Include="include\HTPublic.h" />
<ClInclude Include="include\HTStrConvert.h" />
<ClInclude Include="include\HTTcpSocket.h" />
<ClInclude Include="include\HTThread.h" />
<ClInclude Include="include\HTType.h" />
<ClInclude Include="include\HTUnit.h" />
<ClInclude Include="include\HTVersion.h" />
<ClInclude Include="include\HTXmlMethod.h" />
<ClInclude Include="include\modbus\modbus-private.h" />
<ClInclude Include="include\modbus\modbus-rtu-private.h" />
<ClInclude Include="include\modbus\modbus-rtu.h" />
<ClInclude Include="include\modbus\modbus-tcp-private.h" />
<ClInclude Include="include\modbus\modbus-tcp.h" />
<ClInclude Include="include\modbus\modbus-version.h" />
<ClInclude Include="include\modbus\modbus.h" />
<ClInclude Include="include\sntp\HTNtptime.h" />
<ClInclude Include="include\sntp\HTSntp.h" />
<ClInclude Include="scl_tool\static_model.h" />
</ItemGroup>
<ItemGroup>
<None Include="etc\htiecsvr.conf" />
<None Include="etc\sjzd.cfg" />
<None Include="src\makefile" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files\modbus">
<UniqueIdentifier>{eedfbae3-242c-489e-9caa-d123e952e0b6}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\sntp">
<UniqueIdentifier>{9a718709-95a2-4b36-af7b-cc8a025e8077}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\sntp">
<UniqueIdentifier>{32e10d27-9b7f-41a6-a19b-046f0a349bda}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\HTSLVService.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTConfig.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTDatabase.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTGlobal.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTInitUtils.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTLogger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTPublic.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTStrConvert.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTUnit.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTXmlMethod.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTTcpSocket.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTModbus.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\sntp\HTSntpc.cpp">
<Filter>Source Files\sntp</Filter>
</ClCompile>
<ClCompile Include="src\sntp\HTSntpd.cpp">
<Filter>Source Files\sntp</Filter>
</ClCompile>
<ClCompile Include="src\sntp\HTNtptime.cpp">
<Filter>Source Files\sntp</Filter>
</ClCompile>
<ClCompile Include="src\HTBusiDatabase.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTIEC61850.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="scl_tool\static_model.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\HTIEC61850Thread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\HTConfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTConst.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTDatabase.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTError.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTGlobal.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTInitUtils.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTLogger.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTMutex.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTPublic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTStrConvert.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTThread.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTType.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTUnit.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTXmlMethod.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTTcpSocket.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTVersion.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTModbus.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-private.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-rtu.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-rtu-private.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-tcp.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-tcp-private.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\modbus\modbus-version.h">
<Filter>Header Files\modbus</Filter>
</ClInclude>
<ClInclude Include="include\sntp\HTSntp.h">
<Filter>Header Files\sntp</Filter>
</ClInclude>
<ClInclude Include="include\sntp\HTNtptime.h">
<Filter>Header Files\sntp</Filter>
</ClInclude>
<ClInclude Include="include\HTBusiDatabase.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTIEC61850.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTDataStruct.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="scl_tool\static_model.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\HTIEC61850Thread.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="src\makefile">
<Filter>Resource Files</Filter>
</None>
<None Include="etc\htiecsvr.conf">
<Filter>Resource Files</Filter>
</None>
<None Include="etc\sjzd.cfg">
<Filter>Resource Files</Filter>
</None>
</ItemGroup>
</Project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerCommandArguments>start</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,144 @@
/**
******************************************************************************
* @file HTYmodem.h
* @author XinLi
* @version v1.0
* @date 21-January-2018
* @brief Header file for Ymodem.cpp module.
******************************************************************************
* @attention
*
* <h2><center>Copyright &copy; 2018 XinLi</center></h2>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
******************************************************************************
*/
#ifndef _HT_YMODEM_H
#define _HT_YMODEM_H
/* Header includes -----------------------------------------------------------*/
#include <stdint.h>
/* Macro definitions ---------------------------------------------------------*/
#define YMODEM_PACKET_HEADER (3)
#define YMODEM_PACKET_TRAILER (2)
#define YMODEM_PACKET_OVERHEAD (YMODEM_PACKET_HEADER + YMODEM_PACKET_TRAILER)
#define YMODEM_PACKET_SIZE (128)
#define YMODEM_PACKET_1K_SIZE (1024)
#define YMODEM_CODE_CAN_NUMBER (5)
/* Type definitions ----------------------------------------------------------*/
class Ymodem
{
public:
enum Code
{
CodeNone = 0x00,
CodeSoh = 0x01,
CodeStx = 0x02,
CodeEot = 0x04,
CodeAck = 0x06,
CodeNak = 0x15,
CodeCan = 0x18,
CodeC = 0x43,
CodeA1 = 0x41,
CodeA2 = 0x61
};
enum Stage
{
StageNone,
StageEstablishing,
StageEstablished,
StageTransmitting,
StageFinishing,
StageFinished
};
enum Status
{
StatusEstablish,
StatusTransmit,
StatusFinish,
StatusAbort,
StatusTimeout,
StatusError
};
Ymodem(uint32_t timeDivide = 499, uint32_t timeMax = 5, uint32_t errorMax = 999);
void setTimeDivide(uint32_t timeDivide);
uint32_t getTimeDivide();
void setTimeMax(uint32_t timeMax);
uint32_t getTimeMax();
void setErrorMax(uint32_t errorMax);
uint32_t getErrorMax();
void receive();
void transmit();
void abort();
private:
Code receivePacket();
void receiveStageNone();
void receiveStageEstablishing();
void receiveStageEstablished();
void receiveStageTransmitting();
void receiveStageFinishing();
void receiveStageFinished();
void transmitStageNone();
void transmitStageEstablishing();
void transmitStageEstablished();
void transmitStageTransmitting();
void transmitStageFinishing();
void transmitStageFinished();
uint16_t crc16(uint8_t *buff, uint32_t len);
virtual Code callback(Status status, uint8_t *buff, uint32_t *len) = 0;
virtual uint32_t read(uint8_t *buff, uint32_t len) = 0;
virtual uint32_t write(uint8_t *buff, uint32_t len) = 0;
uint32_t timeDivide;
uint32_t timeMax;
uint32_t errorMax;
uint32_t timeCount;
uint32_t errorCount;
uint8_t dataCount;
Code code;
Stage stage;
uint8_t rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD];
uint8_t txBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD];
uint32_t rxLength;
uint32_t txLength;
};
/* Variable declarations -----------------------------------------------------*/
/* Variable definitions ------------------------------------------------------*/
/* Function declarations -----------------------------------------------------*/
/* Function definitions ------------------------------------------------------*/
#endif /* __YMODEM_H */

@ -0,0 +1,240 @@
#include "HTYModemFileReceive.h"
#define READ_TIME_OUT (10)
#define WRITE_TIME_OUT (100)
YmodemFileReceive::YmodemFileReceive(QObject *parent) :
QObject(parent),
file(new QFile),
readTimer(new QTimer),
writeTimer(new QTimer),
serialPort(new QSerialPort)
{
setTimeDivide(499);
setTimeMax(5);
setErrorMax(999);
serialPort->setPortName("COM1");
serialPort->setBaudRate(115200);
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
connect(readTimer, SIGNAL(timeout()), this, SLOT(readTimeOut()));
connect(writeTimer, SIGNAL(timeout()), this, SLOT(writeTimeOut()));
}
YmodemFileReceive::~YmodemFileReceive()
{
delete file;
delete readTimer;
delete writeTimer;
delete serialPort;
}
void YmodemFileReceive::setFilePath(const QString &path)
{
filePath = path + "/";
}
void YmodemFileReceive::setPortName(const QString &name)
{
serialPort->setPortName(name);
}
void YmodemFileReceive::setPortBaudRate(qint32 baudrate)
{
serialPort->setBaudRate(baudrate);
}
bool YmodemFileReceive::startReceive()
{
progress = 0;
status = StatusEstablish;
if(serialPort->open(QSerialPort::ReadWrite) == true)
{
readTimer->start(READ_TIME_OUT);
return true;
}
else
{
return false;
}
}
void YmodemFileReceive::stopReceive()
{
file->close();
abort();
status = StatusAbort;
writeTimer->start(WRITE_TIME_OUT);
}
int YmodemFileReceive::getReceiveProgress()
{
return progress;
}
Ymodem::Status YmodemFileReceive::getReceiveStatus()
{
return status;
}
void YmodemFileReceive::readTimeOut()
{
readTimer->stop();
receive();
if((status == StatusEstablish) || (status == StatusTransmit))
{
readTimer->start(READ_TIME_OUT);
}
}
void YmodemFileReceive::writeTimeOut()
{
writeTimer->stop();
serialPort->close();
receiveStatus(status);
}
Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t *len)
{
switch(status)
{
case StatusEstablish:
{
if(buff[0] != 0)
{
int i = 0;
char name[128] = {0};
char size[128] = {0};
for(int j = 0; buff[i] != 0; i++, j++)
{
name[j] = buff[i];
}
i++;
for(int j = 0; buff[i] != 0; i++, j++)
{
size[j] = buff[i];
}
fileName = QString::fromLocal8Bit(name);
fileSize = QString(size).toULongLong();
fileCount = 0;
file->setFileName(filePath + fileName);
if(file->open(QFile::WriteOnly) == true)
{
YmodemFileReceive::status = StatusEstablish;
receiveStatus(StatusEstablish);
return CodeAck;
}
else
{
YmodemFileReceive::status = StatusError;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
}
else
{
YmodemFileReceive::status = StatusError;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
}
case StatusTransmit:
{
if((fileSize - fileCount) > *len)
{
file->write((char *)buff, *len);
fileCount += *len;
}
else
{
file->write((char *)buff, fileSize - fileCount);
fileCount += fileSize - fileCount;
}
progress = (int)(fileCount * 100 / fileSize);
YmodemFileReceive::status = StatusTransmit;
receiveProgress(progress);
receiveStatus(StatusTransmit);
return CodeAck;
}
case StatusFinish:
{
file->close();
YmodemFileReceive::status = StatusFinish;
writeTimer->start(WRITE_TIME_OUT);
return CodeAck;
}
case StatusAbort:
{
file->close();
YmodemFileReceive::status = StatusAbort;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
case StatusTimeout:
{
YmodemFileReceive::status = StatusTimeout;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
default:
{
file->close();
YmodemFileReceive::status = StatusError;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
}
}
uint32_t YmodemFileReceive::read(uint8_t *buff, uint32_t len)
{
return serialPort->read((char *)buff, len);
}
uint32_t YmodemFileReceive::write(uint8_t *buff, uint32_t len)
{
return serialPort->write((char *)buff, len);
}

@ -0,0 +1,56 @@
#ifndef _HT_YMODEMFILERECEIVE_H
#define _HT_YMODEMFILERECEIVE_H
#include <QFile>
#include <QTimer>
#include <QObject>
#include <QSerialPort>
#include "HTYModem.h"
class YmodemFileReceive : public QObject, public Ymodem
{
Q_OBJECT
public:
explicit YmodemFileReceive(QObject *parent = 0);
~YmodemFileReceive();
void setFilePath(const QString &path);
void setPortName(const QString &name);
void setPortBaudRate(qint32 baudrate);
bool startReceive();
void stopReceive();
int getReceiveProgress();
Status getReceiveStatus();
signals:
void receiveProgress(int progress);
void receiveStatus(YmodemFileReceive::Status status);
private slots:
void readTimeOut();
void writeTimeOut();
private:
Code callback(Status status, uint8_t *buff, uint32_t *len);
uint32_t read(uint8_t *buff, uint32_t len);
uint32_t write(uint8_t *buff, uint32_t len);
QFile *file;
QTimer *readTimer;
QTimer *writeTimer;
QSerialPort *serialPort;
int progress;
Status status;
QString filePath;
QString fileName;
uint64_t fileSize;
uint64_t fileCount;
};
#endif // _HT_YMODEMFILERECEIVE_H

@ -0,0 +1,228 @@
#include "YmodemFileTransmit.h"
#include <QFileInfo>
#define READ_TIME_OUT (10)
#define WRITE_TIME_OUT (100)
YmodemFileTransmit::YmodemFileTransmit(QObject *parent) :
QObject(parent),
file(new QFile),
readTimer(new QTimer),
writeTimer(new QTimer),
serialPort(new QSerialPort)
{
setTimeDivide(499);
setTimeMax(5);
setErrorMax(999);
serialPort->setPortName("COM1");
serialPort->setBaudRate(115200);
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
connect(readTimer, SIGNAL(timeout()), this, SLOT(readTimeOut()));
connect(writeTimer, SIGNAL(timeout()), this, SLOT(writeTimeOut()));
}
YmodemFileTransmit::~YmodemFileTransmit()
{
delete file;
delete readTimer;
delete writeTimer;
delete serialPort;
}
void YmodemFileTransmit::setFileName(const QString &name)
{
file->setFileName(name);
}
void YmodemFileTransmit::setPortName(const QString &name)
{
serialPort->setPortName(name);
}
void YmodemFileTransmit::setPortBaudRate(qint32 baudrate)
{
serialPort->setBaudRate(baudrate);
}
bool YmodemFileTransmit::startTransmit()
{
progress = 0;
status = StatusEstablish;
if(serialPort->open(QSerialPort::ReadWrite) == true)
{
readTimer->start(READ_TIME_OUT);
return true;
}
else
{
return false;
}
}
void YmodemFileTransmit::stopTransmit()
{
file->close();
abort();
status = StatusAbort;
writeTimer->start(WRITE_TIME_OUT);
}
int YmodemFileTransmit::getTransmitProgress()
{
return progress;
}
Ymodem::Status YmodemFileTransmit::getTransmitStatus()
{
return status;
}
void YmodemFileTransmit::readTimeOut()
{
readTimer->stop();
transmit();
if((status == StatusEstablish) || (status == StatusTransmit))
{
readTimer->start(READ_TIME_OUT);
}
}
void YmodemFileTransmit::writeTimeOut()
{
writeTimer->stop();
serialPort->close();
transmitStatus(status);
}
Ymodem::Code YmodemFileTransmit::callback(Status status, uint8_t *buff, uint32_t *len)
{
switch(status)
{
case StatusEstablish:
{
if(file->open(QFile::ReadOnly) == true)
{
QFileInfo fileInfo(*file);
fileSize = fileInfo.size();
fileCount = 0;
strcpy((char *)buff, fileInfo.fileName().toLocal8Bit().data());
strcpy((char *)buff + fileInfo.fileName().toLocal8Bit().size() + 1, QByteArray::number(fileInfo.size()).data());
*len = YMODEM_PACKET_SIZE;
YmodemFileTransmit::status = StatusEstablish;
transmitStatus(StatusEstablish);
return CodeAck;
}
else
{
YmodemFileTransmit::status = StatusError;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
}
case StatusTransmit:
{
if(fileSize != fileCount)
{
if((fileSize - fileCount) > YMODEM_PACKET_SIZE)
{
fileCount += file->read((char *)buff, YMODEM_PACKET_1K_SIZE);
*len = YMODEM_PACKET_1K_SIZE;
}
else
{
fileCount += file->read((char *)buff, YMODEM_PACKET_SIZE);
*len = YMODEM_PACKET_SIZE;
}
progress = (int)(fileCount * 100 / fileSize);
YmodemFileTransmit::status = StatusTransmit;
transmitProgress(progress);
transmitStatus(StatusTransmit);
return CodeAck;
}
else
{
YmodemFileTransmit::status = StatusTransmit;
transmitStatus(StatusTransmit);
return CodeEot;
}
}
case StatusFinish:
{
file->close();
YmodemFileTransmit::status = StatusFinish;
writeTimer->start(WRITE_TIME_OUT);
return CodeAck;
}
case StatusAbort:
{
file->close();
YmodemFileTransmit::status = StatusAbort;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
case StatusTimeout:
{
YmodemFileTransmit::status = StatusTimeout;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
default:
{
file->close();
YmodemFileTransmit::status = StatusError;
writeTimer->start(WRITE_TIME_OUT);
return CodeCan;
}
}
}
uint32_t YmodemFileTransmit::read(uint8_t *buff, uint32_t len)
{
return serialPort->read((char *)buff, len);
}
uint32_t YmodemFileTransmit::write(uint8_t *buff, uint32_t len)
{
return serialPort->write((char *)buff, len);
}

@ -0,0 +1,54 @@
#ifndef _HT_YMODEMFILETRANSMIT_H
#define _HT_YMODEMFILETRANSMIT_H
#include <QFile>
#include <QTimer>
#include <QObject>
#include <QSerialPort>
#include "HTYModem.h"
class YmodemFileTransmit : public QObject, public Ymodem
{
Q_OBJECT
public:
explicit YmodemFileTransmit(QObject *parent = 0);
~YmodemFileTransmit();
void setFileName(const QString &name);
void setPortName(const QString &name);
void setPortBaudRate(qint32 baudrate);
bool startTransmit();
void stopTransmit();
int getTransmitProgress();
Status getTransmitStatus();
signals:
void transmitProgress(int progress);
void transmitStatus(YmodemFileTransmit::Status status);
private slots:
void readTimeOut();
void writeTimeOut();
private:
Code callback(Status status, uint8_t *buff, uint32_t *len);
uint32_t read(uint8_t *buff, uint32_t len);
uint32_t write(uint8_t *buff, uint32_t len);
QFile *file;
QTimer *readTimer;
QTimer *writeTimer;
QSerialPort *serialPort;
int progress;
Status status;
uint64_t fileSize;
uint64_t fileCount;
};
#endif // _HT_YMODEMFILETRANSMIT_H

@ -0,0 +1,40 @@
#-------------------------------------------------
#
# Project created by QtCreator 2018-01-20T23:00:46
#
#-------------------------------------------------
QT += core gui
QT += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = SerialPortYmodem
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp\
widget.cpp \
HTYModemFileReceive.cpp \
HTYModem.cpp \
HTYModemFileTransmit.cpp
HEADERS += widget.h \
HTYModem.h \
HTYModemFileReceive.h \
HTYModemFileTransmit.h
FORMS += widget.ui
RC_ICONS = SerialPortYmodem.ico

@ -0,0 +1,11 @@
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}

@ -0,0 +1,400 @@
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QSerialPortInfo>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget),
serialPort(new QSerialPort),
ymodemFileTransmit(new YmodemFileTransmit),
ymodemFileReceive(new YmodemFileReceive)
{
transmitButtonStatus = false;
receiveButtonStatus = false;
ui->setupUi(this);
QSerialPortInfo serialPortInfo;
foreach(serialPortInfo, QSerialPortInfo::availablePorts())
{
ui->comPort->addItem(serialPortInfo.portName());
}
serialPort->setPortName("COM1");
serialPort->setBaudRate(115200);
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
connect(ymodemFileTransmit, SIGNAL(transmitProgress(int)), this, SLOT(transmitProgress(int)));
connect(ymodemFileReceive, SIGNAL(receiveProgress(int)), this, SLOT(receiveProgress(int)));
connect(ymodemFileTransmit, SIGNAL(transmitStatus(YmodemFileTransmit::Status)), this, SLOT(transmitStatus(YmodemFileTransmit::Status)));
connect(ymodemFileReceive, SIGNAL(receiveStatus(YmodemFileReceive::Status)), this, SLOT(receiveStatus(YmodemFileReceive::Status)));
}
Widget::~Widget()
{
delete ui;
delete serialPort;
delete ymodemFileTransmit;
delete ymodemFileReceive;
}
void Widget::on_comButton_clicked()
{
static bool button_status = false;
if(button_status == false)
{
serialPort->setPortName(ui->comPort->currentText());
serialPort->setBaudRate(ui->comBaudRate->currentText().toInt());
if(serialPort->open(QSerialPort::ReadWrite) == true)
{
button_status = true;
ui->comPort->setDisabled(true);
ui->comBaudRate->setDisabled(true);
ui->comButton->setText(u8"关闭串口");
ui->transmitBrowse->setEnabled(true);
ui->receiveBrowse->setEnabled(true);
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
}
else
{
QMessageBox::warning(this, u8"串口打开失败", u8"请检查串口是否已被占用!", u8"关闭");
}
}
else
{
button_status = false;
serialPort->close();
ui->comPort->setEnabled(true);
ui->comBaudRate->setEnabled(true);
ui->comButton->setText(u8"打开串口");
ui->transmitBrowse->setDisabled(true);
ui->transmitButton->setDisabled(true);
ui->receiveBrowse->setDisabled(true);
ui->receiveButton->setDisabled(true);
}
}
void Widget::on_transmitBrowse_clicked()
{
ui->transmitPath->setText(QFileDialog::getOpenFileName(this, u8"打开文件", ".", u8"任意文件 (*.*)"));
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
else
{
ui->transmitButton->setDisabled(true);
}
}
void Widget::on_receiveBrowse_clicked()
{
ui->receivePath->setText(QFileDialog::getExistingDirectory(this, u8"选择目录", ".", QFileDialog::ShowDirsOnly));
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
else
{
ui->receiveButton->setDisabled(true);
}
}
void Widget::on_transmitButton_clicked()
{
if(transmitButtonStatus == false)
{
serialPort->close();
ymodemFileTransmit->setFileName(ui->transmitPath->text());
ymodemFileTransmit->setPortName(ui->comPort->currentText());
ymodemFileTransmit->setPortBaudRate(ui->comBaudRate->currentText().toInt());
if(ymodemFileTransmit->startTransmit() == true)
{
transmitButtonStatus = true;
ui->comButton->setDisabled(true);
ui->receiveBrowse->setDisabled(true);
ui->receiveButton->setDisabled(true);
ui->transmitBrowse->setDisabled(true);
ui->transmitButton->setText(u8"取消");
ui->transmitProgress->setValue(0);
}
else
{
QMessageBox::warning(this, u8"失败", u8"文件发送失败!", u8"关闭");
}
}
else
{
ymodemFileTransmit->stopTransmit();
}
}
void Widget::on_receiveButton_clicked()
{
if(receiveButtonStatus == false)
{
serialPort->close();
ymodemFileReceive->setFilePath(ui->receivePath->text());
ymodemFileReceive->setPortName(ui->comPort->currentText());
ymodemFileReceive->setPortBaudRate(ui->comBaudRate->currentText().toInt());
if(ymodemFileReceive->startReceive() == true)
{
receiveButtonStatus = true;
ui->comButton->setDisabled(true);
ui->transmitBrowse->setDisabled(true);
ui->transmitButton->setDisabled(true);
ui->receiveBrowse->setDisabled(true);
ui->receiveButton->setText(u8"取消");
ui->receiveProgress->setValue(0);
}
else
{
QMessageBox::warning(this, u8"失败", u8"文件接收失败!", u8"关闭");
}
}
else
{
ymodemFileReceive->stopReceive();
}
}
void Widget::transmitProgress(int progress)
{
ui->transmitProgress->setValue(progress);
}
void Widget::receiveProgress(int progress)
{
ui->receiveProgress->setValue(progress);
}
void Widget::transmitStatus(Ymodem::Status status)
{
switch(status)
{
case YmodemFileTransmit::StatusEstablish:
{
break;
}
case YmodemFileTransmit::StatusTransmit:
{
break;
}
case YmodemFileTransmit::StatusFinish:
{
transmitButtonStatus = false;
ui->comButton->setEnabled(true);
ui->receiveBrowse->setEnabled(true);
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
ui->transmitBrowse->setEnabled(true);
ui->transmitButton->setText(u8"发送");
QMessageBox::warning(this, u8"成功", u8"文件发送成功!", u8"关闭");
break;
}
case YmodemFileTransmit::StatusAbort:
{
transmitButtonStatus = false;
ui->comButton->setEnabled(true);
ui->receiveBrowse->setEnabled(true);
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
ui->transmitBrowse->setEnabled(true);
ui->transmitButton->setText(u8"发送");
QMessageBox::warning(this, u8"失败", u8"文件发送失败!", u8"关闭");
break;
}
case YmodemFileTransmit::StatusTimeout:
{
transmitButtonStatus = false;
ui->comButton->setEnabled(true);
ui->receiveBrowse->setEnabled(true);
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
ui->transmitBrowse->setEnabled(true);
ui->transmitButton->setText(u8"发送");
QMessageBox::warning(this, u8"失败", u8"文件发送失败!", u8"关闭");
break;
}
default:
{
transmitButtonStatus = false;
ui->comButton->setEnabled(true);
ui->receiveBrowse->setEnabled(true);
if(ui->receivePath->text().isEmpty() != true)
{
ui->receiveButton->setEnabled(true);
}
ui->transmitBrowse->setEnabled(true);
ui->transmitButton->setText(u8"发送");
QMessageBox::warning(this, u8"失败", u8"文件发送失败!", u8"关闭");
}
}
}
void Widget::receiveStatus(YmodemFileReceive::Status status)
{
switch(status)
{
case YmodemFileReceive::StatusEstablish:
{
break;
}
case YmodemFileReceive::StatusTransmit:
{
break;
}
case YmodemFileReceive::StatusFinish:
{
receiveButtonStatus = false;
ui->comButton->setEnabled(true);
ui->transmitBrowse->setEnabled(true);
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
ui->receiveBrowse->setEnabled(true);
ui->receiveButton->setText(u8"接收");
QMessageBox::warning(this, u8"成功", u8"文件接收成功!", u8"关闭");
break;
}
case YmodemFileReceive::StatusAbort:
{
receiveButtonStatus = false;
ui->comButton->setEnabled(true);
ui->transmitBrowse->setEnabled(true);
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
ui->receiveBrowse->setEnabled(true);
ui->receiveButton->setText(u8"接收");
QMessageBox::warning(this, u8"失败", u8"文件接收失败!", u8"关闭");
break;
}
case YmodemFileReceive::StatusTimeout:
{
receiveButtonStatus = false;
ui->comButton->setEnabled(true);
ui->transmitBrowse->setEnabled(true);
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
ui->receiveBrowse->setEnabled(true);
ui->receiveButton->setText(u8"接收");
QMessageBox::warning(this, u8"失败", u8"文件接收失败!", u8"关闭");
break;
}
default:
{
receiveButtonStatus = false;
ui->comButton->setEnabled(true);
ui->transmitBrowse->setEnabled(true);
if(ui->transmitPath->text().isEmpty() != true)
{
ui->transmitButton->setEnabled(true);
}
ui->receiveBrowse->setEnabled(true);
ui->receiveButton->setText(u8"接收");
QMessageBox::warning(this, u8"失败", u8"文件接收失败!", u8"关闭");
}
}
}

@ -0,0 +1,41 @@
#ifndef _HT_WIDGET_H
#define _HT_WIDGET_H
#include <QWidget>
#include "HTYModemFileTransmit.h"
#include "HTYModemFileReceive.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_comButton_clicked();
void on_transmitBrowse_clicked();
void on_receiveBrowse_clicked();
void on_transmitButton_clicked();
void on_receiveButton_clicked();
void transmitProgress(int progress);
void receiveProgress(int progress);
void transmitStatus(YmodemFileTransmit::Status status);
void receiveStatus(YmodemFileReceive::Status status);
private:
Ui::Widget *ui;
QSerialPort *serialPort;
YmodemFileTransmit *ymodemFileTransmit;
YmodemFileReceive *ymodemFileReceive;
bool transmitButtonStatus;
bool receiveButtonStatus;
};
#endif // _HT_WIDGET_H

@ -0,0 +1,295 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>444</width>
<height>255</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>444</width>
<height>255</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>444</width>
<height>255</height>
</size>
</property>
<property name="windowTitle">
<string>SerialPortYmodem</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>串口配置</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>端口:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comPort">
<property name="maxVisibleItems">
<number>12</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>波特率:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comBaudRate">
<property name="currentText">
<string>115200</string>
</property>
<property name="currentIndex">
<number>3</number>
</property>
<property name="maxVisibleItems">
<number>12</number>
</property>
<item>
<property name="text">
<string>921600</string>
</property>
</item>
<item>
<property name="text">
<string>460800</string>
</property>
</item>
<item>
<property name="text">
<string>230400</string>
</property>
</item>
<item>
<property name="text">
<string>115200</string>
</property>
</item>
<item>
<property name="text">
<string>57600</string>
</property>
</item>
<item>
<property name="text">
<string>38400</string>
</property>
</item>
<item>
<property name="text">
<string>19200</string>
</property>
</item>
<item>
<property name="text">
<string>9600</string>
</property>
</item>
<item>
<property name="text">
<string>4800</string>
</property>
</item>
<item>
<property name="text">
<string>2400</string>
</property>
</item>
<item>
<property name="text">
<string>1200</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="comButton">
<property name="text">
<string>打开</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>文件发送</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>文件路径:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="transmitPath">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="transmitBrowse">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>浏览...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="transmitButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>发送</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>传输进度:</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="transmitProgress">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>文件接收</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>文件路径:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="receivePath">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="receiveBrowse">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>浏览...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="receiveButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>接收</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>传输进度:</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="receiveProgress">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,83 @@
/********************************************************************/
# ht61850.conf
# date : 2019.09.01
# auther : huatek by liuyx
# Copyright (C) 2018, huatek, Inc.
/********************************************************************/
[HT_MONITOR]
# server monitor flag, true: monitor, false:no monitor
monitor_enable = true
[HT_VERSION]
# server version info, max length=32(byte)
ht_server_version = 2019.06.11
[HT_LOCAL_HOST]
local_host_addr = 127.0.0.1
local_tcp_port = 2404
[HT_REMOTE_HOST]
# remote_host_addr = 192.168.1.20
remote_host_addr = 127.0.0.1
remote_host_port = 2404
[HT_SOCKET]
max_epoll_limit = 2000
timeout_t0 = 30
timeout_t1 = 15
timeout_t2 = 10
timeout_t3 = 20
iec_k = 8
iec_w = 3
# application database config parameter
[HT_DATABASE]
db_host_addr = 192.168.135.81
db_host_port = 3306
db_name = sjzd
db_username = root
db_password = 123456
db_min_conn = 3
db_max_conn = 6
[HT_THREAD_NUMBER]
thread_recv_num = 2
thread_parse_num = 5
thread_opration_num = 3
thread_respone_num = 2
[HT_LOGGER]
logger = console,debug,error,warning,package
[MODBUS_CONF]
# RTU,TCP,ASC,IEC61850
modbus_mode = RTU
modbus_tcp_addr = 127.0.0.1
modbus_tcp_port = 1502
modbus_rtu_port = COM2
modbus_baud = 9600
# N-无 E-偶 O-奇校验
modbus_parity= N
modbus_databit=8
modbus_stopbit=1
[HT61850_CONF]
# 模型配置文件,由scl_tool工具产生
ied_model_config_file = D:/project/HTSLVService/etc/sjzd.cfg
# 服务器IED录播文件存放路径
ied_comtrade_path = /home/debian/my_task/data/
# 服务器录播文件下载后是否删除 true:删除false:保留
ied_comtrade_remove = true
# 本地录播文件存放路径
# comtrade_path = D:/project/HTSLVService/comtrad/
comtrade_path = comtrad
#本地录播文件备份路径
comtrade_bak_path = D:/project/HTSLVService/comtradbak/

File diff suppressed because it is too large Load Diff

@ -0,0 +1,9 @@
# temp configure
# is enable, true=enable false=disenable
Enable = true
# Mhz 采样频率
SmpProd = 10
# 采样间隔时间(h)
SmpInt = 2
# 采样起始时间(hm)
StartTime = 0800

File diff suppressed because it is too large Load Diff

@ -0,0 +1,67 @@
/****************************************************************************
** File name : HTBusiDatabase.h
** Description : busi app database api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_BUSI_DATABASE_H
#define __HT_BUSI_DATABASE_H
#pragma warning(disable: 4819)
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#pragma pack (push ,1)
#pragma pack (pop)
void vLoadCommunicationConf();
// 添加Ied不能连接的告警消息
void vSetIedDevicesWarnMesg(char *Ied_ip, int port, time_t altime);
// 删除Ied服务不能连接的告警消息
void vDelIedDevicesWarnMesg(char *Ied_ip, int port, time_t altime);
// 加载传感器基本信息
void vLoadBaseDeviceInfo();
// 加载通信参数配置
void vLoadCommunicationConf();
// 加载控制参数
void vLoadDeviceCtrlParam();
// 加载ICD配置节点与传感器绑定关系
void vLoadICDParameterBind();
// 加载阈值配置参数
void vLoadCenterDeviceThreshold();
void vLoadNoiseDeviceThreshold();
void vLoadAmpliDeviceThreshold();
// 显示阈值配置信息
void vPrtDeviceThresholdConf();
// 显示传感器控制参数
void vPrtDeviceCtrlParam();
// 显示传感器控制参数
void vPrtICDParameterBind();
// 插入数据
void vSetRealDevicesMoniMesg(ST_DB_BODY *pData);
// 添加传感器上传的告警消息
void vSetRealDevicesWarnMesg(ST_DB_WARN &stWarn);
#ifdef __cplusplus
}
#endif
#endif /* end __HT_BUSI_DATABASE_H */

@ -0,0 +1,260 @@
/****************************************************************************
** File name : HTConfig.h
** Description : config parameter
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_CONFIG_H
#define __HT_CONFIG_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <list>
// 配置文件路径
#ifdef _WIN32
static const char HT_CONFIG_FILE[] = ".\\etc\\htiecsvr.conf";
#else
static const char HT_CONFIG_FILE[] = "../etc/htiecsvr.conf" ;
#endif
#pragma pack (push ,1)
#define HT_MAX_IED_COUNT 8 // 最大IED数量
typedef struct
{
char IedAddr[32];
int port;
}ST_IED_ADDR;
#pragma pack (pop)
class TConfig
{
public:
TConfig();
virtual ~TConfig();
static TConfig *getInstance();
// 读取配置文件参数
bool getIniConfig();
void showConfig();
// 设置本地服务器IP
void setLocalAddr(char *pszAddr);
// 获取本地服务器IP
char *getLocalAddr();
// 设置本地服务器端口
void setLocalPort(unsigned short iPort);
// 获取本地服务器端口
unsigned short getLocalPort();
// 设置远程服务器IP
void setRemoteAddr(char *pszAddr);
// 获取远程服务器IP
char *getRemoteAddr();
// 设置远程服务器端口
void setRemotePort(unsigned short iPort);
// 获取远程服务器端口
unsigned short getRemotePort();
void setRecvThreadNumber(unsigned int n) ; // 接收线程数
void setParseThreadNumber(unsigned int n) ; // 解析104线程数
void setOprationThreadNumber(unsigned int n) ; // 入库线程数
void setResponeThreadNumber(unsigned int n) ; // 应答线程数
unsigned int getRecvThreadNumber() ; // 接收线程数
unsigned int getParseThreadNumber() ; // 解析104线程数
unsigned int getOprationThreadNumber() ; // 入库线程数
unsigned int getResponeThreadNumber() ; // 应答线程数
// 配置数据库配置参数接口
unsigned int getdbPort() ;
unsigned int getdbMaxConnect();
unsigned int getdbMinConnect() ;
char *getdbHostIP() ;
char *getdbName() ;
char *getdbUserName() ;
char *getdbUserPass() ;
void setdbPort(unsigned int port);
void setdbMaxConnect(unsigned int max);
void setdbMinConnect(unsigned int min);
void setdbHostIP(char *pszDBHostIP);
void setdbName(char *pszDBName);
void setdbUserName(char *pszDBUserName);
void setdbUserPass(char *pszDBUserPass);
// socket 相关属性参数配置
void setFdLimit(unsigned int iCount);
unsigned int getFdLimit();
void setTimeout0(unsigned int t);
void setTimeout1(unsigned int t);
void setTimeout2(unsigned int t);
void setTimeout3(unsigned int t);
unsigned int getTimeout0();
unsigned int getTimeout1();
unsigned int getTimeout2();
unsigned int getTimeout3();
void setK(unsigned int k);
unsigned int getK();
void setW(unsigned int w);
unsigned int getW();
void setLogDebug(char yes);
void setLogError(char yes);
void setLogWarning(char yes);
void setLogPack(char yes);
void setLogConsole(char yes);
void setLogMessage(char yes);
char isLogDebug(void);
char isLogError(void);
char isLogWarning(void);
char isLogPack(void);
char isLogConsole(void);
char isLogMessage(void);
// version infomation functios
void setServerVersion(char *pver) ;
char *getServerVersion();
void setMonitor(bool bMonitor);
bool getMonitor();
// 读取配置文件函数
int iniGetString(const char *pszSection, const char *pszEntry, char *pszRetBuf, unsigned int uiBufLen);
// 通信协议使能
void setCommProtocol(int protocol);
int getCommProtocol();
// modbus functions
void setModbusMode(char *mode);
char *getModbusMode();
void setModbusTcpAddr(char *addr);
char *getModbusTcpAddr();
void setModbusRtuPort(char *port);
char *getModbusRtuPort();
void setModbusTcpPort(int port);
int getModbusTcpPort();
void setModbusBaud(int baud);
int getModbusBaud();
void setModbusParity(char parity);
char getModbusParity();
void setModbusDataBit(int bit);
int getModbusDataBit();
void setModbusStopBit(int sbit);
int getModbusStopBit();
void setWifiPasswd(char *passwd);
char* getWifiPasswd();
// iec61850 config
void setIEDCount(int c);
int getIEDCount();
void setIEDAddress(int idx, ST_IED_ADDR paddr);
ST_IED_ADDR *getIEDAddrsss(int idx);
void setIEDModelConfigFile(char *ied_file_name);
char *getIEDModelConfigFile();
void setComtradePath(char *path);
char *getComtradePath();
void setComtradeBakPath(char *path);
char *getComtradeBakPath();
void setIEDComtradePath(char *path);
char *getIEDComtradePath();
void setIEDComtradeRemove(bool isRemove);
bool getIEDComtradeRemove();
private:
static TConfig *p_TConfig;
bool b_monitor_enable ; // 监控标志 true:启用 false: 不启用
// server version infomations
char m_version[32+1]; // format 2013.00.100
// database config parameter
char m_dbHostIP[16];
char m_dbName[16];
char m_dbUserName[16];
char m_dbUserPass[16];
unsigned int m_dbMaxConnect;
unsigned int m_dbMinConnect;
unsigned int m_dbPort;
char m_local_addr[16];
unsigned int m_local_port;
char m_remote_addr[16] ;
unsigned int m_remote_port ;
// socket config
unsigned int m_fd_limit;
unsigned int t0,t1,t2,t3,uK,uW;
unsigned int m_recv_num;
unsigned int m_parse_num;
unsigned int m_opration_num;
unsigned int m_respone_num;
// logger
char m_logdebug; // debug logger
char m_logwarning; // warning logger
char m_logerror; // error logger
char m_logpack; // package print logger
char m_logconsole; // console print
char m_logmessage; // message print
// Modbus Protocol Configure
int m_comm_protocol; // 1:modbus 2: iec61850
char m_mbus_mode[16]; // Modbus 通信模式 TCP|RTU|ASC|IEC61850
char m_mbus_tcp_addr[32]; // 通信地址, IP or COM1...
int m_mbus_tcp_port; // 通信端口 for TCP
char m_mbus_rtu_port[128]; // 串口号 for RTU
int m_mbus_baud; // 波特率
char m_mbus_parity; // 校验位
int m_mbus_data_bit; // 数据位
int m_mbus_stop_bit; // 停止位
char m_mbus_wifi_pass[128]; // wifi password
// IEC61850 Configuration
int m_ied_count; // IED count
ST_IED_ADDR m_ied_addr[HT_MAX_IED_COUNT]; // IED address list
char m_ied_comtrade_path[256]; // 服务器IED录播文件存放路径
bool b_ied_comtrade_remove; // # 服务器录播文件下载后是否删除 true:删除false : 保留
char m_ied_model_config_file[MAX_PATH]; // IEC61850配置文件名称
char m_comtrade_path[MAX_PATH]; // 录播文件存放路径
char m_comtrade_bak_path[MAX_PATH]; // 录播文件备份路径
};
#endif

@ -0,0 +1,55 @@
/****************************************************************************
** File name : HTConst.h
** Description : define const
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_CONST_H
#define __HT_CONST_H
// ASCI×Ö·ûÊý×Ö¶¨Òå
#define KEY0 '0'
#define KEY1 '1'
#define KEY2 '2'
#define KEY3 '3'
#define KEY4 '4'
#define KEY5 '5'
#define KEY6 '6'
#define KEY7 '7'
#define KEY8 '8'
#define KEY9 '9'
// Êý×Ö¶¨Òå
#define KEY_0 0x00
#define KEY_1 0x01
#define KEY_2 0x02
#define KEY_3 0x03
#define KEY_4 0x04
#define KEY_9 0x09
#ifndef MAX_PATH
#define MAX_PATH 260
#endif
// use buffer size define
#define DEF_BUFFER_32 32
#define DEF_BUFFER_64 64
#define DEF_BUFFER_128 128
#define DEF_BUFFER_256 256
#define DEF_BUFFER_1K 1024
#define DEF_BUFFER_2K 2048
#define DEF_BUFFER_4K 4096
#define DEF_BUFFER_8K 8192
#define DEF_BUFFER_512K 1024*512
#define MAX_SLEEP_EMPTY 5 // ms
#endif // end __HT_CONST_H

@ -0,0 +1,298 @@
/****************************************************************************
** File name : HTDataStruct.h
** Description : define data struct
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_DATA_STRUCT_H
#define __HT_DATA_STRUCT_H
#include <map>
#include "HTConst.h"
#include "iec61850_client.h"
#include "iec61850_model.h"
#include "iec61850_dynamic_model.h"
#include "iec61850_config_file_parser.h"
#pragma pack (push ,1)
#define HT_COMTRADE_REDOWN 1 // 待下载
#define HT_COMTRADE_DOWNED 2 // 下载完成,待解析入库
// 地址装置关系
typedef struct {
char szMID[DEF_BUFFER_32+1]; // 主变ID
char szSID[DEF_BUFFER_32 + 1]; // 装置ID
char szSysCode[DEF_BUFFER_32 + 1]; // 装置编码,唯一
char szSersorID[DEF_BUFFER_32 + 1]; // 装置编码,唯一
char szMDevName[DEF_BUFFER_128]; // 主变名称
char szSubName[DEF_BUFFER_128]; // 装置名称
char cSlaveID; // Modbus地址对应一个装置的ID
char cDevType; // 装置类别 1:振动装置 2:噪声装置 3:中心点装置
char cSide; // 原副边 P: 原边 S:副边,仅当device_type=1时有效
char cPhase; // 相位 A:A相 B:B相 C:C相 O:全相;,仅当device_type=1时有效
char cInOut; // 上次侧或进出侧 I:上侧/进口侧 O:下侧/出口侧; 仅当device_type=1时有效
}ST_DEVICE_INFO;
// 设备阈值配置信息
typedef struct
{
char szMID[DEF_BUFFER_32+1]; // 主变设备ID
char szSysCode[DEF_BUFFER_32+1]; // 主变设备system_code
char szMDevName[DEF_BUFFER_128]; // 主变名称
char szSubID[DEF_BUFFER_32 + 1]; // 传感器ID
char szSensorID[DEF_BUFFER_32]; // 传感器SersorID
char szSDevName[DEF_BUFFER_128]; // 传感器名称
char bDevType; // 1:振动装置 2:噪声装置 3:中心点装置
//ST_THRESHOLD_ATTR stThresAttr; // 阈值属性
char bSide; // P:原边 S:副边
char bPhase; // 相位 A、B、C、O
char bInOut; // 进口-上侧/出口-下侧
char szFrequency[4+1]; // 频率,50Hz~1200Hz
double dThreshold; // 告警值
}ST_THRES_CONF;
// 振动装置实时数据体
typedef struct
{
// 原边振动监测值
double AccPri1; // 原边A相上侧50Hz
double AccPri2; // 原边A相下侧50Hz
double AccPri3;
double AccPri4;
double AccPri5;
double AccPri6;
double AccPri7;
double AccPri8;
double AccPri9;
double AccPri10;
double AccPri11;
double AccPri12;
double AccPri13;
double AccPri14;
double AccPri15;
double AccPri16;
double AccPri17;
double AccPri18;
double AccPri19;
// 副边振动监测值
double AccSec1; // 副边A相上侧100Hz
double AccSec2;
double AccSec3;
double AccSec4;
double AccSec5;
double AccSec6;
double AccSec7; // 副边A相上侧700Hz
double EnvNoiPri; // 噪声监测值(dB)
double NeuCur; // 中心点监测值(A)
}ST_MONI_DATA;
// 传感器控制参数
typedef struct {
char szMID[DEF_BUFFER_32 + 1]; // 主变设备ID
char szSysCode[DEF_BUFFER_32 + 1]; // 主变设备system_code
char szSubID[DEF_BUFFER_32 + 1]; // 传感器ID
char szSensorID[DEF_BUFFER_32]; // 传感器SersorID
char szSubName[DEF_BUFFER_128]; // 传感器名称
// 控制参数-下设IED参数
bool isEnable; // TRUE:启动传感器工作 FLASE: 禁用工作
bool alone; // 独立测试, true:yes false: no
int SmpProd; // 采集频率(KHz)
int SmpInt; // 采样间隔(小时)
int StartTime; // 起始时间
}ST_CONTROL_CONF;
// 告警分量信息体
typedef struct {
// 传感器及通信告警
bool MoDevConf; // IED与监测设备通讯异常
bool MoDevDetF; // 传感器自检异常
bool MoDevSigF; // 传感器信号异常
bool MoDevPowF; // 传感器供电异常
bool EnvNoiPriAlm;// 原边环境噪声告警
bool NeuCurAlm; // 中性点电流告警
// 原边告警分量
bool AccPriAlm1; // 原边50Hz告警分量
bool AccPriAlm2;
bool AccPriAlm3;
bool AccPriAlm4;
bool AccPriAlm5;
bool AccPriAlm6;
bool AccPriAlm7;
bool AccPriAlm8;
bool AccPriAlm9;
bool AccPriAlm10;
bool AccPriAlm11;
bool AccPriAlm12;
bool AccPriAlm13;
bool AccPriAlm14;
bool AccPriAlm15;
bool AccPriAlm16;
bool AccPriAlm17;
bool AccPriAlm18;
bool AccPriAlm19;
// 副边告警分量
bool AccSecAlm1;
bool AccSecAlm2;
bool AccSecAlm3;
bool AccSecAlm4;
bool AccSecAlm5;
bool AccSecAlm6;
bool AccSecAlm7;
}ST_WARN_ALARM;
// 传感器阈值属性
typedef struct {
char bSide; // P:原边 S:副边
char bPhase; // 相位 A、B、C、O
char bInOut; // 进口-上侧/出口-下侧
int iFrequency; // 频率,50Hz~1200Hz
double dThreshold; // 告警值
}ST_THRESHOLD_ATTR;
// 链接管理结构体
typedef struct {
char ied_addr[32];
int ied_port;
IedConnection hConnHandle; // 链接句柄
bool bIsConnect; // 链接状态, true:connected flase:disconnect
bool bWarn; //
time_t iLastTime; // 最近一次链接时间
time_t iLastActionTime;// 最近一次活动时间
time_t iLastAlaarmTime; // 最近一次链接告警时间
IedModel *IedModel; // 模型句柄
}ST_IED_CONN_HANDLE;
// iec61850 录播文件属性定义
typedef struct _comtrad_files_attrib {
char bstat; // 1:待下载 2:下载完成
short sNo; // 文件序号,系统自编
int iFileSize; // 文件长度
char szFileName[_MAX_DIR]; // 文件路径名+文件名称
}ST_FILES_ATTRIB;
// 录播文件格式定义
typedef struct {
int sno; // 序号
int tme; // 时间,ms
short A1; // 震动装置原边A项上侧
short A2; // 震动装置原边A项下侧
short B1; // 震动装置原边B项上侧
short B2; // 震动装置原边B项下侧
short C1; // 震动装置原边C项上侧
short C2; // 震动装置原边C项下侧
short a1; // 震动装置副边A项上侧
short a2; // 震动装置副边A项下侧
short b1; // 震动装置副边B项上侧
short b2; // 震动装置副边B项下侧
short c1; // 震动装置副边C项上侧
short c2; // 震动装置副边C项下侧
short nsi; // 噪声(dB)
short crt; // 中心点电流(A)
}ST_COMTRAD_DATA;
// icd配置节点绑定关系
typedef struct {
// 传感器组号,节点组号 01=原边A上 02=原边A下 03=原边B上 04=原边B下 05=原边C上 06=原边C下
// 07=副边A上 08=副边A下 09=副边B上 10=副边B下 11=副边C上 12=副边C下
int nodeid; // 节点/传感器ID
char szFrequency[5]; //频率
char sensorid[DEF_BUFFER_32 + 1]; // sensor_code
char nodename[128]; // 节点名称
char nodetype[4]; // 节点类型 MX,ST,SE
char monitype; // 监测类型: 1=振动监测值 2=振动告警 3=噪声监测值 4=噪声告警 5=中心点监测 6=中心点告警
}ST_PARAM_BIND;
// IED返回数据体
typedef struct {
double MX_f; // MX监测值,振动值、噪声、中心点
bool ST_val; // ST监测值,各项告警值
int SE_Val; // SE设定值下设参数
time_t t; // 时间值
}ST_IED_VALUES;
// 传感器基本信息
typedef struct {
char szSubID[DEF_BUFFER_32 + 1]; // 传感器ID
char szSensorID[DEF_BUFFER_32]; // 传感器SersorID
char szSDevName[DEF_BUFFER_128]; // 传感器名称
char bDevType; // 1:振动装置 2:噪声装置 3:中心点装置
ST_CONTROL_CONF stControl; // 控制参数下设
map<int, ST_THRESHOLD_ATTR> map_stThres; // 阈值属性,
map<string, ST_PARAM_BIND> map_stParamBind; // icd配置节点绑定关系,key=nodename
// 实时监测数据
ST_MONI_DATA stMoni; // 传感器实时监测数据
ST_WARN_ALARM stAlarm; // 传感器告警监测数据
ST_FILES_ATTRIB stComtradFile; // 录播文件属性
ST_COMTRAD_DATA stComtradeContext;// 录播文件解析数据
}ST_BASE_DEVICE_INFO;
// 校时配置
typedef struct {
int sntp_port; // port
char sntp_s_ip[32]; // sntp_server address
bool manual; // true: 手动
}ST_SNTP_CONF;
// 振动装置表结构
typedef struct {
char file_id[DEF_BUFFER_32+1]; // 录播文件ID
char m_id[DEF_BUFFER_32 + 1]; // 主变ID
char s_id[DEF_BUFFER_32 + 1]; // 传感器ID
char szSensorID[DEF_BUFFER_32 + 1]; // SensorID
char szDevType; // 1:振动装置 2 : 噪声装置 3 : 中心点装置
char szFrequency[5]; // 频率
char side; // 原副边P:原边 S:副边
char phase; // 相位
char in_out; // 上下侧 U:上侧 D:下侧
double value; // 幅值,噪声,中心点
time_t dtime; // 监测时间
}ST_DB_BODY;
// 报警表结构
typedef struct {
char s_id[DEF_BUFFER_32 + 1]; // 传感器ID
char valunit[8]; // 采样值单位:dB,A,mm/s2
char szDesc[128]; // 告警描述
char warn_type; // 告警分类 1:通信异常告警 2:装置自检异常告警 3:信号异常告警 4:供电异常告警 5:振动阈值告警
// 6:噪声阈值告警 7:中心点阈值告警 8:日增长率告警 9:月增长率告警 10:月偏差率告警
// 11: 服务器与IED通信异常
// 12:传感器振动告警 13:传感器噪声告警 14:传感器中心点告警
char level; // 告警级别 0:高 1:中 2:低
char state; // 处理状态 0:已处理 1:未处理
double value; // 幅值,噪声,中心点
time_t almtime; // 告警时间
}ST_DB_WARN;
// IEC61850设备配置信息
typedef struct
{
char szMID[DEF_BUFFER_32 + 1]; // 主变设备ID
char szSysCode[DEF_BUFFER_32 + 1]; // 主变设备system_code
char szMDevName[DEF_BUFFER_128]; // 主变名称
ST_BASE_DEVICE_INFO stBaseInfo; // 传感器基本信息
ST_IED_CONN_HANDLE stConnect; // IED链接参数
ST_SNTP_CONF stSntp; // 校时配置
}ST_HT_IEC61850;
#pragma pack (pop)
#endif // end

@ -0,0 +1,99 @@
/****************************************************************************
** File name : HTDatabase.h
** Description : define database api
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_DATABASE_H
#define __HT_DATABASE_H
#include "HTPublic.h"
#include "mysql.h"
#ifdef _WIN32
//#pragma comment(lib,"ociliba.lib")
#pragma comment(lib,"libmysql.lib")
#endif
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST;
typedef std::list<MYSQL *>::iterator ITER_CONNECTION_HANDLE_LIST;
#define CONNECTION_NUM 10 //同时打开的连接数
class CDBMySQL
{
public:
CDBMySQL();
CDBMySQL(const char *host, const char *user, const char *password, const char *db, unsigned int port=3306);
virtual ~CDBMySQL();
public:
bool dbConnectPool(); //连接数据库
void dbFreeConnectPool() ; //释放链接资源
bool dbAutoCommit(MYSQL *pMysql, bool bStart); // 开始事务处理
bool dbCommit(MYSQL *pMysql);
bool InsertRecordBitch(const char pszSql[][256], int count);
bool AddInsertRecord(MYSQL *pHandle, const char *szSql);
MYSQL_RES* SelectRecord(const char *szSql); //选择记录,返回结果集
bool SelectDB(const char *szDB); //选择数据库
bool UpdateRecord(const char *szSql); //更新记录
bool InsertRecord(const char *szSql); //插入记录
bool DelRecord(const char *szSql); //删除记录
bool IsEnd(MYSQL_RES *myquery); //是否最后
void SeekData(MYSQL_RES *myquery, int offset); //查找指定数据
void FreeRecord(MYSQL_RES *myquery); //释放结果集
unsigned int GetFieldNum(MYSQL_RES *myquery); //得到字段数
MYSQL_ROW GetRecord(MYSQL_RES *myquery); //得到结果(一个记录)
my_ulonglong GetRowNum(MYSQL_RES *myquery); //得到记录数
char* getLastError(MYSQL* pMySql); //输出错误信息
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char* GetClientInfo(); //客户机信息
char* GetFieldName(MYSQL_RES *myquery, int FieldNum); //字段名
bool LockTable(const char *TableName, const char *Priority); //对特定表加锁
bool UnlockTable(); //解锁
bool SetCharset();
//int CreateDB(char *db); //创建数据库,返回错误信息
//int DropDB(char *db); //删除数据库,返回错误信息
MYSQL* GetIdleMySql(); //提取一个空闲句柄供使用
void SetIdleMysql(MYSQL* pMySql); //从使用队列中释放一个使用完毕的句柄,插入到空闲队列
static CDBMySQL* Instance();
public:
//MYSQL m_mysql; //数据库连接句柄
MYSQL_ROW m_row; //记录集(单行)
MYSQL_FIELD *m_field; //字段信息(结构体)
//创建两个队列
CONNECTION_HANDLE_LIST m_lsBusyList; //正在使用的连接句柄
CONNECTION_HANDLE_LIST m_lsIdleList; //未使用的连接句柄
mutex m_csList;
private:
static CDBMySQL* p_dbHandle ;
char m_host[20]; //主机
char m_user[20]; //用户名
char m_password[20]; //密码
char m_db[20]; //数据库名
unsigned int m_port; //端口
unsigned int m_min; // 链接数
};
#endif // __HT_DATABASE_H

@ -0,0 +1,44 @@
/****************************************************************************
** File name : HTError.h
** Description : define error code
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_ERROR_H
#define __HT_ERROR_H
#define RET_OK 0
#define RET_FAIL -1
#define RET_IPPORT_INVALID -2 // IP地址或端口无效
#define RET_UDP_BIND_PORT -3 // UDP绑定端口错误
#define RET_LENGTH_INVALID -4 // 数据长度无效
#define RET_VALUE_INVALID -5 // 域值无效
#define RET_TYPE_INVALID -6 // 业务类型无效
#define RET_CALLOC_FAIL -7 // 申请内存失败
#define RET_SUB_ID_INVALID -8 // 域ID标识无效/不支持的ID标识码
#define RET_CALL_OCI_FAILED -9 // OCI调用失败
#define RET_NOT_FOUND_RECORD -10 // 无原请求业务流水
#define RET_ERROR_AUTHID -11 // 无效接入码
#define RET_UDP_STATUS_EXP -12 // UDP链接状态异常
#define RET_NOT_EXTERN_PACK -13 // 无扩展报文
#define RET_NOT_FOUND_ACCESSID -14 // 没有检索到接入码
#define RET_TERM_NOT_ONLINE -15 // 终端不在线
#define RET_SUB_COMMAND_INVALID -16 // 采集数据的子命令无效
#define RET_MAJOR_CONN_ERR -17 // TCP主链路状态错误
#define RET_NOT_FILE_EXIST -18 // 文件不存在
#define RET_NOT_DATA -19 // 采集行驶记录无数据
#define RET_SET_ERROR_PIC -20 // 插入拍照下发指令记录失败
#define RET_SERVER_ID_ERR -21 // 连接服务器名称无效
#define RET_JT809_VERSION -22 // 数据库配置了无效的JT809协议版本号
#define RET_JT808_VERSION -23 // 808内部报文协议类型无效
#define RET_JT809_CRC_ERROR -24 // CRC16校验错误
#define RET_LINK_CHECK_ERROR -25 // 链路校验码错误
#define RET_RECORD_ORG_ID_NULL -26 // 记录仪ID或企业ID为空
#endif // end __HT_ERROR_H

@ -0,0 +1,102 @@
/****************************************************************************
** File name : HTGolbal.h
** Description : global variable define
** Create date : 2018.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2018.09.01 Liuyx first build
****************************************************************************/
#pragma warning (disable:4786)
#ifndef __HT_GLOBAL_H
#define __HT_GLOBAL_H
#include "HTType.h"
#include "HTConst.h"
#include "HTMutex.h"
#include "HTPublic.h"
#include "HTLogger.h"
#include "HTConfig.h"
#include "HTDatabase.h"
#include "HTDataStruct.h"
#include "HTBusiDatabase.h"
#include "HTError.h"
#include "HTThread.h"
#include "HTInitUtils.h"
#include "HTTcpSocket.h"
#include "HTUnit.h"
#include "HTStrConvert.h"
#include "HTXmlMethod.h"
#include "HTVersion.h"
#include "HTModbus.h"
#include "HTIEC61850.h"
#include "HTIEC61850Thread.h"
//#include "HTMmslite.h"
#include "sntp/HTSntp.h"
#include <list>
#include <map>
#include <vector>
#include <iostream>
#if (defined(__UNIX__) || defined(UNIX) || defined(LINUX) || defined(linux))
#include <dlfcn.h>
#endif
using namespace std;
//#define _CRT_SECURE_NO_WARNINGS 1
extern map<string,ST_IED_CONN_HANDLE> g_MapIedConn; // IED链接句柄
extern mutex g_MapIedConn_mutex;
extern int g_Running;
extern TConfig g_TConfig;
//extern map<string, ST_IMG_THRESHOLD> g_map_img_thres; // 图片识别阈值
//extern mutex g_map_img_thres_mutex;
extern list<ST_FILES_ATTRIB> g_list_comtrad_files; // 录播文件队列
extern mutex g_list_comtrad_files_mutex;
extern list<ST_DB_BODY> g_list_db_body; // 入库队列
extern mutex g_list_db_body_mutex;
extern list<ST_DB_WARN> g_list_db_warn; // 入库队列
extern mutex g_list_db_warn_mutex;
extern map<string, ST_DEVICE_INFO> g_map_device; // 装置设备缓存
extern mutex g_map_device_mutex;
extern map<string, ST_THRES_CONF> g_thres_conf; // 振动传感器阈值配置
extern mutex g_thres_conf_mutex;
extern map<string, ST_CONTROL_CONF> g_ctrl_conf; // 振动传感器控制参数配置
extern mutex g_ctrl_conf_mutex;
extern map<string, ST_HT_IEC61850> g_ied;
extern mutex g_ied_mutex;
extern map<string, ST_PARAM_BIND> g_map_parambind; // icd配置节点绑定关系,key=nodename
extern mutex g_map_parambind_mutex; // icd配置节点绑定关系,key=nodename
extern int g_seqno; // 交换的流水号
extern mutex g_seq_mutex; // 流水号
extern pthread_t thread_handle_cache_proc; // 内存数据同步线程句柄
extern pthread_t thread_handle_database_proc; // 入库线程句柄
extern pthread_t thread_handle_dbalarm_proc; // 入库线程句柄
extern pthread_t thread_handle_sntpd; // SNTP校时服务端线程句柄
extern pthread_t thread_handle_sntpc; // SNTP校时客户端线程句柄
extern pthread_t thread_handle_iec61850_manager_proc;
extern pthread_t thread_handle_modbus_service; //Modbus服务线程句柄
extern pthread_t thread_handle_modbus_recv; //Modbus接收线程句柄
extern pthread_t thread_handle_modbus_send; //Modbus发送线程句柄
extern pthread_t thread_handle_iec61850_service; //iec61850服务线程句柄
extern pthread_t thread_handle_iec61850_client; //iec61850接收线程句柄
extern pthread_t thread_handle_iec61850_server; //iec61850发送线程句柄
#endif // end __HT_GLOBAL_H

@ -0,0 +1,90 @@
/****************************************************************************
** File name : HTIEC61850.h
** Description : define iec 61850 network protocol api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_LIBIEC_61850_H
#define __HT_LIBIEC_61850_H
#include "HTGlobal.h"
#include "iec61850_client.h"
#include "iec61850_model.h"
#include "iec61850_dynamic_model.h"
#include "iec61850_config_file_parser.h"
#ifdef _SISCO_MMS_LITE
#pragma comment(lib,"acsi_ld.lib")
#pragma comment(lib,"mmslite_ld.lib")
#endif // _SISCO_MMS_LITE
#ifdef _LIB_IEC_61850
#pragma comment(lib,"iec61850.lib")
#endif // _LIB_IEC_61850
#pragma pack (push ,1)
#pragma pack (pop)
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
// 获取错误消息
const char *getIedError(int error);
// 从远程IED获取模型配置
int vGetRemoteIEDModelConfig(IedConnection con);
// ICD文件解析
IedModel *LoadModelConfigFile(char *icd_file);
// 初始化61850链接环境参数
void vIedInitIedEvent();
// 释放链接及资源
void vIedFreeIedEvent(ST_IED_CONN_HANDLE &stIedHandle);
// 添加Ied不能连接的告警消息
void vSetIedDevicesWarnMesg(char *Ied_ip, int port, time_t altime);
// 删除Ied服务不能连接的告警消息
void vDelIedDevicesWarnMesg(char *Ied_ip, int port, time_t altime);
// IED文件浏览
void showComtradeFile(IedConnection con, const char *pszDirName);
// 录播文件下载,解析入库线程
void vDownLoadComtradeFiles(/*void *arg*/ ST_IED_CONN_HANDLE &stIedCon);
// 上传文件--目前IED不支持上传文件
void setComtradeFile(IedConnection con, const char *filename);
// 解析下载的录播文件并入库
int unPackComtradeFile(char *pfile);
// 删除录播文件
void deleteComtradeFile(IedConnection con, const char *filename);
// 获取实时监测数据-遥测
void vGetFCMXData_YC(IedConnection conn);
// 获取实时监测数据-遥信
void vGetFCMXData_YX(IedConnection conn);
// 设置控制参数
void vSetFCSEData_CTRL(IedConnection conn);
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */
#endif /* __HT_LIBIEC_61850_H */

@ -0,0 +1,248 @@
/****************************************************************************
** File name : HTIEC61850CSGFile.h
** Description : (CSG)-广线
** V1.5(2014-12).--
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC_61850_CSGFILE_H
#define __HT_IEC_61850_CSGFILE_H
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
#pragma pack (push ,1)
/************************************************************************************
* 广线-V1.5(2014.12)
* A:
* A.3
* 线___.dat
* 线B
* YYYYMMDDhhmmss
* YYYY42010
* MM201-12
* DD201-31
* hh200-23
* mm200-59
* ss200-59
* 0312B12000042 A384 000001_001_01_20100818151010.dat
------------------------------------------------------------------------------------
* B:
* B.3
* Q/CSG11801.8.1-2008
* 13
* B.4
* 线3B.1
* B.5 线
* 线2313+4线+6
*
* B.6 线
* 线4B.2
* B.7
* 线2B.3
* B.3
*
* 01
* 02
* 07
------------------------------------------------------------------------------------
* D:
* D.2
* a) Little-Endian
*
* b) $$$$0x24242424
* c) 使
* 14float0xFFFFFFFF
* d)
* D.1
* D.1
*
* char 1 ASCII'0''1'
* 'A''B''a''b' '$''#''@'
* byte 1 -2^7~2^7-1-128~127
* short 2 -2^15~2^15-1
* int 4 -2^31~2^31-1
* long 8 -2^63~2^63-1
* float 4 -2^128~2^128
* double 8 -2^1024~2^1024
* 1charbyte1char0x31byte0x01
*
* arraystruct
* e) unicode
************************************************************************************
D.3
a) 线11
5 - 15
b) 线11
2
c) 线31
d) 便线
0
e) 60
500KB
************************************************************************************/
#define CSG_NOT_USE_VALUE 0xFFFFFFFF // float 类型的值无效-未使用
#define CSG_SPECTROGRAM_PRPD 0x30 // 二维谱图
#define CSG_SPECTROGRAM_PRPS 0x31 // 三维谱图
/*
* D.2
*/
typedef struct _CSG_PDFILE_HEAD{
float fStandardVersion; // 规范版本号,所使用的通用格式规范版本号本要求设为1.2
float fFileVersion; // 文件版本号,在线监测装置厂家内部使用的版本号,从
// 1.000计起。注意与规范版本号区别开来
short shSpectrogramCode; // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
tint64 ilSpectrogramGenTime;// 谱图生成时间,YYYYMMDDhhmmss
char cTestFileFlag; // 测试文件标志位,0:测试用文件 1:非测试文件(局放文件)
char szChannleName[32]; //通道名称,unicode编码,以0x00结束
char cFdType; // 放电类型:0正常1尖端放电2悬浮放电3沿面放电4内部放电5颗粒放电6外部干扰7其它
char cWarnLevel; // 报警等级,0表示正常1表示1级报警2表示2级报警3表示3级报警。其中最高为3级报警;数字越大代表危险性越高
char cProbabilityFlag; // 放电类型概率统计标志,0表示未统计若放电类型为0即“正常”则不需统计此时放电类型概率设为O1表示已统计若放电类型不为0则需统计此时放电类型概率设为M
float fProbability[7]; // 放电类型概率(%),1-7种发电类型的概率放电类型0不需统计概率若未对放电概率进行统计即只判断出属于某一种放电类型则将对应的放电类型记为100%0xFFFFFFFF为未使用标识
int iFdPhaseNum_m; // 放电相位窗数m,工频周期被等分成m个检测时间段
int iAmplitude_n; // 量化幅值n,幅值范围被等分成若干个区间量化幅值表示第n个区间。若局放谱图类型为PRPD二维图则n设为Mp设为O
int iFrequencyCycle_p; // 工频周期数p,频周期的个数。若局放谱图类型为PRPS三维图则p设为Mn设为O
float f50Relevance; // 50Hz相关性,一个工频周期中放电信号与50Hz的相关程度单位为%。0xFFFFFFFF为未使用标识
float f100Relevance; // 50Hz相关性,一个工频周期中放电信号与50Hz的相关程度单位为%。0xFFFFFFFF为未使用标识
char cSpectrogramType; // 局放谱图类型标志,0表示PRPD二维图1表示PRPS三维图。
char cAmplitudeUnit; // 幅值单位,0表示dBm1表示mV2代表%
float fMinAmplitude; // 放电幅值下限0xFFFFFFFF为未使用标识
float fMaxAmplitude; // 放电幅值上限0xFFFFFFFF为未使用标识
char szSeparation[4]; // 分隔符$$$$.
}ST_CSG_PDFILE_HEAD;
typedef union
{
float f;
int i;
}ST_CSG_DATA;
// 局放谱图数据定义 附录表D.3节
typedef struct {
ST_CSG_DATA Data;
}ST_CSG_PD_DATA;
/*
* i D.4
*/
typedef struct {
char szGroupName[10]; // 组分名称,峰的组分名称例如H2、CH4、C2H2、C2H4、C2H6、CO、CO2等
char cPeakNumber; // 峰号,峰编号j
float fPeakTime; // 峰点时间,单位与“X轴单位”一致
float fPeakStartTime; // 峰开始点时间,单位与“X轴单位”一致
float fPeakStopTime; // 峰结束点时间,单位与“X轴单位”一致
float fPeakHigh; // 峰高,单位与“Y轴单位”一致
float fPeakArea; // 峰面积,单位为“Y轴单位”和“X轴单位”的乘积。例如“Y轴单位”为微伏“X轴单位”为秒则峰面积单位为微伏*秒
}ST_YSP_INFO;
/*
* D.4
*/
typedef struct {
char cChannelPeak_n; // 通道i的峰数n,通道i所具有的峰个数n
ST_YSP_INFO *pstInfo; // 通道i的峰信息,记录通道i的n个峰的信息通道i的第j个峰称为峰jj为0~n - 1之间的整数。从通道i的峰0开始排列共n个峰
}ST_CSG_YSP_CHANNEL;
/*
* D.4
*/
typedef struct {
float fStandardVersion; // 规范版本号,所使用的通用格式规范版本号本要求设为1.2
float fFileVersion; // 文件版本号,在线监测装置厂家内部使用的版本号,从
// 1.000计起。注意与规范版本号区别开来
short shSpectrogramCode; // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
tint64 ilSpectrogramGenTime; // 谱图生成时间,YYYYMMDDhhmmss
char cTestFileFlag; // 测试文件标志位,0表示该文件为测试用的临时文件
// 1表示在线监测装置能正常生成谱图文件。注意油中溶解气体出峰图周期性生成故通常情况下设为1
char szDeviceName[32]; // 被监测设备名称,unicode编码,以0x00结束
float fX_t; // X轴间隔t,数据点的时间间隔t用于绘制X轴
float fY_Max; // Y轴最大值,数据点的最大值用于绘制Y轴
char cXUnit; // X轴单位,0表示秒s1表示毫秒ms
char cYUnit; // Y轴单位,0表示毫伏mV1表示微伏μV
int iData_k; // 数据点数k,数据点个数k要求所有通道的数据点数k相同。X轴长度则为t*k
char cChannel_m; // 通道数m,谱图所具有的通道数m
ST_CSG_YSP_CHANNEL *pstChannel; // 通道信息, 记录m个通道信息第i个通道称为通道i,i为0~m - 1之间的整数。从通道0开始排列共m个通道
char szSeparation[4]; // 分隔符$$$$.
}ST_CSG_YSPFILE_HEAD;
// 油色谱谱图数据定义 附录表D.5节
typedef struct {
ST_CSG_DATA Data;
}ST_CSG_YSP_DATA;
/*
* D.6
*/
typedef struct {
float fStandardVersion; // 规范版本号,所使用的通用格式规范版本号本要求设为1.2
float fFileVersion; // 文件版本号,在线监测装置厂家内部使用的版本号,从
// 1.000计起。注意与规范版本号区别开来
short shSpectrogramCode; // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
tint64 ilSpectrogramGenTime; // 谱图生成时间,YYYYMMDDhhmmss
char cTestFileFlag; // 测试文件标志位,0表示该文件为测试用的临时文件1表示在线监测装置监测到断路器有动作
char szDeviceName[32]; // 被监测设备名称,unicode编码,以0x00结束
char cControl; // 0表示三相机械联动且仅有1个分闸线圈 1表示三相机械联动且有2个分闸线圈
// 2表示三相分相操作且每相仅有1个分闸线圈3表三相分相操作且每相有2个分闸线圈。
// 该项决定谱图数据的显示若操作机构三相机械联动即类型为0或1波形数据只放在A相
char cWaveformType; // 波形类型,0:表示分闸1线圈电流波形1:表示分闸2线圈电流波形2:表示合闸线圈电流波形 3:表示储能电机电流波形4:表示开断(运行)电流波形
float fX_t; // X轴间隔t,数据点的时间间隔t用于绘制X轴
float fY_Max; // Y轴最大值,数据点的最大值用于绘制Y轴
char cXUnit; // X轴单位,0表示秒s1表示毫秒ms
char cYUnit; // Y轴单位,0表示安培A
int iData_k; // 数据点数k,数据点个数k要求ABC三相的数据点数k相同。X轴长度则为t*k
char szSeparation[4]; // 分隔符$$$$.
}ST_CSG_DLQFILE_HEAD;
/*
* D.7
*/
typedef struct {
float *pfAWave; // 波形数据,k为数据点数数值表示每个数据点Y轴的值即真实电流值。若操作机构三相机械联动波形数据只放在A相此时B相、C相波形数据应省略
float *pfBWave; // 波形数据
float *pfCWave; // 波形数据
}ST_CSG_DLQ_DATA;
typedef struct {
int sno;
int tme;
short A1;
short A2;
short B1;
short B2;
short C1;
short C2;
short a1;
short a2;
short b1;
short b2;
short c1;
short c2;
short nsi;
short crt;
}ST_COMTRAD_DATA;
#pragma pack (pop)
void csgIEC61850PdFileParser(ST_FILE61850_LIST &stListFile);
int unGenComtrad(char *pfile);
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */
#endif /* __HT_IEC_61850_CSGFILE_H */

@ -0,0 +1,74 @@
/****************************************************************************
** File name : HTIEC61850FileParser.h
** Description : ISO iec 61850 dat file parser api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC61850_FILE_PARSER_H
#define __HT_IEC61850_FILE_PARSER_H
#pragma warning(disable: 4819)
#include <stdio.h>
#include "HTGlobal.h"
//#include "opencv/cv.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/ml.hpp"
#include "opencv2/objdetect.hpp"
//OpencvDirTraverse.cpp : Defines the entry point for the console application.
#ifdef _WIN32
#pragma comment(lib,"opencv_world300d.lib")
//#pragma comment(lib,"opencv_ts300d.lib")
#endif
using namespace std;
using namespace cv;
//#ifdef __cplusplus
//extern "C" {
//#endif /* __cplusplus */
#pragma pack (push ,1)
//谱图文件列表
typedef struct _COMTRAD_FILE {
unsigned char id[DEF_BUFFER_32+1]; // 谱图文件ID
unsigned char szFileName[DEF_BUFFER_256]; // 谱图bin/asc文件名
}ST_FILE61850_LIST;
//入库队列
typedef struct {
int iLen;
char cOpt;
char *pBuf;
}ST_DB_INSERT_LIST;
// 谱图文件与设备对应关系
//00001080219102_ZJXJG006C0W003007_20191208010000_024001_3473a2c23ae341a48fcf2c50f1e8d734
typedef struct _DESIVE_REALTION {
unsigned char szPdID[DEF_BUFFER_32 + 1]; // 局放信号记录ID,源自表transformer_pd.id
unsigned char szSensorID[DEF_BUFFER_32 + 1]; // sensorid
unsigned char szCacTypeCode[6 + 1]; // CAC报文类型编码 024001021001
unsigned char szMainTreeID[DEF_BUFFER_32+1]; // main_tree_id
}ST_DESIVE_REALTION;
#pragma pack (pop)
void *thread_sacnfile_proc(void *arg);
void *thread_file_parser_proc(void *arg);
void *thread_db_insert_proc(void *arg);
//#ifdef __cplusplus
//}
//#endif
#endif /* end __HT_IEC61850_FILE_PARSER_H */

@ -0,0 +1,137 @@
/****************************************************************************
** File name : HTIEC61850Data.h
** Description : define iec 61850 dat file parser api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC_61850_ISO_DATA_H
#define __HT_IEC_61850_ISO_DATA_H
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
#pragma pack (push ,1)
/***********************************************************************************
* cmtr_dat_smpdot - .
* @index:
* @time:
* @analogs: ()
* @digits:
*
************************************************************************************/
typedef struct {
int index;
int time;
int analogs[CMTR_ANALOG_MAX_COUNT];
char digits[CMTR_DIGIT_MAX_COUNT];
}ST_CMTR_DAT_SMPDOT;
/************************************************************************************
* cmtr_cfg_analog -
* @index:
* @name:
* @phase: ,ABCN
* @element
* @unit: kVVAmA
* @factor_a: a
* @factor_b: b
* @offset_time: ,0
* @smp_min: ,()
* @smp_max: ,()
*
* = factor_a * smp_value + factor_b
* factor_a * smp_min + factor_bfactor_a * smp_max + factor_b
*
* smp_minsmp_max65535
* intfactor_afactor_bdoublefloat
* cmtr
*
************************************************************************************/
typedef struct {
unsigned int index;
unsigned char name[CMTR_STRING_MAX_LENGTH];
unsigned char phase[CMTR_STRING_MAX_LENGTH];
unsigned char element[CMTR_STRING_MAX_LENGTH];
unsigned char unit[CMTR_STRING_MAX_LENGTH];
double factor_a;
double factor_b;
int offset_time;
int smp_min;
int smp_max;
}ST_CMTR_CFG_ANALOG;
/************************************************************************************
* cmtr_cfg_digit -
* @index:
* @name:
* @state: 102
*
************************************************************************************/
typedef struct {
int index;
unsigned char name[CMTR_STRING_MAX_LENGTH];
char state;
}ST_CMTR_CFG_DIGIT;
/************************************************************************************
* cmtr_cfg_smprate_info -
* @rate:
* @point:
*
************************************************************************************/
typedef struct {
float rate;
int point;
}ST_CMTR_CFG_SMPRATE;
/************************************************************************************
* cmtr_cfg_info -
* @station_name:
* @kymograph_id:
* @analog_count:
* @digit_count:
* @analogs:
* @digits:
* @frequency:
* @smprate_count:
* @smprates:
* @begin_time:
* @end_time:
* @file_type: ASCIIBinaryASCIIdat
* binary
************************************************************************************/
typedef struct {
unsigned char station_name[CMTR_STRING_MAX_LENGTH];
unsigned char kymograph_id[CMTR_STRING_MAX_LENGTH];
int analog_count;
int digit_count;
ST_CMTR_CFG_ANALOG analogs[CMTR_ANALOG_MAX_COUNT];
ST_CMTR_CFG_DIGIT digits[CMTR_DIGIT_MAX_COUNT];
float frequency;
int smprate_count;
ST_CMTR_CFG_SMPRATE smprates[CMTR_SMPRATE_MAX_COUNT];
unsigned char begin_time[CMTR_STRING_MAX_LENGTH];
unsigned char end_time[CMTR_STRING_MAX_LENGTH];
unsigned char file_type[CMTR_STRING_MAX_LENGTH];
}ST_CMTR_CFG_INFO;
#pragma pack (pop)
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */
#endif /* __HT_IEC61850_DATA_H */

@ -0,0 +1,39 @@
/****************************************************************************
** File name : HTIEC61850ISOFile.h
** Description : ISO iec 61850 dat file parser api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC61850_ISO_FILE_H
#define __HT_IEC61850_ISO_FILE_H
#include "HTGlobal.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
// 创建测试配置文件
int iCreateTest61850Config();
// 解析dat文件.文件类型ASCII/BINARY
void vIec61850FileParser();
#ifdef __cplusplus
}
#endif
#endif /* end __HT_IEC61850_ISO_FILE_H */

@ -0,0 +1,162 @@
/****************************************************************************
** File name : HTIEC61850Macros.h
** Description : IEC 61850 Macros define
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC_61850_MACROS_H
#define __HT_IEC_61850_MACROS_H
#include "HTGlobal.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/************************************************************************************
* comtrade
*
*
* 16
* 64
* 64
* 8
*
************************************************************************************/
#define CMTR_REV_YEAR_LENGTH 4
#define CMTR_STRING_MAX_LENGTH 64
#define CMTR_ANALOG_MAX_COUNT 255
#define CMTR_DIGIT_MAX_COUNT 255
#define CMTR_SMPRATE_MAX_COUNT 255
#ifdef _WIN32
#define f_open _open
#define f_read _read
#define f_write _write
#define f_close _close
#else
#define f_open open
#define f_read read
#define f_write write
#define f_close close
#endif
/************************************************************************************
* ht_cmtr_openrb/ht_cmtr_openwb/ht_cmtr_openab/ht_cmtr_close
* - recv\sendr\w
* @pfd: socket
* @str: ip
*
************************************************************************************/
#define ht_cmtr_openrb(str) (f_open((str), O_RDONLY, S_IWRITE | S_IREAD))
#define ht_cmtr_openwb(str) (f_open((str), O_CREAT | O_RDWR, S_IWRITE | S_IREAD))
#define ht_cmtr_openab(str) (f_open((str), O_CREAT | O_APPEND | O_RDWR, S_IWRITE | S_IREAD))
#define ht_cmtr_close(pfd) (f_close(pfd))
//字节序高低位转换开关
//#define ENDIAN_CONIVER
// 宏开关 定义为文件读写
#define CMTR_IOFILE
//#define CMTR_IOBUFFER
// 是否输出txt的文本文件
//#define CMTR_OUT_TXTFILE
// 数据库操作类型
#define DB_OPT_INSERT 1
#define DB_OPT_UPDATE 2
#define DB_OPT_DELETE 3
/************************************************************************************
*
* recv\sendr\w
*
* ht_read_cmtr_bufn/ht_read_cmtr_bufn - cmtr
* @pfd: fdbuffer
* @buf:
* @count:
*
************************************************************************************/
#if defined(CMTR_IOFILE)
//typedef int _my_cmtr_ioptr;
#define ht_read_cmtr_bufn(pfd, buf, count) \
do { \
if (f_read((pfd), (buf), (count)) <= 0) { \
(pfd) = -1; \
} \
} while (0);
#define ht_write_cmtr_bufn(pfd, buf, count) \
do { \
if (f_write((pfd), (buf), (count)) <= 0) { \
(pfd) = -1; \
} \
} while (0);
#define ht_check_cmtr_ptr(pfd) \
(((pfd) != -1) && ((pfd) != 0))
#elif defined(CMTR_IOBUFFER)
//typedef u8* _my_cmtr_ioptr;
//typedef unsigned char* _my_cmtr_ioptr;
#define ht_read_cmtr_bufn(pfd, buf, count) \
do { \
memcpy((buf), (pfd), (count)); \
(pfd) += (count); \
} while (0);
#define ht_write_cmtr_bufn(pfd, buf, count) \
do { \
memcpy((pfd), (buf), (count)); \
(pfd) += (count); \
} while (0);
#define ht_check_cmtr_ptr(pfd) \
(((pfd) != -1) && ((pfd) != 0))
#endif
/************************************************************************************
* ht_read_cmtr_data/ht_write_cmtr_data - /cmtr
* @src: buffer
* @data: /
* @count: /
* @counter: /
*
************************************************************************************/
#define ht_read_cmtr_data(src, data, count, counter) \
do { \
if (ht_check_cmtr_ptr(src)) { \
ht_read_cmtr_bufn((src), (data), (count)); \
(counter) += (count); \
} \
} while (0);
#define ht_write_cmtr_data(src, data, count, counter) \
do { \
if (ht_check_cmtr_ptr(src)) { \
ht_write_cmtr_bufn((src), (data), (count)); \
(counter) += (count); \
} \
} while (0);
#ifdef __cplusplus
}
#endif
#endif /* end __HT_IEC_61850_MACROS_H */

@ -0,0 +1,83 @@
/****************************************************************************
** File name : HTIEC61850Protocol.h
** Description : define iec 61850 network protocol api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEC_61850_PROTOCOL_H
#define __HT_IEC_61850_PROTOCOL_H
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
#pragma pack (push ,1)
/************************************************************************************
* svpdu_lpdu_head - 9-2/9-1(sample value)(link layer)(pdu)
* @des_mac: (FF:FF:FF:FF:FF:FF广),ISO/IEC8802-3
* @src_mac: ,ISO/IEC8802-3
* @tpid: (Tag Protocol Identifier),()
* @tci: (Tag Control Information),()
* @ether_type:
* @appid: ,,,
*
* @epdu_length: APPIDPDU8m(m<1480);
* @reserve1: 0;
* @reserve2: 0;
*
* TPID 0x8100;
* TCI :
* PRIUser priority(),3bit(BS3)user priority,
* GOOSE线(4);
* CFIPRI1bitRIF;/RIF,
* 0;1ISO/IEC8802-3Length/Type(RIF);
* VID: 12bit;
* (VID)VID 0
* IEEE802.1Q4713
* 10
* (VID)(VID)
* VID
* 0 4
* ETHER_TYPE : 16[][APPID]
* [APPID]APPID
* (16) APPID
* IEC61850-8-1GOOSE 88-B8 0 0
* IEC61850-8-1GSE 88-B9 0 0
* IEC61850-9-1 88-BA 0 1
* IEC61850-9-2 88-BA 0 1
* APPID APPID APPID[APPID ][]
* APPID (8 )
* 0x40000x7fffAPPID0x4000
* (SV APPID)
*
*
************************************************************************************/
typedef struct {
unsigned char des_mac[6];
unsigned char src_mac[6];
unsigned short tpid;
unsigned short tci;
unsigned short ether_type;
unsigned short appid;
unsigned short epdu_length;
unsigned short reserve1;
unsigned short reserve2;
}ST_SVPDU_LPDU_HEAD;
#pragma pack (pop)
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */
#endif /* __HT_IEC_61850_PROTOCOL_H */

@ -0,0 +1,41 @@
/****************************************************************************
** File name : HTIEC61850Thread.h
** Description : define iec 61850 network protocol api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_LIBIEC_61850_THREAD_H
#define __HT_LIBIEC_61850_THREAD_H
#include "HTGlobal.h"
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
void *thread_cache_proc(void *arg); // ͬ²½ÄÚ´æÊý¾ÝÏß³Ì
void *thread_iec61850_getcomtrade_files(void *arg);
void *thread_iec61850_client_proc(void *arg);
void *thread_iec61850_manager_proc(void *arg);
void* thread_database_proc(void * arg);
/***************************************************************************
** function name : thread_dbalarm_proc
** deacription : parser thread
** parameter : none
** return code : NULL
***************************************************************************/
void* thread_dbalarm_proc(void * arg);
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */
#endif /* __HT_LIBIEC_61850_THREAD_H */

@ -0,0 +1,63 @@
/****************************************************************************
** File name : HTIEEE1588V2.h
** Description : IEEE1588 v2 Ptp timer protoclo api
** Create date : 2019.09.01
** Auther by : Liuyx
** Version info : V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE AUTHER DESC
** -------------------------------------------------------------------------
** 2019.09.01 Liuyx first build
****************************************************************************/
#ifndef __HT_IEEE1588_V2_H
#define __HT_IEEE1588_V2_H
#include "HTGlobal.h"
/* ether_header */
//#include <netinet/if_ether.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef struct ptp_header {
uint8_t ptp_ts : 4, /*transportSpecific*/
ptp_type : 4; /*messageType*/
uint8_t ptp_v; /*versionPTP (4 bits in size)*/
uint16_t ptp_ml; /*messageLength*/
uint8_t ptp_dn; /*domainNumber*/
uint8_t ptp_res; /*reserved*/
uint16_t ptp_flags; /*flags*/
uint64_t ptp_cf; /*correctionField*/
uint32_t ptp_res2; /*reserved*/
uint8_t ptp_src[10]; /*sourcePortIdentity,8 byte mac,2 byte portId*/
uint16_t ptp_sid; /*sequenceId*/
uint8_t ptp_ctlf; /*controlField*/
uint8_t ptp_lmi; /*logMessageInterval*/
} ST_PTP_HEADER; // __attribute__((__packed__));
typedef struct pkt_ptp {
//struct ether_header eh;
ST_PTP_HEADER ph;
uint64_t s : 48;
uint32_t ns;
} ST_PKT_PTPS; // __attribute__((__packed__));
enum ptp_msg_type
{
SYNC = 0x0,
DELAY_REQ = 0x1,
FOLLOW_UP = 0x8,
DELAY_RESP = 0x9,
};
#ifdef __cplusplus
}
#endif
#endif /* end __HT_IEEE1588_V2_H */

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save