37 changed files with 4657 additions and 0 deletions
@ -0,0 +1,31 @@ |
|||||
|
|
||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
|
# Visual Studio Version 16 |
||||
|
VisualStudioVersion = 16.0.35731.53 |
||||
|
MinimumVisualStudioVersion = 10.0.40219.1 |
||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "A2lTestDlg", "A2lTestDlg\A2lTestDlg.vcxproj", "{86752C60-05E4-465C-9D79-876C97ABD2BA}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|x64 = Debug|x64 |
||||
|
Debug|x86 = Debug|x86 |
||||
|
Release|x64 = Release|x64 |
||||
|
Release|x86 = Release|x86 |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Debug|x64.ActiveCfg = Debug|x64 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Debug|x64.Build.0 = Debug|x64 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Debug|x86.ActiveCfg = Debug|Win32 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Debug|x86.Build.0 = Debug|Win32 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Release|x64.ActiveCfg = Release|x64 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Release|x64.Build.0 = Release|x64 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Release|x86.ActiveCfg = Release|Win32 |
||||
|
{86752C60-05E4-465C-9D79-876C97ABD2BA}.Release|x86.Build.0 = Release|Win32 |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {F96F38CF-D37B-45D8-9FA2-665EB10C5913} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,718 @@ |
|||||
|
/*----------------------------------------------------------------------------
|
||||
|
| File: |
||||
|
| A2L.c |
||||
|
| |
||||
|
| Description: |
||||
|
| Create A2L file |
||||
|
| |
||||
|
| Copyright (c) Vector Informatik GmbH. All rights reserved. |
||||
|
| Licensed under the MIT license. See LICENSE file in the project root for details. |
||||
|
| |
||||
|
----------------------------------------------------------------------------*/ |
||||
|
#include "pch.h" |
||||
|
#include "framework.h" |
||||
|
|
||||
|
#include "main.h" |
||||
|
#include "platform.h" |
||||
|
#include "dbg_print.h" |
||||
|
#include "xcpLite.h" |
||||
|
#include "A2L.h" |
||||
|
|
||||
|
static FILE* gA2lFile = NULL; |
||||
|
static uint16_t gA2lFixedEvent = XCP_INVALID_EVENT; |
||||
|
static uint16_t gA2lDefaultEvent = XCP_INVALID_EVENT; |
||||
|
|
||||
|
static uint32_t gA2lMeasurements; |
||||
|
static uint32_t gA2lParameters; |
||||
|
static uint32_t gA2lTypedefs; |
||||
|
static uint32_t gA2lComponents; |
||||
|
static uint32_t gA2lInstances; |
||||
|
static uint32_t gA2lConversions; |
||||
|
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
// Check for memory accessibility
|
||||
|
//#define A2L_ENABLE_MEMORY_CHECK
|
||||
|
#ifdef A2L_ENABLE_MEMORY_CHECK |
||||
|
static void mem_check(const char* name, int32_t type, uint8_t ext, uint32_t addr) { |
||||
|
(void)type; (void)name; |
||||
|
volatile uint8_t *p = ApplXcpGetPointer(ext,addr); |
||||
|
if (p==NULL) { DBG_PRINTF1("ERROR: memory address 0x%04X of variable %s not accessible !\n",addr,name); assert(0); } |
||||
|
volatile uint8_t b = *p; // if this leads to a memory protection error, check if address transformation from A2L to uint_8_p* transformation is correct
|
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* gA2lHeader = |
||||
|
"ASAP2_VERSION 1 71\n" |
||||
|
"/begin PROJECT %s \"\"\n" |
||||
|
"/begin HEADER \"\" VERSION \"1.0\" /end HEADER\n" |
||||
|
"/begin MODULE %s \"\"\n" |
||||
|
"/include \"XCP_104.aml\"\n\n" |
||||
|
|
||||
|
"/begin MOD_COMMON \"\"\n" |
||||
|
"BYTE_ORDER MSB_LAST\n" |
||||
|
"ALIGNMENT_BYTE 1\n" |
||||
|
"ALIGNMENT_WORD 1\n" |
||||
|
"ALIGNMENT_LONG 1\n" |
||||
|
"ALIGNMENT_FLOAT16_IEEE 1\n" |
||||
|
"ALIGNMENT_FLOAT32_IEEE 1\n" |
||||
|
"ALIGNMENT_FLOAT64_IEEE 1\n" |
||||
|
"ALIGNMENT_INT64 1\n" |
||||
|
"/end MOD_COMMON\n" |
||||
|
"\n"; |
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* gA2lMemorySegment = |
||||
|
"/begin MEMORY_SEGMENT\n" |
||||
|
"CALRAM \"\" DATA FLASH INTERN 0x%08X 0x%08X -1 -1 -1 -1 -1\n" // CALRAM_START, CALRAM_SIZE
|
||||
|
"/begin IF_DATA XCP\n" |
||||
|
"/begin SEGMENT 0x01 0x02 0x00 0x00 0x00 \n" |
||||
|
"/begin CHECKSUM XCP_ADD_44 MAX_BLOCK_SIZE 0xFFFF EXTERNAL_FUNCTION \"\" /end CHECKSUM\n" |
||||
|
"/begin PAGE 0x01 ECU_ACCESS_WITH_XCP_ONLY XCP_READ_ACCESS_WITH_ECU_ONLY XCP_WRITE_ACCESS_NOT_ALLOWED /end PAGE\n" |
||||
|
"/begin PAGE 0x00 ECU_ACCESS_WITH_XCP_ONLY XCP_READ_ACCESS_WITH_ECU_ONLY XCP_WRITE_ACCESS_WITH_ECU_ONLY /end PAGE\n" |
||||
|
"/end SEGMENT\n" |
||||
|
"/end IF_DATA\n" |
||||
|
"/end MEMORY_SEGMENT\n"; |
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* const gA2lIfDataBegin = |
||||
|
"\n/begin IF_DATA XCP\n"; |
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* gA2lIfDataProtocolLayer = // Parameter: XCP_PROTOCOL_LAYER_VERSION, MAX_CTO, MAX_DTO
|
||||
|
"/begin PROTOCOL_LAYER\n" |
||||
|
" 0x%04X" // XCP_PROTOCOL_LAYER_VERSION
|
||||
|
" 1000 2000 0 0 0 0 0" // Timeouts T1-T7
|
||||
|
" %u %u " // MAX_CTO, MAX_DTO
|
||||
|
"BYTE_ORDER_MSB_LAST ADDRESS_GRANULARITY_BYTE\n" // Intel and BYTE pointers
|
||||
|
"OPTIONAL_CMD GET_COMM_MODE_INFO\n" // Optional commands
|
||||
|
"OPTIONAL_CMD GET_ID\n" |
||||
|
"OPTIONAL_CMD SET_MTA\n" |
||||
|
"OPTIONAL_CMD UPLOAD\n" |
||||
|
"OPTIONAL_CMD SHORT_UPLOAD\n" |
||||
|
"OPTIONAL_CMD DOWNLOAD\n" |
||||
|
"OPTIONAL_CMD SHORT_DOWNLOAD\n" |
||||
|
#ifdef XCP_ENABLE_CAL_PAGE |
||||
|
"OPTIONAL_CMD GET_CAL_PAGE\n" |
||||
|
"OPTIONAL_CMD SET_CAL_PAGE\n" |
||||
|
//"OPTIONAL_CMD CC_GET_PAG_PROCESSOR_INFO\n"
|
||||
|
//"OPTIONAL_CMD CC_GET_SEGMENT_INFO\n"
|
||||
|
//"OPTIONAL_CMD CC_GET_PAGE_INFO\n"
|
||||
|
//"OPTIONAL_CMD CC_SET_SEGMENT_MODE\n"
|
||||
|
//"OPTIONAL_CMD CC_GET_SEGMENT_MODE\n"
|
||||
|
//"OPTIONAL_CMD CC_COPY_CAL_PAGE\n"
|
||||
|
#endif |
||||
|
#ifdef XCP_ENABLE_CHECKSUM |
||||
|
"OPTIONAL_CMD BUILD_CHECKSUM\n" |
||||
|
#endif |
||||
|
//"OPTIONAL_CMD TRANSPORT_LAYER_CMD\n"
|
||||
|
//"OPTIONAL_CMD USER_CMD\n"
|
||||
|
"OPTIONAL_CMD GET_DAQ_RESOLUTION_INFO\n" |
||||
|
"OPTIONAL_CMD GET_DAQ_PROCESSOR_INFO\n" |
||||
|
#ifdef XCP_ENABLE_DAQ_EVENT_INFO |
||||
|
"OPTIONAL_CMD GET_DAQ_EVENT_INFO\n" |
||||
|
#endif |
||||
|
//"OPTIONAL_CMD GET_DAQ_LIST_INFO\n"
|
||||
|
"OPTIONAL_CMD FREE_DAQ\n" |
||||
|
"OPTIONAL_CMD ALLOC_DAQ\n" |
||||
|
"OPTIONAL_CMD ALLOC_ODT\n" |
||||
|
"OPTIONAL_CMD ALLOC_ODT_ENTRY\n" |
||||
|
//"OPTIONAL_CMD CLEAR_DAQ_LIST\n"
|
||||
|
//"OPTIONAL_CMD READ_DAQ\n"
|
||||
|
"OPTIONAL_CMD SET_DAQ_PTR\n" |
||||
|
"OPTIONAL_CMD WRITE_DAQ\n" |
||||
|
"OPTIONAL_CMD GET_DAQ_LIST_MODE\n" |
||||
|
"OPTIONAL_CMD SET_DAQ_LIST_MODE\n" |
||||
|
"OPTIONAL_CMD START_STOP_SYNCH\n" |
||||
|
"OPTIONAL_CMD START_STOP_DAQ_LIST\n" |
||||
|
"OPTIONAL_CMD GET_DAQ_CLOCK\n" |
||||
|
#if XCP_TRANSPORT_LAYER_TYPE == XCP_TRANSPORT_LAYER_ETH |
||||
|
"OPTIONAL_CMD WRITE_DAQ_MULTIPLE\n" |
||||
|
#if XCP_PROTOCOL_LAYER_VERSION >= 0x0103 |
||||
|
"OPTIONAL_CMD TIME_CORRELATION_PROPERTIES\n" |
||||
|
//"OPTIONAL_CMD DTO_CTR_PROPERTIES\n"
|
||||
|
#endif |
||||
|
#if XCP_PROTOCOL_LAYER_VERSION >= 0x0104 |
||||
|
"OPTIONAL_LEVEL1_CMD GET_VERSION\n" |
||||
|
#ifdef XCP_ENABLE_PACKED_MODE |
||||
|
"OPTIONAL_LEVEL1_CMD SET_DAQ_PACKED_MODE\n" |
||||
|
"OPTIONAL_LEVEL1_CMD GET_DAQ_PACKED_MODE\n" |
||||
|
#endif |
||||
|
#endif |
||||
|
#if XCP_PROTOCOL_LAYER_VERSION >= 0x0150 |
||||
|
//"OPTIONAL_LEVEL1_CMD SW_DBG_COMMAND_SPACE\n"
|
||||
|
//"OPTIONAL_LEVEL1_CMD POD_COMMAND_SPACE\n"
|
||||
|
#endif |
||||
|
#endif // ETH
|
||||
|
"/end PROTOCOL_LAYER\n" |
||||
|
|
||||
|
#if XCP_PROTOCOL_LAYER_VERSION >= 0x0103 |
||||
|
/*
|
||||
|
"/begin TIME_CORRELATION\n" // TIME
|
||||
|
"/end TIME_CORRELATION\n" |
||||
|
*/ |
||||
|
#endif |
||||
|
; |
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* gA2lIfDataBeginDAQ = // Parameter: %u max event, %s timestamp unit
|
||||
|
"/begin DAQ\n" |
||||
|
"DYNAMIC 0 %u 0 OPTIMISATION_TYPE_DEFAULT ADDRESS_EXTENSION_FREE IDENTIFICATION_FIELD_TYPE_RELATIVE_BYTE GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE 0xF8 OVERLOAD_INDICATION_PID\n" |
||||
|
"/begin TIMESTAMP_SUPPORTED\n" |
||||
|
"0x01 SIZE_DWORD %s TIMESTAMP_FIXED\n" |
||||
|
"/end TIMESTAMP_SUPPORTED\n"; |
||||
|
|
||||
|
// ... Event list follows, before EndDaq
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char * const gA2lIfDataEndDAQ = |
||||
|
"/end DAQ\n"; |
||||
|
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
// XCP_ON_ETH
|
||||
|
static const char* gA2lIfDataEth = // Parameter: %s TCP or UDP, %04X tl version, %u port, %s ip address string, %s TCP or UDP
|
||||
|
"/begin XCP_ON_%s_IP\n" // Transport Layer
|
||||
|
" 0x%04X %u ADDRESS \"%s\"\n" |
||||
|
//"OPTIONAL_TL_SUBCMD GET_SERVER_ID\n"
|
||||
|
//"OPTIONAL_TL_SUBCMD GET_DAQ_ID\n"
|
||||
|
//"OPTIONAL_TL_SUBCMD SET_DAQ_ID\n"
|
||||
|
#if defined(XCPTL_ENABLE_MULTICAST) && defined(XCP_ENABLE_DAQ_CLOCK_MULTICAST) |
||||
|
" OPTIONAL_TL_SUBCMD GET_DAQ_CLOCK_MULTICAST\n" |
||||
|
#endif |
||||
|
"/end XCP_ON_%s_IP\n" // Transport Layer
|
||||
|
; |
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
// XCP_ON_CAN (CAN_FD not implemented yet)
|
||||
|
static const char* gA2lIfDataCan = // Parameter: TRANSPORT_LAYER_VERSION, CRO_ID, DTO_ID, BITRATE
|
||||
|
"/begin XCP_ON_CAN\n" // Transport Layer
|
||||
|
" 0x%04X\n" |
||||
|
" CAN_ID_MASTER 0x%x\n" |
||||
|
" CAN_ID_SLAVE 0x%x\n" |
||||
|
" BAUDRATE %u\n" |
||||
|
" SAMPLE_POINT 0x4B\n" |
||||
|
" SAMPLE_RATE SINGLE\n" |
||||
|
" BTL_CYCLES 0x08\n" |
||||
|
" SJW 0x02\n" |
||||
|
" SYNC_EDGE SINGLE\n" |
||||
|
"/end XCP_ON_CAN\n"; |
||||
|
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* const gA2lIfDataEnd = |
||||
|
"/end IF_DATA\n\n"; |
||||
|
|
||||
|
|
||||
|
//----------------------------------------------------------------------------------
|
||||
|
static const char* const gA2lFooter = |
||||
|
"/end MODULE\n" |
||||
|
"/end PROJECT\n"; |
||||
|
|
||||
|
|
||||
|
|
||||
|
#define printPhysUnit(unit) if (unit != NULL && strlen(unit) > 0) fprintf(gA2lFile, " PHYS_UNIT \"%s\"", unit); |
||||
|
#define printAddrExt(ext) if (ext>0) fprintf(gA2lFile, " ECU_ADDRESS_EXTENSION %u",ext); |
||||
|
|
||||
|
const char* A2lGetSymbolName(const char* instanceName, const char* name) { |
||||
|
static char s[256]; |
||||
|
if (instanceName != NULL && strlen(instanceName) > 0) { |
||||
|
SNPRINTF(s, 256, "%s.%s", instanceName, name); |
||||
|
return s; |
||||
|
} |
||||
|
else { |
||||
|
return name; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static const char* getType(int32_t type) { |
||||
|
const char* types; |
||||
|
switch (type) { |
||||
|
case A2L_TYPE_INT8: types = "SBYTE"; break; |
||||
|
case A2L_TYPE_INT16: types = "SWORD"; break; |
||||
|
case A2L_TYPE_INT32: types = "SLONG"; break; |
||||
|
case A2L_TYPE_INT64: types = "A_INT64"; break; |
||||
|
case A2L_TYPE_UINT8: types = "UBYTE"; break; |
||||
|
case A2L_TYPE_UINT16: types = "UWORD"; break; |
||||
|
case A2L_TYPE_UINT32: types = "ULONG"; break; |
||||
|
case A2L_TYPE_UINT64: types = "A_UINT64"; break; |
||||
|
case A2L_TYPE_FLOAT: types = "FLOAT32_IEEE"; break; |
||||
|
case A2L_TYPE_DOUBLE: types = "FLOAT64_IEEE"; break; |
||||
|
default: |
||||
|
types = NULL; |
||||
|
} |
||||
|
return types; |
||||
|
} |
||||
|
|
||||
|
static const char* getTypeMin(int32_t type) { |
||||
|
const char* min; |
||||
|
switch (type) { |
||||
|
case A2L_TYPE_INT8: min = "-128"; break; |
||||
|
case A2L_TYPE_INT16: min = "-32768"; break; |
||||
|
case A2L_TYPE_INT32: min = "-2147483648"; break; |
||||
|
case A2L_TYPE_INT64: min = "-1E12"; break; |
||||
|
case A2L_TYPE_FLOAT: min = "-1E12"; break; |
||||
|
case A2L_TYPE_DOUBLE: min = "-1E12"; break; |
||||
|
default: min = "0"; |
||||
|
} |
||||
|
return min; |
||||
|
} |
||||
|
|
||||
|
static const char* getTypeMax(int32_t type) { |
||||
|
const char* max; |
||||
|
switch (type) { |
||||
|
case A2L_TYPE_INT8: max = "127"; break; |
||||
|
case A2L_TYPE_INT16: max = "32767"; break; |
||||
|
case A2L_TYPE_INT32: max = "2147483647"; break; |
||||
|
case A2L_TYPE_UINT8: max = "255"; break; |
||||
|
case A2L_TYPE_UINT16: max = "65535"; break; |
||||
|
case A2L_TYPE_UINT32: max = "4294967295"; break; |
||||
|
default: max = "1E12"; |
||||
|
} |
||||
|
return max; |
||||
|
} |
||||
|
|
||||
|
static const char* getPhysMin(int32_t type, double factor, double offset) { |
||||
|
double value = 0.0; |
||||
|
switch (type) { |
||||
|
case A2L_TYPE_INT8: value = -128; break; |
||||
|
case A2L_TYPE_INT16: value = -32768; break; |
||||
|
case A2L_TYPE_INT32: value = -(double)2147483648; break; |
||||
|
case A2L_TYPE_INT64: value = -1E12; break; |
||||
|
case A2L_TYPE_FLOAT: value = -1E12; break; |
||||
|
case A2L_TYPE_DOUBLE: value = -1E12; break; |
||||
|
default: value = 0.0; |
||||
|
} |
||||
|
|
||||
|
static char str[20]; |
||||
|
snprintf(str, 20, "%f", factor * value + offset); |
||||
|
return str; |
||||
|
} |
||||
|
|
||||
|
static const char* getPhysMax(int32_t type, double factor, double offset) { |
||||
|
double value = 0.0; |
||||
|
switch (type) { |
||||
|
case A2L_TYPE_INT8: value = 127; break; |
||||
|
case A2L_TYPE_INT16: value = 32767; break; |
||||
|
case A2L_TYPE_INT32: value = 2147483647; break; |
||||
|
case A2L_TYPE_UINT8: value = 255; break; |
||||
|
case A2L_TYPE_UINT16: value = 65535; break; |
||||
|
case A2L_TYPE_UINT32: value = 4294967295; break; |
||||
|
default: value = 1E12; |
||||
|
} |
||||
|
static char str[20]; |
||||
|
snprintf(str, 20, "%f", factor * value + offset); |
||||
|
return str; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
BOOL A2lOpen(const char *filename, const char* projectName ) { |
||||
|
|
||||
|
DBG_PRINTF1("\nCreate A2L %s\n", filename); |
||||
|
gA2lFile = NULL; |
||||
|
gA2lFixedEvent = XCP_INVALID_EVENT; |
||||
|
gA2lMeasurements = gA2lParameters = gA2lTypedefs = gA2lInstances = gA2lConversions = gA2lComponents = 0; |
||||
|
gA2lFile = fopen(filename, "w"); |
||||
|
if (gA2lFile == 0) { |
||||
|
DBG_PRINTF_ERROR("ERROR: Could not create A2L file %s!\n", filename); |
||||
|
return FALSE; |
||||
|
} |
||||
|
|
||||
|
// Create header
|
||||
|
fprintf(gA2lFile, gA2lHeader, projectName, projectName); |
||||
|
|
||||
|
// Create standard record layouts for elementary types
|
||||
|
for (int i = -10; i <= +10; i++) { |
||||
|
const char* t = getType(i); |
||||
|
if (t != NULL) { |
||||
|
fprintf(gA2lFile, "/begin RECORD_LAYOUT R_%s FNC_VALUES 1 %s ROW_DIR DIRECT /end RECORD_LAYOUT\n", t, t); |
||||
|
fprintf(gA2lFile, "/begin TYPEDEF_MEASUREMENT M_%s \"\" %s NO_COMPU_METHOD 0 0 %s %s /end TYPEDEF_MEASUREMENT\n", t, t, getTypeMin(i), getTypeMax(i)); |
||||
|
fprintf(gA2lFile, "/begin TYPEDEF_CHARACTERISTIC C_%s \"\" VALUE R_%s 0 NO_COMPU_METHOD %s %s /end TYPEDEF_CHARACTERISTIC\n", t, t, getTypeMin(i), getTypeMax(i)); |
||||
|
} |
||||
|
} |
||||
|
fprintf(gA2lFile, "\n"); |
||||
|
|
||||
|
return TRUE; |
||||
|
} |
||||
|
|
||||
|
// Memory segments
|
||||
|
void A2lCreate_MOD_PAR(uint32_t startAddr, uint32_t size, char *epk) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin MOD_PAR \"\"\n"); |
||||
|
fprintf(gA2lFile, "EPK \"%s\"\n", epk); |
||||
|
fprintf(gA2lFile, "ADDR_EPK 0x%08X\n", ApplXcpGetAddr((uint8_t*)epk)); |
||||
|
fprintf(gA2lFile, gA2lMemorySegment, startAddr, size); |
||||
|
DBG_PRINTF1(" A2L MOD_PAR MEMORY_SEGMENT 1: 0x%08X %u\n", startAddr, size); |
||||
|
fprintf(gA2lFile, "/end MOD_PAR\n\n"); |
||||
|
#if OPTION_ENABLE_DBG_PRINTS |
||||
|
if (epk) DBG_PRINTF1(" A2L MOD_PAR EPK \"%s\" 0x%08X\n", epk, ApplXcpGetAddr((uint8_t*)epk)); |
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void A2lCreate_IF_DATA_DAQ() { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
|
||||
|
#if defined( XCP_ENABLE_DAQ_EVENT_LIST ) && !defined( XCP_ENABLE_DAQ_EVENT_INFO ) |
||||
|
tXcpEvent* eventList; |
||||
|
#endif |
||||
|
uint16_t eventCount = 0; |
||||
|
|
||||
|
#if (XCP_TIMESTAMP_UNIT==DAQ_TIMESTAMP_UNIT_1NS) |
||||
|
#define XCP_TIMESTAMP_UNIT_S "UNIT_1NS" |
||||
|
#elif (XCP_TIMESTAMP_UNIT==DAQ_TIMESTAMP_UNIT_1US) |
||||
|
#define XCP_TIMESTAMP_UNIT_S "UNIT_1US" |
||||
|
#else |
||||
|
#error |
||||
|
#endif |
||||
|
|
||||
|
// Event list in A2L file (if event info by XCP is not active)
|
||||
|
#if defined( XCP_ENABLE_DAQ_EVENT_LIST ) && !defined( XCP_ENABLE_DAQ_EVENT_INFO ) |
||||
|
eventList = XcpGetEventList(&eventCount); |
||||
|
#endif |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataBeginDAQ, eventCount, XCP_TIMESTAMP_UNIT_S); |
||||
|
|
||||
|
// Eventlist
|
||||
|
#if defined( XCP_ENABLE_DAQ_EVENT_LIST ) && !defined( XCP_ENABLE_DAQ_EVENT_INFO ) |
||||
|
for (uint32_t i = 0; i < eventCount; i++) { |
||||
|
|
||||
|
fprintf(gA2lFile, "/begin EVENT \"%s\" \"%s\" 0x%X DAQ 0xFF %u %u %u CONSISTENCY EVENT", eventList[i].shortName, eventList[i].shortName, i, eventList[i].timeCycle, eventList[i].timeUnit, eventList[i].priority); |
||||
|
#ifdef XCP_ENABLE_PACKED_MODE |
||||
|
if (eventList[i].sampleCount != 0) { |
||||
|
fprintf(gA2lFile, " /begin DAQ_PACKED_MODE ELEMENT_GROUPED STS_LAST MANDATORY %u /end DAQ_PACKED_MODE", eventList[i].sampleCount); |
||||
|
} |
||||
|
#endif |
||||
|
fprintf(gA2lFile, " /end EVENT\n"); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataEndDAQ); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void A2lCreate_ETH_IF_DATA(BOOL useTCP, const uint8_t* addr, uint16_t port) { |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataBegin); |
||||
|
|
||||
|
// Protocol Layer info
|
||||
|
fprintf(gA2lFile, gA2lIfDataProtocolLayer, XCP_PROTOCOL_LAYER_VERSION, XCPTL_MAX_CTO_SIZE, XCPTL_MAX_DTO_SIZE); |
||||
|
|
||||
|
// DAQ info
|
||||
|
A2lCreate_IF_DATA_DAQ(); |
||||
|
|
||||
|
// Transport Layer info
|
||||
|
uint8_t addr0[] = { 127,0,0,1 }; // Use localhost if no other option
|
||||
|
if (addr != NULL && addr[0] != 0) { |
||||
|
memcpy(addr0, addr, 4); |
||||
|
} else { |
||||
|
socketGetLocalAddr(NULL, addr0); |
||||
|
} |
||||
|
char addrs[17]; |
||||
|
SPRINTF(addrs, "%u.%u.%u.%u", addr0[0], addr0[1], addr0[2], addr0[3]); |
||||
|
char* prot = useTCP ? (char*)"TCP" : (char*)"UDP"; |
||||
|
fprintf(gA2lFile, gA2lIfDataEth, prot, XCP_TRANSPORT_LAYER_VERSION, port, addrs, prot); |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataEnd); |
||||
|
|
||||
|
DBG_PRINTF1(" IF_DATA XCP_ON_%s, ip=%s, port=%u\n", prot, addrs, port); |
||||
|
} |
||||
|
|
||||
|
void A2lCreate_CAN_IF_DATA(BOOL useCANFD, uint16_t croId, uint16_t dtoId, uint32_t bitRate) { |
||||
|
|
||||
|
(void)useCANFD; |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataBegin); |
||||
|
|
||||
|
// Protocol Layer info
|
||||
|
fprintf(gA2lFile, gA2lIfDataProtocolLayer, XCP_PROTOCOL_LAYER_VERSION, XCPTL_MAX_CTO_SIZE, XCPTL_MAX_DTO_SIZE); |
||||
|
|
||||
|
// DAQ info
|
||||
|
A2lCreate_IF_DATA_DAQ(); |
||||
|
|
||||
|
// Transport Layer info
|
||||
|
uint32_t _croId = croId; |
||||
|
uint32_t _dtoId = dtoId; |
||||
|
if (useCANFD) { |
||||
|
_croId |= 0x40000000; |
||||
|
_dtoId |= 0x40000000; |
||||
|
} |
||||
|
fprintf(gA2lFile, gA2lIfDataCan, XCP_TRANSPORT_LAYER_VERSION, _croId, _dtoId, bitRate); |
||||
|
|
||||
|
fprintf(gA2lFile, gA2lIfDataEnd); |
||||
|
|
||||
|
DBG_PRINTF1(" IF_DATA XCP_ON_CAN, CRO=%u, DTO=%u, BITRATE=%u\n", croId, dtoId, bitRate); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lCreateMeasurement_IF_DATA() { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
if (gA2lFixedEvent != XCP_INVALID_EVENT) { |
||||
|
fprintf(gA2lFile, " /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 0x%X /end DAQ_EVENT /end IF_DATA", gA2lFixedEvent); |
||||
|
} |
||||
|
else if (gA2lDefaultEvent != XCP_INVALID_EVENT) { |
||||
|
fprintf(gA2lFile, " /begin IF_DATA XCP /begin DAQ_EVENT VARIABLE DEFAULT_EVENT_LIST EVENT 0x%X /end DAQ_EVENT /end IF_DATA", gA2lDefaultEvent); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lSetDefaultEvent(uint16_t event) { |
||||
|
|
||||
|
#if defined( XCP_ENABLE_DAQ_EVENT_LIST ) && !defined( XCP_ENABLE_DAQ_EVENT_INFO ) |
||||
|
uint16_t eventCount = 0; |
||||
|
XcpGetEventList(&eventCount); |
||||
|
assert(event >= 0 && event < eventCount); |
||||
|
#endif |
||||
|
|
||||
|
A2lRstFixedEvent(); |
||||
|
gA2lDefaultEvent = event; |
||||
|
} |
||||
|
|
||||
|
void A2lSetFixedEvent(uint16_t event) { |
||||
|
|
||||
|
#if defined( XCP_ENABLE_DAQ_EVENT_LIST ) && !defined( XCP_ENABLE_DAQ_EVENT_INFO ) |
||||
|
uint16_t eventCount = 0; |
||||
|
XcpGetEventList(&eventCount); |
||||
|
assert(event >= 0 && event < eventCount); |
||||
|
#endif |
||||
|
|
||||
|
gA2lFixedEvent = event; |
||||
|
} |
||||
|
|
||||
|
uint16_t A2lGetFixedEvent() { |
||||
|
return gA2lFixedEvent; |
||||
|
} |
||||
|
|
||||
|
void A2lRstDefaultEvent() { |
||||
|
gA2lDefaultEvent = XCP_INVALID_EVENT; |
||||
|
} |
||||
|
|
||||
|
void A2lRstFixedEvent() { |
||||
|
gA2lFixedEvent = XCP_INVALID_EVENT; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lTypedefBegin_(const char* name, uint32_t size, const char* comment) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile,"/begin TYPEDEF_STRUCTURE %s \"%s\" 0x%X SYMBOL_TYPE_LINK \"%s\"\n", name, comment, size, name); |
||||
|
gA2lTypedefs++; |
||||
|
} |
||||
|
|
||||
|
void A2lTypedefMeasurementComponent_(const char* name, int32_t type, uint32_t offset) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, " /begin STRUCTURE_COMPONENT %s M_%s 0x%X SYMBOL_TYPE_LINK \"%s\" /end STRUCTURE_COMPONENT\n", name, getType(type), offset, name); |
||||
|
gA2lComponents++; |
||||
|
} |
||||
|
|
||||
|
void A2lTypedefParameterComponent_(const char* name, int32_t type, uint32_t offset) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, " /begin STRUCTURE_COMPONENT %s C_%s 0x%X SYMBOL_TYPE_LINK \"%s\" /end STRUCTURE_COMPONENT\n", name, getType(type), offset, name); |
||||
|
gA2lComponents++; |
||||
|
} |
||||
|
|
||||
|
void A2lTypedefEnd_() { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile,"/end TYPEDEF_STRUCTURE\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lCreateTypedefInstance_(const char* instanceName, const char* typeName, uint8_t ext, uint32_t addr, const char* comment) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin INSTANCE %s \"%s\" %s 0x%X", instanceName, comment, typeName, addr); |
||||
|
printAddrExt(ext); |
||||
|
A2lCreateMeasurement_IF_DATA(); |
||||
|
fprintf(gA2lFile, " /end INSTANCE\n"); |
||||
|
gA2lInstances++; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lCreateMeasurement_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, double factor, double offset, const char* unit, const char* comment) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
#ifdef A2L_ENABLE_MEMORY_CHECK |
||||
|
mem_check(name, type, ext, addr); |
||||
|
#endif |
||||
|
if (unit == NULL) unit = ""; |
||||
|
if (comment == NULL) comment = ""; |
||||
|
const char *conv = "NO"; |
||||
|
if (factor != 0.0 || offset != 0.0) { |
||||
|
fprintf(gA2lFile, "/begin COMPU_METHOD %s.Conversion \"\" LINEAR \"%%6.3\" \"%s\" COEFFS_LINEAR %g %g /end COMPU_METHOD\n", name, unit!=NULL?unit:"", factor,offset); |
||||
|
conv = name; |
||||
|
gA2lConversions++; |
||||
|
} |
||||
|
|
||||
|
//fprintf(gA2lFile, "/begin MEASUREMENT %s \"%s\" %s %s.Conversion 0 0 %s %s ECU_ADDRESS 0x%X", A2lGetSymbolName(instanceName, name), comment, getType(type), conv, getTypeMin(type), getTypeMax(type), addr);
|
||||
|
fprintf(gA2lFile, "/begin MEASUREMENT %s \"%s\" %s %s.Conversion 0 0 %s %s ECU_ADDRESS 0x%X", A2lGetSymbolName(instanceName, name), comment, getType(type), conv, getPhysMin(type, factor, offset), getPhysMax(type, factor, offset), addr); |
||||
|
printAddrExt(ext); |
||||
|
printPhysUnit(unit); |
||||
|
fprintf(gA2lFile, " READ_WRITE"); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", A2lGetSymbolName(instanceName, name), 0); |
||||
|
#else |
||||
|
(void)symbolLink; |
||||
|
#endif |
||||
|
A2lCreateMeasurement_IF_DATA(); |
||||
|
fprintf(gA2lFile, " /end MEASUREMENT\n"); |
||||
|
gA2lMeasurements++; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lCreateMeasurementArray_(const char* instanceName, const char* name, int32_t type, int dim, uint8_t ext, uint32_t addr) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin CHARACTERISTIC %s \"\" VAL_BLK 0x%X R_%s 0 NO_COMPU_METHOD %s %s MATRIX_DIM %u", A2lGetSymbolName(instanceName, name), addr, getType(type), getTypeMin(type), getTypeMax(type), dim); |
||||
|
printAddrExt(ext); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", A2lGetSymbolName(instanceName, name), 0); |
||||
|
#endif |
||||
|
A2lCreateMeasurement_IF_DATA(); |
||||
|
fprintf(gA2lFile, " /end CHARACTERISTIC\n"); |
||||
|
gA2lMeasurements++; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lCreateParameterWithLimits_(const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit, double min, double max) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin CHARACTERISTIC %s \"%s\" VALUE 0x%X R_%s 0 NO_COMPU_METHOD %g %g", name, comment, addr, getType(type), min, max); |
||||
|
printPhysUnit(unit); |
||||
|
printAddrExt(ext); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", name, 0); |
||||
|
#endif |
||||
|
fprintf(gA2lFile, " /end CHARACTERISTIC\n"); |
||||
|
gA2lParameters++; |
||||
|
} |
||||
|
|
||||
|
void A2lCreateParameter_(const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin CHARACTERISTIC %s \"%s\" VALUE 0x%X R_%s 0 NO_COMPU_METHOD %s %s", name, comment, addr, getType(type), getTypeMin(type), getTypeMax(type)); |
||||
|
printPhysUnit(unit); |
||||
|
printAddrExt(ext); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", name, 0); |
||||
|
#endif |
||||
|
fprintf(gA2lFile, " /end CHARACTERISTIC\n"); |
||||
|
gA2lParameters++; |
||||
|
} |
||||
|
|
||||
|
void A2lCreateMap_(const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, uint32_t ydim, const char* comment, const char* unit) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, |
||||
|
"/begin CHARACTERISTIC %s \"%s\" MAP 0x%X R_%s 0 NO_COMPU_METHOD %s %s" |
||||
|
" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD %u 0 %u FIX_AXIS_PAR_DIST 0 1 %u /end AXIS_DESCR" |
||||
|
" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD %u 0 %u FIX_AXIS_PAR_DIST 0 1 %u /end AXIS_DESCR", |
||||
|
name, comment, addr, getType(type), getTypeMin(type), getTypeMax(type), xdim, xdim-1, xdim, ydim, ydim-1, ydim); |
||||
|
printPhysUnit(unit); |
||||
|
printAddrExt(ext); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", name, 0); |
||||
|
#endif |
||||
|
fprintf(gA2lFile, " /end CHARACTERISTIC\n"); |
||||
|
gA2lParameters++; |
||||
|
} |
||||
|
|
||||
|
void A2lCreateCurve_(const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, const char* comment, const char* unit) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, |
||||
|
"/begin CHARACTERISTIC %s \"%s\" CURVE 0x%X R_%s 0 NO_COMPU_METHOD %s %s" |
||||
|
" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD %u 0 %u FIX_AXIS_PAR_DIST 0 1 %u /end AXIS_DESCR", |
||||
|
name, comment, addr, getType(type), getTypeMin(type), getTypeMax(type), xdim, xdim-1, xdim); |
||||
|
printPhysUnit(unit); |
||||
|
printAddrExt(ext); |
||||
|
#if OPTION_ENABLE_A2L_SYMBOL_LINKS |
||||
|
fprintf(gA2lFile, " SYMBOL_LINK \"%s\" %u", name, 0); |
||||
|
#endif |
||||
|
fprintf(gA2lFile, " /end CHARACTERISTIC\n"); |
||||
|
gA2lParameters++; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lParameterGroup(const char* name, int count, ...) { |
||||
|
|
||||
|
va_list ap; |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin GROUP %s \"\"", name); |
||||
|
fprintf(gA2lFile, " /begin REF_CHARACTERISTIC\n"); |
||||
|
va_start(ap, count); |
||||
|
for (int i = 0; i < count; i++) { |
||||
|
fprintf(gA2lFile, " %s", va_arg(ap, char*)); |
||||
|
} |
||||
|
va_end(ap); |
||||
|
fprintf(gA2lFile, "\n/end REF_CHARACTERISTIC "); |
||||
|
fprintf(gA2lFile, "/end GROUP\n\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lParameterGroupFromList(const char* name, const char* pNames[], size_t count) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin GROUP %s \"\"", name); |
||||
|
fprintf(gA2lFile, " /begin REF_CHARACTERISTIC\n"); |
||||
|
for (size_t i = 0; i < count; i++) { |
||||
|
fprintf(gA2lFile, " %s", pNames[i]); |
||||
|
} |
||||
|
fprintf(gA2lFile, "\n/end REF_CHARACTERISTIC "); |
||||
|
fprintf(gA2lFile, "/end GROUP\n\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lMeasurementGroup(const char* name, int count, ...) { |
||||
|
|
||||
|
va_list ap; |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin GROUP %s \"\"", name); |
||||
|
fprintf(gA2lFile, " /begin REF_MEASUREMENT"); |
||||
|
va_start(ap, count); |
||||
|
for (int i = 0; i < count; i++) { |
||||
|
fprintf(gA2lFile, " %s", va_arg(ap, char*)); |
||||
|
} |
||||
|
va_end(ap); |
||||
|
fprintf(gA2lFile, " /end REF_MEASUREMENT"); |
||||
|
fprintf(gA2lFile, " /end GROUP\n\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lMeasurementGroupFromList(const char *name, char* names[], uint32_t count) { |
||||
|
|
||||
|
assert(gA2lFile != NULL); |
||||
|
fprintf(gA2lFile, "/begin GROUP %s \"\" \n", name); |
||||
|
fprintf(gA2lFile, " /begin REF_MEASUREMENT"); |
||||
|
for (uint32_t i1 = 0; i1 < count; i1++) { |
||||
|
fprintf(gA2lFile, " %s", names[i1]); |
||||
|
} |
||||
|
fprintf(gA2lFile, " /end REF_MEASUREMENT"); |
||||
|
fprintf(gA2lFile, "\n/end GROUP\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2lClose() { |
||||
|
|
||||
|
if (gA2lFile != NULL) { |
||||
|
fprintf(gA2lFile, "%s", gA2lFooter); |
||||
|
fclose(gA2lFile); |
||||
|
gA2lFile = NULL; |
||||
|
DBG_PRINTF1("A2L created: %u measurements, %u params, %u typedefs, %u components, %u instances, %u conversions\n\n", |
||||
|
gA2lMeasurements, gA2lParameters, gA2lTypedefs, gA2lComponents, gA2lInstances, gA2lConversions); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,121 @@ |
|||||
|
#pragma once |
||||
|
/* A2L.h */ |
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
#define OPTION_ENABLE_A2L_SYMBOL_LINKS ON // Enable generation of symbol links (required for CANape integrated linker map update)
|
||||
|
|
||||
|
|
||||
|
#define A2L_TYPE_UINT8 1 |
||||
|
#define A2L_TYPE_UINT16 2 |
||||
|
#define A2L_TYPE_UINT32 4 |
||||
|
#define A2L_TYPE_UINT64 8 |
||||
|
#define A2L_TYPE_INT8 -1 |
||||
|
#define A2L_TYPE_INT16 -2 |
||||
|
#define A2L_TYPE_INT32 -4 |
||||
|
#define A2L_TYPE_INT64 -8 |
||||
|
#define A2L_TYPE_FLOAT -9 |
||||
|
#define A2L_TYPE_DOUBLE -10 |
||||
|
|
||||
|
#define A2L_TYPE_BOOL sizeof(BOOL) |
||||
|
|
||||
|
#ifndef A2lGetAddr |
||||
|
#define A2lGetAddr(p) ApplXcpGetAddr(p) |
||||
|
#endif |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
|
||||
|
#include <typeinfo> |
||||
|
|
||||
|
#ifndef A2lGetType |
||||
|
#define A2lGetSign_(var) ((int)(typeid(var).name()[0]=='u'?+1:-1)) |
||||
|
#define A2lGetType(var) (A2lGetSign_(var)*(typeid(var).name()[0]=='f'?9:typeid(var).name()[0]=='d'?10:sizeof(var))) |
||||
|
#endif |
||||
|
#ifndef A2lGetOffset |
||||
|
#define A2lGetOffset(var) (uint32_t)((uint8_t*)&(var) - (uint8_t*)this) |
||||
|
#endif |
||||
|
|
||||
|
// Create parameters
|
||||
|
#define A2lCreateParameter(name,comment,unit) A2lCreateParameter_(#name, A2lGetType(name), 0, A2lGetAddr((uint8_t*)&name), comment, unit) |
||||
|
#define A2lCreateParameterWithLimits(name,comment,unit,min,max) A2lCreateParameterWithLimits_(#name, A2lGetType(name), 0, A2lGetAddr((uint8_t*)&name), comment, unit, min, max) |
||||
|
#define A2lCreateCurve(name,xdim,comment,unit) A2lCreateCurve_(#name, A2lGetType(name[0]), 0, A2lGetAddr((uint8_t*)&name[0]), xdim, comment, unit) |
||||
|
#define A2lCreateMap(name,xdim,ydim,comment,unit) A2lCreateMap_(#name, A2lGetType(name[0][0]), 0, A2lGetAddr((uint8_t*)&name[0][0]), xdim, ydim, comment, unit) |
||||
|
|
||||
|
// Create measurements
|
||||
|
#define A2lCreateMeasurement(name,comment) A2lCreateMeasurement_(NULL, #name, A2lGetType(name), 0, A2lGetAddr((uint8_t*)&(name)), 1.0, 0.0, NULL, comment) |
||||
|
#define A2lCreatePhysMeasurement(name,comment,factor,offset,unit) A2lCreateMeasurement_(NULL, #name, A2lGetType(name), 0, A2lGetAddr((uint8_t*)&name), factor, offset, unit, comment) // unsigned integer (8/16/32) with linear physical conversion rule
|
||||
|
#define A2lCreateMeasurementArray(name) A2lCreateMeasurementArray_(NULL,#name, A2lGetType(name[0]), sizeof(name)/sizeof(name[0]), 0, A2lGetAddr((uint8_t*)&name[0])) // unsigned integer (8/16/32) or double array
|
||||
|
|
||||
|
// Create typedefs
|
||||
|
#define A2lTypedefComponent(name) A2lTypedefMeasurementComponent_(#name, A2lGetType(name), A2lGetOffset(name)) |
||||
|
|
||||
|
#else |
||||
|
|
||||
|
// Create parameters
|
||||
|
#define A2lCreateParameter(name,type,comment,unit) A2lCreateParameter_(#name, type, 0, A2lGetAddr((uint8_t*)&name), comment, unit) |
||||
|
#define A2lCreateParameterWithLimits(name,type,comment,unit,min,max) A2lCreateParameterWithLimits_(#name, type, 0, A2lGetAddr((uint8_t*)&name), comment, unit, min, max) |
||||
|
#define A2lCreateCurve(name,type,xdim,comment,unit) A2lCreateCurve_(#name, type, 0, A2lGetAddr((uint8_t*)&name[0]), xdim, comment, unit) |
||||
|
#define A2lCreateMap(name,type,xdim,ydim,comment,unit) A2lCreateMap_(#name, type, 0, A2lGetAddr((uint8_t*)&name[0][0]), xdim, ydim, comment, unit) |
||||
|
|
||||
|
// Create measurements
|
||||
|
#define A2lCreateMeasurement(name,type,comment) A2lCreateMeasurement_(NULL,#name,type, 0, A2lGetAddr((uint8_t*)&(name)), 1.0, 0.0, NULL, comment) |
||||
|
#define A2lCreatePhysMeasurement(name,type,comment,factor,offset,unit) A2lCreateMeasurement_(NULL, #name,type, 0, A2lGetAddr((uint8_t*)&name), factor, offset, unit, comment) // unsigned integer (8/16/32) with linear physical conversion rule
|
||||
|
#define A2lCreateMeasurementArray(name,type) A2lCreateMeasurementArray_(NULL, #name, type, sizeof(name)/sizeof(name[0]), 0, A2lGetAddr((uint8_t*)&name[0])) // unsigned integer (8/16/32) or double array
|
||||
|
|
||||
|
// Create typedefs
|
||||
|
#define A2lTypedefComponent(name,type,offset) A2lTypedefMeasurementComponent_(#name, type, offset) |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#define A2lTypedefBegin(name,comment) A2lTypedefBegin_(#name,(uint32_t)sizeof(name),comment) |
||||
|
#define A2lTypedefEnd() A2lTypedefEnd_() |
||||
|
#define A2lCreateTypedefInstance(instanceName, typeName, addr, comment) A2lCreateTypedefInstance_(instanceName, typeName, 0, A2lGetAddr((uint8_t*)&instanceName), comment) |
||||
|
#define A2lCreateDynTypedefInstance(instanceName, typeName, comment) A2lCreateTypedefInstance_(instanceName, typeName, 1, 0, comment) |
||||
|
|
||||
|
// Init A2L generation
|
||||
|
extern BOOL A2lOpen(const char *filename, const char* projectName); |
||||
|
|
||||
|
// Create memory segments
|
||||
|
extern void A2lCreate_MOD_PAR( uint32_t startAddr, uint32_t size, char* epk); |
||||
|
|
||||
|
// Create XCP IF_DATA
|
||||
|
extern void A2lCreate_ETH_IF_DATA(BOOL useTCP, const uint8_t* addr, uint16_t port); |
||||
|
extern void A2lCreate_CAN_IF_DATA(BOOL useCANFD, uint16_t croId, uint16_t dtoId, uint32_t bitRate); |
||||
|
|
||||
|
// Set fixec or default event for all following creates
|
||||
|
extern void A2lSetFixedEvent(uint16_t event); |
||||
|
extern void A2lRstFixedEvent(); |
||||
|
extern void A2lSetDefaultEvent(uint16_t event); |
||||
|
extern void A2lRstDefaultEvent(); |
||||
|
|
||||
|
// Create measurements
|
||||
|
extern void A2lCreateMeasurement_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, double factor, double offset, const char* unit, const char* comment); |
||||
|
extern void A2lCreateMeasurementArray_(const char* instanceName, const char* name, int32_t type, int dim, uint8_t ext, uint32_t addr); |
||||
|
|
||||
|
// Create typedefs
|
||||
|
void A2lTypedefBegin_(const char* name, uint32_t size, const char* comment); |
||||
|
void A2lTypedefMeasurementComponent_(const char* name, int32_t type, uint32_t offset); |
||||
|
void A2lTypedefParameterComponent_(const char* name, int32_t type, uint32_t offset); |
||||
|
void A2lTypedefEnd_(); |
||||
|
void A2lCreateTypedefInstance_(const char* instanceName, const char* typeName, uint8_t ext, uint32_t addr, const char* comment); |
||||
|
|
||||
|
// Create parameters
|
||||
|
void A2lCreateParameter_(const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit); |
||||
|
void A2lCreateParameterWithLimits_(const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit, double min, double max); |
||||
|
void A2lCreateMap_(const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, uint32_t ydim, const char* comment, const char* unit); |
||||
|
void A2lCreateCurve_(const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, const char* comment, const char* unit); |
||||
|
|
||||
|
// Create groups
|
||||
|
void A2lParameterGroup(const char* name, int count, ...); |
||||
|
void A2lParameterGroupFromList(const char* name, const char* pNames[], size_t count); |
||||
|
void A2lMeasurementGroup(const char* name, int count, ...); |
||||
|
void A2lMeasurementGroupFromList(const char *name, char* names[], uint32_t count); |
||||
|
|
||||
|
// Finish A2L generation
|
||||
|
extern void A2lClose(); |
||||
|
|
||||
|
|
||||
|
// For A2L.CPP
|
||||
|
extern const char* A2lGetSymbolName(const char* instanceName, const char* name); |
||||
|
extern uint16_t A2lGetFixedEvent(); |
||||
@ -0,0 +1,124 @@ |
|||||
|
/*----------------------------------------------------------------------------
|
||||
|
| File: |
||||
|
| A2L.cpp |
||||
|
| |
||||
|
| Description: |
||||
|
| Create A2L file |
||||
|
| |
||||
|
| Copyright (c) Vector Informatik GmbH. All rights reserved. |
||||
|
| Licensed under the MIT license. See LICENSE file in the project root for details. |
||||
|
| |
||||
|
----------------------------------------------------------------------------*/ |
||||
|
|
||||
|
#include "main.h" |
||||
|
#include "platform.h" |
||||
|
#include "xcp.hpp" |
||||
|
#include "A2L.h" |
||||
|
#include "A2Lpp.hpp" |
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
A2L::A2L(const char * name) { |
||||
|
|
||||
|
filename = name; |
||||
|
} |
||||
|
|
||||
|
A2L::~A2L() { |
||||
|
|
||||
|
close(); |
||||
|
} |
||||
|
|
||||
|
void A2L::close() { |
||||
|
|
||||
|
A2lClose(); |
||||
|
} |
||||
|
|
||||
|
BOOL A2L::open(const char *projectName) { |
||||
|
|
||||
|
return A2lOpen(filename, projectName); |
||||
|
} |
||||
|
|
||||
|
// Create memory segments
|
||||
|
void A2L::create_MOD_PAR(uint32_t startAddr, uint32_t size) { |
||||
|
A2lCreate_MOD_PAR(startAddr, size, NULL); |
||||
|
} |
||||
|
|
||||
|
// Create XCP IF_DATA
|
||||
|
void A2L::create_XCP_IF_DATA(BOOL tcp, const uint8_t* addr, uint16_t port) { |
||||
|
|
||||
|
A2lCreate_ETH_IF_DATA(tcp, addr, port); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
void A2L::setDefaultEvent(uint16_t e) { |
||||
|
A2lSetDefaultEvent(e); |
||||
|
} |
||||
|
|
||||
|
void A2L::setFixedEvent(uint16_t e) { |
||||
|
A2lSetFixedEvent(e); |
||||
|
} |
||||
|
|
||||
|
void A2L::rstFixedEvent() { |
||||
|
A2lRstFixedEvent(); |
||||
|
} |
||||
|
|
||||
|
uint16_t A2L::getFixedEvent() { |
||||
|
return A2lGetFixedEvent(); |
||||
|
} |
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
void A2L::createTypedefBegin_(const char* name, int32_t size, const char* comment) { |
||||
|
A2lTypedefBegin_(name,size,comment); |
||||
|
} |
||||
|
|
||||
|
void A2L::createTypedefMeasurementComponent_(const char* name, int32_t type, uint32_t offset) { |
||||
|
A2lTypedefMeasurementComponent_(name,type,offset); |
||||
|
} |
||||
|
|
||||
|
void A2L::createTypedefParameterComponent_(const char* name, int32_t type, uint32_t offset) { |
||||
|
A2lTypedefParameterComponent_(name, type, offset); |
||||
|
} |
||||
|
|
||||
|
void A2L::createTypedefEnd_() { |
||||
|
A2lTypedefEnd_(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2L::createTypedefInstance_(const char* instanceName, const char* typeName, uint8_t ext, uint32_t addr, const char* comment) { |
||||
|
A2lCreateTypedefInstance_(instanceName, typeName, ext, addr, comment); |
||||
|
} |
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
void A2L::createMeasurement_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, double factor, double offset, const char* unit, const char* comment) { |
||||
|
A2lCreateMeasurement_(instanceName, name, type, ext, addr, factor, offset, unit, comment); |
||||
|
} |
||||
|
|
||||
|
void A2L::createMeasurementArray_(const char* instanceName, const char* name, int32_t type, int dim, uint8_t ext, uint32_t addr) { |
||||
|
A2lCreateMeasurementArray_(instanceName, name, type, dim, ext, addr); |
||||
|
} |
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
void A2L::createParameterWithLimits_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit, double min, double max) { |
||||
|
A2lCreateParameterWithLimits_(A2lGetSymbolName(instanceName, name), type, ext, addr, comment, unit, min, max); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void A2L::createParameter_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit) { |
||||
|
A2lCreateParameter_(A2lGetSymbolName(instanceName, name), type, ext, addr, comment, unit); |
||||
|
} |
||||
|
|
||||
|
void A2L::createMap_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, uint32_t ydim, const char* comment, const char* unit) { |
||||
|
A2lCreateMap_(A2lGetSymbolName(instanceName, name), type, ext, addr, xdim, ydim, comment, unit); |
||||
|
} |
||||
|
|
||||
|
void A2L::createCurve_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, const char* comment, const char* unit) { |
||||
|
A2lCreateCurve_(A2lGetSymbolName(instanceName, name), type, ext, addr, xdim, comment, unit); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,122 @@ |
|||||
|
#pragma once |
||||
|
/* A2L.h - A2L Generator */ |
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
#ifndef __cplusplus |
||||
|
#error |
||||
|
#endif |
||||
|
|
||||
|
#include "A2L.h" |
||||
|
|
||||
|
|
||||
|
#define A2lGetSign_(var) ((int)(typeid(var).name()[0]=='u'?+1:-1)) |
||||
|
#define A2lGetType_(var) (A2lGetSign_(var)*(typeid(var).name()[0]=='f'?9:typeid(var).name()[0]=='d'?10:sizeof(var))) |
||||
|
#define A2lGetAddr_(var) Xcp::getInstance()->getA2lAddr((uint8_t*)&var) |
||||
|
#define A2lGetOffset_(struct_name,full_name) (uint16_t)((uint8_t*)&(full_name) - (uint8_t*)&struct_name) |
||||
|
|
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
// Create typedefs
|
||||
|
#define createTypedefBegin(name,comment) createTypedefBegin_(#name,(int)sizeof(name),comment) |
||||
|
#define createTypedefParameterComponent(struct_name,var_name) createTypedefParameterComponent_(#var_name,A2lGetType_(struct_name.var_name),A2lGetOffset_(struct_name,struct_name.var_name)) |
||||
|
#define createTypedefMeasurementComponent(struct_name,var_name) createTypedefMeasurementComponent_(#var_name,A2lGetType_(struct_name.var_name),A2lGetOffset_(struct_name,struct_name.var_name)) |
||||
|
#define createTypedefEnd() createTypedefEnd_() |
||||
|
|
||||
|
// Create measurement or parameter from typedef
|
||||
|
#define createTypedefInstance(instanceName,typeName,comment) createTypedefInstance_(#instanceName, #typeName, 0, A2lGetAddr_(instanceName), comment) |
||||
|
|
||||
|
// Create measurements
|
||||
|
#define createMeasurement(name,comment) createMeasurement_(NULL,#name,A2lGetType_(name),0,A2lGetAddr_(name),1.0,0.0,NULL,comment) |
||||
|
#define createPhysMeasurement(name,comment,factor,offset,unit) createMeasurement_(NULL,#name,A2lGetType_(name),0,A2lGetAddr_(name),factor,offset,unit,comment) // unsigned integer (8/16/32) with linear physical conversion rule
|
||||
|
#define createMeasurementArray(name) createMeasurementArray_(NULL,#name,A2lGetType_(name[0]),sizeof(name)/sizeof(name[0]),0,A2lGetAddr_(name[0])) // unsigned integer (8/16/32) or double array
|
||||
|
|
||||
|
// Create parameters
|
||||
|
#define createParameter(name,comment,unit) createParameter_(NULL,#name,A2lGetType_(name),0,A2lGetAddr_(name),comment,unit) |
||||
|
#define createParameterWithLimits(name,comment,unit,min,max) createParameterWithLimits_(NULL,#name, A2lGetType_(name), 0, A2lGetAddr_(name), comment, unit, min, max) |
||||
|
#define createCurve(name,xdim,comment,unit) createCurve_(NULL,#name, A2lGetType_(name[0]), 0, A2lGetAddr_(name[0]), xdim, comment, unit) |
||||
|
#define createMap(name,xdim,ydim,comment,unit) createMap_(NULL,#name, A2lGetType_(name[0][0]), 0, A2lGetAddr_(name[0][0]), xdim, ydim, comment, unit) |
||||
|
|
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
// The functions below are assumed to be called from methods of classes derived from XcpObject !
|
||||
|
|
||||
|
#define A2lGetDynAddr_(var) xcpGetA2lDynAddr(A2lGetDynOffset_(var)) |
||||
|
#define A2lGetDynBaseAddr_() xcpGetA2lDynAddr(0) |
||||
|
#define A2lGetDynOffset_(var) (uint16_t)((uint8_t*)&(var) - (uint8_t*)this) // object data size limited to 64K !
|
||||
|
|
||||
|
// Create measurement or parameter from typedef
|
||||
|
#define createDynTypedefInstance(instanceName,typeName,comment) createTypedefInstance_(instanceName, typeName, 1, A2lGetDynBaseAddr_(), comment) |
||||
|
#define createDynTypedefParameterComponent(name) createTypedefParameterComponent_(#name,A2lGetType_(name),A2lGetDynOffset_(name)) |
||||
|
#define createDynTypedefMeasurementComponent(name) createTypedefMeasurementComponent_(#name,A2lGetType_(name),A2lGetDynOffset_(name)) |
||||
|
|
||||
|
// Create measurements
|
||||
|
#define createDynMeasurement(instanceName,name,comment) createMeasurement_(instanceName,#name,A2lGetType_(name),1,A2lGetDynAddr_(name),1.0,0.0,NULL,comment) |
||||
|
#define createDynPhysMeasurement(instanceName,name,var,comment,factor,offset,unit) createMeasurement_(instanceName,name,A2lGetType_(var),1,A2lGetDynAddr_(name),factor,offset,unit,comment) // named unsigned integer (8/16/32) with linear physical conversion rule
|
||||
|
#define createDynMeasurementArray(name) createMeasurementArray_(NULL,#name,A2lGetType_(name[0]),sizeof(name)/sizeof(name[0]),0,A2lGetDynAddr_(name[0])) // unsigned integer (8/16/32) or double array
|
||||
|
|
||||
|
// Create parameters
|
||||
|
#define createDynParameter(instanceName,name,comment,unit) createParameter_(instanceName,#name,A2lGetType_(name),1,A2lGetDynAddr_(name),comment,unit) |
||||
|
#define createDynParameterWithLimits(instanceName,name,comment,unit,min,max) createParameterWithLimits_(instanceName,#name, A2lGetType_(name), 1, A2lGetDynAddr_(name), comment, unit, min, max) |
||||
|
#define createDynCurve(instanceName,name,xdim,comment,unit) createCurve_(instanceName,#name, A2lGetType_(name[0]), 0, A2lGetDynAddr_(name[0]), xdim, comment, unit) |
||||
|
#define createDynMap(instanceName,name,xdim,ydim,comment,unit) createMap_(instanceName,#name, A2lGetType_(name[0][0]), 1, A2lGetDynAddr_(name[0][0]), xdim, ydim, comment, unit) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
|
||||
|
class A2L { |
||||
|
|
||||
|
private: |
||||
|
|
||||
|
const char* filename; |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
|
||||
|
A2L(const char* filename); |
||||
|
~A2L(); |
||||
|
|
||||
|
// Start A2L generation
|
||||
|
BOOL open(const char* projectName); |
||||
|
|
||||
|
// Create memory segments
|
||||
|
void create_MOD_PAR(uint32_t startAddr, uint32_t size); |
||||
|
|
||||
|
// Create IF_DATA for XCP
|
||||
|
// All XCP events must have been be created before
|
||||
|
void create_XCP_IF_DATA(BOOL tcp, const uint8_t* addr, uint16_t port); |
||||
|
|
||||
|
// Set XCP events for all following creates
|
||||
|
void setFixedEvent(uint16_t xcp_event); |
||||
|
void setDefaultEvent(uint16_t xcp_event); |
||||
|
void rstFixedEvent(); |
||||
|
uint16_t getFixedEvent(); |
||||
|
|
||||
|
// Create measurements
|
||||
|
void createMeasurement_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, double factor, double offset, const char* unit, const char* comment); |
||||
|
void createMeasurementArray_(const char* instanceName, const char* name, int32_t type, int32_t dim, uint8_t ext, uint32_t addr); |
||||
|
|
||||
|
// Create typedefs
|
||||
|
void createTypedefBegin_(const char* name, int32_t size, const char* comment); |
||||
|
void createTypedefParameterComponent_(const char* name, int32_t type, uint32_t offset); |
||||
|
void createTypedefMeasurementComponent_(const char* name, int32_t type, uint32_t offset); |
||||
|
void createTypedefEnd_(); |
||||
|
void createTypedefInstance_(const char* instanceName, const char* typeName, uint8_t ext, uint32_t addr, const char* comment); |
||||
|
|
||||
|
// Create parameters
|
||||
|
void createParameter_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit); |
||||
|
void createParameterWithLimits_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, const char* comment, const char* unit, double min, double max); |
||||
|
void createMap_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, uint32_t ydim, const char* comment, const char* unit); |
||||
|
void createCurve_(const char* instanceName, const char* name, int32_t type, uint8_t ext, uint32_t addr, uint32_t xdim, const char* comment, const char* unit); |
||||
|
|
||||
|
// Finalize and close A2L file
|
||||
|
void close(); |
||||
|
}; |
||||
|
|
||||
|
|
||||
@ -0,0 +1,153 @@ |
|||||
|
|
||||
|
// A2lTestDlg.cpp : Defines the class behaviors for the application.
|
||||
|
//
|
||||
|
|
||||
|
#include "pch.h" |
||||
|
#include "framework.h" |
||||
|
#include "A2lTestDlg.h" |
||||
|
#include "A2lTestDlgDlg.h" |
||||
|
|
||||
|
#ifdef _DEBUG |
||||
|
#define new DEBUG_NEW |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgApp
|
||||
|
|
||||
|
BEGIN_MESSAGE_MAP(CA2lTestDlgApp, CWinApp) |
||||
|
ON_COMMAND(ID_HELP, &CWinApp::OnHelp) |
||||
|
END_MESSAGE_MAP() |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgApp construction
|
||||
|
|
||||
|
CA2lTestDlgApp::CA2lTestDlgApp() |
||||
|
{ |
||||
|
// support Restart Manager
|
||||
|
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; |
||||
|
|
||||
|
// TODO: add construction code here,
|
||||
|
// Place all significant initialization in InitInstance
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
// The one and only CA2lTestDlgApp object
|
||||
|
|
||||
|
CA2lTestDlgApp theApp; |
||||
|
|
||||
|
const GUID CDECL BASED_CODE _tlid = |
||||
|
{0xaacf2bb9,0x0c94,0x4623,{0x8c,0x20,0xbb,0xe3,0x07,0x07,0x21,0xea}}; |
||||
|
const WORD _wVerMajor = 1; |
||||
|
const WORD _wVerMinor = 0; |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgApp initialization
|
||||
|
|
||||
|
BOOL CA2lTestDlgApp::InitInstance() |
||||
|
{ |
||||
|
// InitCommonControlsEx() is required on Windows XP if an application
|
||||
|
// manifest specifies use of ComCtl32.dll version 6 or later to enable
|
||||
|
// visual styles. Otherwise, any window creation will fail.
|
||||
|
INITCOMMONCONTROLSEX InitCtrls; |
||||
|
InitCtrls.dwSize = sizeof(InitCtrls); |
||||
|
// Set this to include all the common control classes you want to use
|
||||
|
// in your application.
|
||||
|
InitCtrls.dwICC = ICC_WIN95_CLASSES; |
||||
|
InitCommonControlsEx(&InitCtrls); |
||||
|
|
||||
|
CWinApp::InitInstance(); |
||||
|
|
||||
|
|
||||
|
// Initialize OLE libraries
|
||||
|
if (!AfxOleInit()) |
||||
|
{ |
||||
|
AfxMessageBox(IDP_OLE_INIT_FAILED); |
||||
|
return FALSE; |
||||
|
} |
||||
|
|
||||
|
AfxEnableControlContainer(); |
||||
|
|
||||
|
// Create the shell manager, in case the dialog contains
|
||||
|
// any shell tree view or shell list view controls.
|
||||
|
CShellManager *pShellManager = new CShellManager; |
||||
|
|
||||
|
// Activate "Windows Native" visual manager for enabling themes in MFC controls
|
||||
|
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); |
||||
|
|
||||
|
// Standard initialization
|
||||
|
// If you are not using these features and wish to reduce the size
|
||||
|
// of your final executable, you should remove from the following
|
||||
|
// the specific initialization routines you do not need
|
||||
|
// Change the registry key under which our settings are stored
|
||||
|
// TODO: You should modify this string to be something appropriate
|
||||
|
// such as the name of your company or organization
|
||||
|
SetRegistryKey(_T("Local AppWizard-Generated Applications")); |
||||
|
// Parse command line for automation or reg/unreg switches.
|
||||
|
CCommandLineInfo cmdInfo; |
||||
|
ParseCommandLine(cmdInfo); |
||||
|
|
||||
|
// App was launched with /Embedding or /Automation switch.
|
||||
|
// Run app as automation server.
|
||||
|
if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) |
||||
|
{ |
||||
|
// Register class factories via CoRegisterClassObject().
|
||||
|
COleTemplateServer::RegisterAll(); |
||||
|
} |
||||
|
// App was launched with /Unregserver or /Unregister switch. Remove
|
||||
|
// entries from the registry.
|
||||
|
else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister) |
||||
|
{ |
||||
|
COleObjectFactory::UpdateRegistryAll(FALSE); |
||||
|
AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor); |
||||
|
return FALSE; |
||||
|
} |
||||
|
// App was launched standalone or with other switches (e.g. /Register
|
||||
|
// or /Regserver). Update registry entries, including typelibrary.
|
||||
|
else |
||||
|
{ |
||||
|
COleObjectFactory::UpdateRegistryAll(); |
||||
|
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid); |
||||
|
if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppRegister) |
||||
|
return FALSE; |
||||
|
} |
||||
|
|
||||
|
CA2lTestDlgDlg dlg; |
||||
|
m_pMainWnd = &dlg; |
||||
|
INT_PTR nResponse = dlg.DoModal(); |
||||
|
if (nResponse == IDOK) |
||||
|
{ |
||||
|
// TODO: Place code here to handle when the dialog is
|
||||
|
// dismissed with OK
|
||||
|
} |
||||
|
else if (nResponse == IDCANCEL) |
||||
|
{ |
||||
|
// TODO: Place code here to handle when the dialog is
|
||||
|
// dismissed with Cancel
|
||||
|
} |
||||
|
else if (nResponse == -1) |
||||
|
{ |
||||
|
TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n"); |
||||
|
TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog, you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n"); |
||||
|
} |
||||
|
|
||||
|
// Delete the shell manager created above.
|
||||
|
if (pShellManager != nullptr) |
||||
|
{ |
||||
|
delete pShellManager; |
||||
|
} |
||||
|
|
||||
|
#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) |
||||
|
ControlBarCleanUp(); |
||||
|
#endif |
||||
|
|
||||
|
// Since the dialog has been closed, return FALSE so that we exit the
|
||||
|
// application, rather than start the application's message pump.
|
||||
|
return FALSE; |
||||
|
} |
||||
|
|
||||
|
int CA2lTestDlgApp::ExitInstance() |
||||
|
{ |
||||
|
AfxOleTerm(FALSE); |
||||
|
|
||||
|
return CWinApp::ExitInstance(); |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
|
||||
|
// A2lTestDlg.h : main header file for the PROJECT_NAME application
|
||||
|
//
|
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#ifndef __AFXWIN_H__ |
||||
|
#error "include 'pch.h' before including this file for PCH" |
||||
|
#endif |
||||
|
|
||||
|
#include "resource.h" // main symbols |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgApp:
|
||||
|
// See A2lTestDlg.cpp for the implementation of this class
|
||||
|
//
|
||||
|
|
||||
|
class CA2lTestDlgApp : public CWinApp |
||||
|
{ |
||||
|
public: |
||||
|
CA2lTestDlgApp(); |
||||
|
|
||||
|
// Overrides
|
||||
|
public: |
||||
|
virtual BOOL InitInstance(); |
||||
|
virtual int ExitInstance(); |
||||
|
|
||||
|
// Implementation
|
||||
|
|
||||
|
DECLARE_MESSAGE_MAP() |
||||
|
}; |
||||
|
|
||||
|
extern CA2lTestDlgApp theApp; |
||||
@ -0,0 +1,29 @@ |
|||||
|
// A2lTestDlg.idl : type library source for A2lTestDlg.exe |
||||
|
|
||||
|
// This file will be processed by the MIDL compiler to produce the |
||||
|
// type library (A2lTestDlg.tlb). |
||||
|
|
||||
|
[ uuid(aacf2bb9-0c94-4623-8c20-bbe3070721ea), version(1.0) ] |
||||
|
library A2lTestDlg |
||||
|
{ |
||||
|
importlib("stdole32.tlb"); |
||||
|
importlib("stdole2.tlb"); |
||||
|
|
||||
|
// Primary dispatch interface for CA2lTestDlgDoc |
||||
|
|
||||
|
[ uuid(9fc78fa1-82e8-4469-9a9f-60c6d387b64a) ] |
||||
|
dispinterface IA2lTestDlg |
||||
|
{ |
||||
|
properties: |
||||
|
|
||||
|
methods: |
||||
|
}; |
||||
|
|
||||
|
// Class information for CA2lTestDlgDoc |
||||
|
|
||||
|
[ uuid(04615303-44d9-45b7-b802-02b06c0dde4f) ] |
||||
|
coclass A2lTestDlg |
||||
|
{ |
||||
|
[default] dispinterface IA2lTestDlg; |
||||
|
}; |
||||
|
}; |
||||
Binary file not shown.
@ -0,0 +1,17 @@ |
|||||
|
REGEDIT |
||||
|
; This .REG file may be used by your SETUP program. |
||||
|
; If a SETUP program is not available, the entries below will be |
||||
|
; registered in your InitInstance automatically with a call to |
||||
|
; CWinApp::RegisterShellFileTypes and COleObjectFactory::UpdateRegistryAll. |
||||
|
|
||||
|
|
||||
|
HKEY_CLASSES_ROOT\A2lTestDlg.Application = A2lTestDlg Application |
||||
|
|
||||
|
|
||||
|
HKEY_CLASSES_ROOT\A2lTestDlg.Application\CLSID = {04615303-44d9-45b7-b802-02b06c0dde4f} |
||||
|
|
||||
|
HKEY_CLASSES_ROOT\CLSID\{04615303-44d9-45b7-b802-02b06c0dde4f} = A2lTestDlg Application |
||||
|
HKEY_CLASSES_ROOT\CLSID\{04615303-44d9-45b7-b802-02b06c0dde4f}\ProgId = A2lTestDlg.Application |
||||
|
|
||||
|
|
||||
|
HKEY_CLASSES_ROOT\CLSID\{04615303-44d9-45b7-b802-02b06c0dde4f}\LocalServer32 = A2lTestDlg.EXE |
||||
@ -0,0 +1,252 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project DefaultTargets="Build" 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> |
||||
|
<ProjectConfiguration Include="Debug|x64"> |
||||
|
<Configuration>Debug</Configuration> |
||||
|
<Platform>x64</Platform> |
||||
|
</ProjectConfiguration> |
||||
|
<ProjectConfiguration Include="Release|x64"> |
||||
|
<Configuration>Release</Configuration> |
||||
|
<Platform>x64</Platform> |
||||
|
</ProjectConfiguration> |
||||
|
</ItemGroup> |
||||
|
<PropertyGroup Label="Globals"> |
||||
|
<VCProjectVersion>16.0</VCProjectVersion> |
||||
|
<ProjectGuid>{86752C60-05E4-465C-9D79-876C97ABD2BA}</ProjectGuid> |
||||
|
<Keyword>MFCProj</Keyword> |
||||
|
<RootNamespace>A2lTestDlg</RootNamespace> |
||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> |
||||
|
</PropertyGroup> |
||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
||||
|
<ConfigurationType>Application</ConfigurationType> |
||||
|
<UseDebugLibraries>true</UseDebugLibraries> |
||||
|
<PlatformToolset>v142</PlatformToolset> |
||||
|
<CharacterSet>Unicode</CharacterSet> |
||||
|
<UseOfMfc>Dynamic</UseOfMfc> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
||||
|
<ConfigurationType>Application</ConfigurationType> |
||||
|
<UseDebugLibraries>false</UseDebugLibraries> |
||||
|
<PlatformToolset>v142</PlatformToolset> |
||||
|
<WholeProgramOptimization>true</WholeProgramOptimization> |
||||
|
<CharacterSet>Unicode</CharacterSet> |
||||
|
<UseOfMfc>Dynamic</UseOfMfc> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> |
||||
|
<ConfigurationType>Application</ConfigurationType> |
||||
|
<UseDebugLibraries>true</UseDebugLibraries> |
||||
|
<PlatformToolset>v142</PlatformToolset> |
||||
|
<CharacterSet>Unicode</CharacterSet> |
||||
|
<UseOfMfc>Dynamic</UseOfMfc> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> |
||||
|
<ConfigurationType>Application</ConfigurationType> |
||||
|
<UseDebugLibraries>false</UseDebugLibraries> |
||||
|
<PlatformToolset>v142</PlatformToolset> |
||||
|
<WholeProgramOptimization>true</WholeProgramOptimization> |
||||
|
<CharacterSet>Unicode</CharacterSet> |
||||
|
<UseOfMfc>Dynamic</UseOfMfc> |
||||
|
</PropertyGroup> |
||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
||||
|
<ImportGroup Label="ExtensionSettings"> |
||||
|
</ImportGroup> |
||||
|
<ImportGroup Label="Shared"> |
||||
|
</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> |
||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
||||
|
<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|x64'"> |
||||
|
<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> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
||||
|
<LinkIncremental>true</LinkIncremental> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
||||
|
<LinkIncremental>false</LinkIncremental> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
||||
|
<LinkIncremental>false</LinkIncremental> |
||||
|
</PropertyGroup> |
||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
||||
|
<ClCompile> |
||||
|
<PrecompiledHeader>Use</PrecompiledHeader> |
||||
|
<WarningLevel>Level3</WarningLevel> |
||||
|
<SDLCheck>true</SDLCheck> |
||||
|
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
||||
|
<CompileAs>CompileAsCpp</CompileAs> |
||||
|
</ClCompile> |
||||
|
<Link> |
||||
|
<SubSystem>Windows</SubSystem> |
||||
|
<RegisterOutput>true</RegisterOutput> |
||||
|
</Link> |
||||
|
<Midl> |
||||
|
<MkTypLibCompatible>false</MkTypLibCompatible> |
||||
|
<ValidateAllParameters>true</ValidateAllParameters> |
||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<TypeLibraryName>$(IntDir)A2lTestDlg.tlb</TypeLibraryName> |
||||
|
<HeaderFileName>A2lTestDlg_h.h</HeaderFileName> |
||||
|
</Midl> |
||||
|
<ResourceCompile> |
||||
|
<Culture>0x0409</Culture> |
||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
||||
|
</ResourceCompile> |
||||
|
</ItemDefinitionGroup> |
||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
||||
|
<ClCompile> |
||||
|
<PrecompiledHeader>Use</PrecompiledHeader> |
||||
|
<WarningLevel>Level3</WarningLevel> |
||||
|
<SDLCheck>true</SDLCheck> |
||||
|
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
||||
|
</ClCompile> |
||||
|
<Link> |
||||
|
<SubSystem>Windows</SubSystem> |
||||
|
<RegisterOutput>true</RegisterOutput> |
||||
|
</Link> |
||||
|
<Midl> |
||||
|
<MkTypLibCompatible>false</MkTypLibCompatible> |
||||
|
<ValidateAllParameters>true</ValidateAllParameters> |
||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<TypeLibraryName>$(IntDir)A2lTestDlg.tlb</TypeLibraryName> |
||||
|
<HeaderFileName>A2lTestDlg_h.h</HeaderFileName> |
||||
|
</Midl> |
||||
|
<ResourceCompile> |
||||
|
<Culture>0x0409</Culture> |
||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
||||
|
</ResourceCompile> |
||||
|
</ItemDefinitionGroup> |
||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
||||
|
<ClCompile> |
||||
|
<PrecompiledHeader>Use</PrecompiledHeader> |
||||
|
<WarningLevel>Level3</WarningLevel> |
||||
|
<FunctionLevelLinking>true</FunctionLevelLinking> |
||||
|
<IntrinsicFunctions>true</IntrinsicFunctions> |
||||
|
<SDLCheck>true</SDLCheck> |
||||
|
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
||||
|
<LanguageStandard>stdcpp20</LanguageStandard> |
||||
|
<LanguageStandard_C>stdc17</LanguageStandard_C> |
||||
|
<CompileAs>CompileAsCpp</CompileAs> |
||||
|
</ClCompile> |
||||
|
<Link> |
||||
|
<SubSystem>Windows</SubSystem> |
||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
||||
|
<OptimizeReferences>true</OptimizeReferences> |
||||
|
<RegisterOutput>true</RegisterOutput> |
||||
|
</Link> |
||||
|
<Midl> |
||||
|
<MkTypLibCompatible>false</MkTypLibCompatible> |
||||
|
<ValidateAllParameters>true</ValidateAllParameters> |
||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<TypeLibraryName>$(IntDir)A2lTestDlg.tlb</TypeLibraryName> |
||||
|
<HeaderFileName>A2lTestDlg_h.h</HeaderFileName> |
||||
|
</Midl> |
||||
|
<ResourceCompile> |
||||
|
<Culture>0x0409</Culture> |
||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
||||
|
</ResourceCompile> |
||||
|
</ItemDefinitionGroup> |
||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
||||
|
<ClCompile> |
||||
|
<PrecompiledHeader>Use</PrecompiledHeader> |
||||
|
<WarningLevel>Level3</WarningLevel> |
||||
|
<FunctionLevelLinking>true</FunctionLevelLinking> |
||||
|
<IntrinsicFunctions>true</IntrinsicFunctions> |
||||
|
<SDLCheck>true</SDLCheck> |
||||
|
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
||||
|
</ClCompile> |
||||
|
<Link> |
||||
|
<SubSystem>Windows</SubSystem> |
||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
||||
|
<OptimizeReferences>true</OptimizeReferences> |
||||
|
<RegisterOutput>true</RegisterOutput> |
||||
|
</Link> |
||||
|
<Midl> |
||||
|
<MkTypLibCompatible>false</MkTypLibCompatible> |
||||
|
<ValidateAllParameters>true</ValidateAllParameters> |
||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<TypeLibraryName>$(IntDir)A2lTestDlg.tlb</TypeLibraryName> |
||||
|
<HeaderFileName>A2lTestDlg_h.h</HeaderFileName> |
||||
|
</Midl> |
||||
|
<ResourceCompile> |
||||
|
<Culture>0x0409</Culture> |
||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
||||
|
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
||||
|
</ResourceCompile> |
||||
|
</ItemDefinitionGroup> |
||||
|
<ItemGroup> |
||||
|
<ClInclude Include="A2L.h" /> |
||||
|
<ClInclude Include="A2Lpp.hpp" /> |
||||
|
<ClInclude Include="A2lTestDlg.h" /> |
||||
|
<ClInclude Include="A2lTestDlgDlg.h" /> |
||||
|
<ClInclude Include="dbg_print.h" /> |
||||
|
<ClInclude Include="DlgProxy.h" /> |
||||
|
<ClInclude Include="framework.h" /> |
||||
|
<ClInclude Include="main.h" /> |
||||
|
<ClInclude Include="main_cfg.h" /> |
||||
|
<ClInclude Include="pch.h" /> |
||||
|
<ClInclude Include="platform.h" /> |
||||
|
<ClInclude Include="Resource.h" /> |
||||
|
<ClInclude Include="targetver.h" /> |
||||
|
<ClInclude Include="xcp.h" /> |
||||
|
<ClInclude Include="xcpEthTl.h" /> |
||||
|
<ClInclude Include="xcpLite.h" /> |
||||
|
<ClInclude Include="xcpTl.h" /> |
||||
|
<ClInclude Include="xcptl_cfg.h" /> |
||||
|
<ClInclude Include="xcp_cfg.h" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ClCompile Include="A2L.c" /> |
||||
|
<ClCompile Include="A2Lpp.cpp" /> |
||||
|
<ClCompile Include="A2lTestDlg.cpp" /> |
||||
|
<ClCompile Include="A2lTestDlgDlg.cpp" /> |
||||
|
<ClCompile Include="DlgProxy.cpp" /> |
||||
|
<ClCompile Include="pch.cpp"> |
||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> |
||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> |
||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> |
||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> |
||||
|
</ClCompile> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Midl Include="A2lTestDlg.idl" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<None Include="A2lTestDlg.reg" /> |
||||
|
<None Include="main_cfg.h.in" /> |
||||
|
<None Include="res\A2lTestDlg.rc2" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ResourceCompile Include="A2lTestDlg.rc" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Image Include="res\A2lTestDlg.ico" /> |
||||
|
</ItemGroup> |
||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
||||
|
<ImportGroup Label="ExtensionTargets"> |
||||
|
</ImportGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,118 @@ |
|||||
|
<?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;c++;cppm;ixx;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;h++;hm;inl;inc;ipp;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> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ClInclude Include="A2lTestDlg.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="A2lTestDlgDlg.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="DlgProxy.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="framework.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="targetver.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="Resource.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="pch.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="A2Lpp.hpp"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="A2L.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="main.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="platform.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="dbg_print.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcpLite.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="main_cfg.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcp_cfg.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcptl_cfg.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcp.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcpEthTl.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
<ClInclude Include="xcpTl.h"> |
||||
|
<Filter>Header Files</Filter> |
||||
|
</ClInclude> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ClCompile Include="A2lTestDlg.cpp"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
<ClCompile Include="A2lTestDlgDlg.cpp"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
<ClCompile Include="DlgProxy.cpp"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
<ClCompile Include="pch.cpp"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
<ClCompile Include="A2Lpp.cpp"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
<ClCompile Include="A2L.c"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</ClCompile> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Midl Include="A2lTestDlg.idl"> |
||||
|
<Filter>Source Files</Filter> |
||||
|
</Midl> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<None Include="A2lTestDlg.reg" /> |
||||
|
<None Include="res\A2lTestDlg.rc2"> |
||||
|
<Filter>Resource Files</Filter> |
||||
|
</None> |
||||
|
<None Include="main_cfg.h.in" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ResourceCompile Include="A2lTestDlg.rc"> |
||||
|
<Filter>Resource Files</Filter> |
||||
|
</ResourceCompile> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Image Include="res\A2lTestDlg.ico"> |
||||
|
<Filter>Resource Files</Filter> |
||||
|
</Image> |
||||
|
</ItemGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,6 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
|
<PropertyGroup> |
||||
|
<RESOURCE_FILE>A2lTestDlg.rc</RESOURCE_FILE> |
||||
|
</PropertyGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,252 @@ |
|||||
|
|
||||
|
// A2lTestDlgDlg.cpp : implementation file
|
||||
|
//
|
||||
|
|
||||
|
#include "pch.h" |
||||
|
#include "framework.h" |
||||
|
#include "A2lTestDlg.h" |
||||
|
#include "A2lTestDlgDlg.h" |
||||
|
#include "DlgProxy.h" |
||||
|
#include "afxdialogex.h" |
||||
|
|
||||
|
#include <iostream> |
||||
|
|
||||
|
#ifdef _DEBUG |
||||
|
#define new DEBUG_NEW |
||||
|
#endif |
||||
|
|
||||
|
//template<typename ... Args>
|
||||
|
//std::wstring wstring_format(const std::wstring& format, Args ... args);
|
||||
|
template<typename ... Args> |
||||
|
std::string string_format(const std::string& format, Args ... args) |
||||
|
{ |
||||
|
size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
|
||||
|
if (size <= 0) { |
||||
|
throw std::runtime_error("Error during formatting."); |
||||
|
} |
||||
|
std::unique_ptr<char[]> buf(new char[size]); |
||||
|
snprintf(buf.get(), size, format.c_str(), args ...); |
||||
|
return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside }
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
// CAboutDlg dialog used for App About
|
||||
|
|
||||
|
class CAboutDlg : public CDialogEx |
||||
|
{ |
||||
|
public: |
||||
|
CAboutDlg(); |
||||
|
|
||||
|
// Dialog Data
|
||||
|
#ifdef AFX_DESIGN_TIME |
||||
|
enum { IDD = IDD_ABOUTBOX }; |
||||
|
#endif |
||||
|
|
||||
|
protected: |
||||
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
|
|
||||
|
// Implementation
|
||||
|
protected: |
||||
|
DECLARE_MESSAGE_MAP() |
||||
|
}; |
||||
|
|
||||
|
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX) |
||||
|
{ |
||||
|
CDialogEx::DoDataExchange(pDX); |
||||
|
} |
||||
|
|
||||
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) |
||||
|
END_MESSAGE_MAP() |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlg dialog
|
||||
|
|
||||
|
|
||||
|
IMPLEMENT_DYNAMIC(CA2lTestDlgDlg, CDialogEx); |
||||
|
|
||||
|
CA2lTestDlgDlg::CA2lTestDlgDlg(CWnd* pParent /*=nullptr*/) |
||||
|
: CDialogEx(IDD_A2LTESTDLG_DIALOG, pParent) |
||||
|
{ |
||||
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
||||
|
m_pAutoProxy = nullptr; |
||||
|
} |
||||
|
|
||||
|
CA2lTestDlgDlg::~CA2lTestDlgDlg() |
||||
|
{ |
||||
|
// If there is an automation proxy for this dialog, set
|
||||
|
// its back pointer to this dialog to null, so it knows
|
||||
|
// the dialog has been deleted.
|
||||
|
if (m_pAutoProxy != nullptr) |
||||
|
m_pAutoProxy->m_pDialog = nullptr; |
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlg::DoDataExchange(CDataExchange* pDX) |
||||
|
{ |
||||
|
CDialogEx::DoDataExchange(pDX); |
||||
|
} |
||||
|
|
||||
|
BEGIN_MESSAGE_MAP(CA2lTestDlgDlg, CDialogEx) |
||||
|
ON_WM_SYSCOMMAND() |
||||
|
ON_WM_CLOSE() |
||||
|
ON_WM_PAINT() |
||||
|
ON_WM_QUERYDRAGICON() |
||||
|
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CA2lTestDlgDlg::OnBnClickedButtonOpen) |
||||
|
END_MESSAGE_MAP() |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlg message handlers
|
||||
|
|
||||
|
BOOL CA2lTestDlgDlg::OnInitDialog() |
||||
|
{ |
||||
|
CDialogEx::OnInitDialog(); |
||||
|
|
||||
|
// Add "About..." menu item to system menu.
|
||||
|
|
||||
|
// IDM_ABOUTBOX must be in the system command range.
|
||||
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); |
||||
|
ASSERT(IDM_ABOUTBOX < 0xF000); |
||||
|
|
||||
|
CMenu* pSysMenu = GetSystemMenu(FALSE); |
||||
|
if (pSysMenu != nullptr) |
||||
|
{ |
||||
|
BOOL bNameValid; |
||||
|
CString strAboutMenu; |
||||
|
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); |
||||
|
ASSERT(bNameValid); |
||||
|
if (!strAboutMenu.IsEmpty()) |
||||
|
{ |
||||
|
pSysMenu->AppendMenu(MF_SEPARATOR); |
||||
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Set the icon for this dialog. The framework does this automatically
|
||||
|
// when the application's main window is not a dialog
|
||||
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
||||
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
||||
|
|
||||
|
// TODO: Add extra initialization here
|
||||
|
|
||||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlg::OnSysCommand(UINT nID, LPARAM lParam) |
||||
|
{ |
||||
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX) |
||||
|
{ |
||||
|
CAboutDlg dlgAbout; |
||||
|
dlgAbout.DoModal(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
CDialogEx::OnSysCommand(nID, lParam); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// If you add a minimize button to your dialog, you will need the code below
|
||||
|
// to draw the icon. For MFC applications using the document/view model,
|
||||
|
// this is automatically done for you by the framework.
|
||||
|
|
||||
|
void CA2lTestDlgDlg::OnPaint() |
||||
|
{ |
||||
|
if (IsIconic()) |
||||
|
{ |
||||
|
CPaintDC dc(this); // device context for painting
|
||||
|
|
||||
|
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); |
||||
|
|
||||
|
// Center icon in client rectangle
|
||||
|
int cxIcon = GetSystemMetrics(SM_CXICON); |
||||
|
int cyIcon = GetSystemMetrics(SM_CYICON); |
||||
|
CRect rect; |
||||
|
GetClientRect(&rect); |
||||
|
int x = (rect.Width() - cxIcon + 1) / 2; |
||||
|
int y = (rect.Height() - cyIcon + 1) / 2; |
||||
|
|
||||
|
// Draw the icon
|
||||
|
dc.DrawIcon(x, y, m_hIcon); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
CDialogEx::OnPaint(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// The system calls this function to obtain the cursor to display while the user drags
|
||||
|
// the minimized window.
|
||||
|
HCURSOR CA2lTestDlgDlg::OnQueryDragIcon() |
||||
|
{ |
||||
|
return static_cast<HCURSOR>(m_hIcon); |
||||
|
} |
||||
|
|
||||
|
// Automation servers should not exit when a user closes the UI
|
||||
|
// if a controller still holds on to one of its objects. These
|
||||
|
// message handlers make sure that if the proxy is still in use,
|
||||
|
// then the UI is hidden but the dialog remains around if it
|
||||
|
// is dismissed.
|
||||
|
|
||||
|
void CA2lTestDlgDlg::OnClose() |
||||
|
{ |
||||
|
if (CanExit()) |
||||
|
CDialogEx::OnClose(); |
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlg::OnOK() |
||||
|
{ |
||||
|
if (CanExit()) |
||||
|
CDialogEx::OnOK(); |
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlg::OnCancel() |
||||
|
{ |
||||
|
if (CanExit()) |
||||
|
CDialogEx::OnCancel(); |
||||
|
} |
||||
|
|
||||
|
BOOL CA2lTestDlgDlg::CanExit() |
||||
|
{ |
||||
|
// If the proxy object is still around, then the automation
|
||||
|
// controller is still holding on to this application. Leave
|
||||
|
// the dialog around, but hide its UI.
|
||||
|
if (m_pAutoProxy != nullptr) |
||||
|
{ |
||||
|
ShowWindow(SW_HIDE); |
||||
|
return FALSE; |
||||
|
} |
||||
|
|
||||
|
return TRUE; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
void CA2lTestDlgDlg::OnBnClickedButtonOpen() |
||||
|
{ |
||||
|
// TODO: Add your control notification handler code here
|
||||
|
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
|
||||
|
TCHAR a2lExt[] = _T("*.a2l"); |
||||
|
TCHAR a2lBaseFilter[] = _T("A2L file(*.A2L) | *.a2l;*.A2L | 모든파일(*.*) | *.* ||"); |
||||
|
CFileDialog dlg(TRUE, a2lExt, NULL, OFN_HIDEREADONLY, a2lBaseFilter); |
||||
|
|
||||
|
if (dlg.DoModal() == IDOK) { |
||||
|
std::wstring strPath = dlg.GetPathName().GetBuffer(); |
||||
|
|
||||
|
std::string strA2lPath; |
||||
|
strA2lPath.assign(strPath.begin(), strPath.end()); |
||||
|
|
||||
|
loadA2lFile(strA2lPath.c_str()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlg::AddLogString(std::string strMessage) |
||||
|
{ |
||||
|
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_DATA); |
||||
|
std::wstring message_w; |
||||
|
message_w.assign(strMessage.begin(), strMessage.end()); |
||||
|
|
||||
|
pListBox->AddString(message_w.c_str()); |
||||
|
} |
||||
@ -0,0 +1,60 @@ |
|||||
|
|
||||
|
// A2lTestDlgDlg.h : header file
|
||||
|
//
|
||||
|
|
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <chrono> |
||||
|
#include <filesystem> |
||||
|
#include <map> |
||||
|
#include <string> |
||||
|
|
||||
|
#include "A2Lpp.hpp" // A2L generator |
||||
|
|
||||
|
class CA2lTestDlgDlgAutoProxy; |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlg dialog
|
||||
|
class CA2lTestDlgDlg : public CDialogEx |
||||
|
{ |
||||
|
DECLARE_DYNAMIC(CA2lTestDlgDlg); |
||||
|
friend class CA2lTestDlgDlgAutoProxy; |
||||
|
|
||||
|
// Construction
|
||||
|
public: |
||||
|
CA2lTestDlgDlg(CWnd* pParent = nullptr); // standard constructor
|
||||
|
virtual ~CA2lTestDlgDlg(); |
||||
|
|
||||
|
// Dialog Data
|
||||
|
#ifdef AFX_DESIGN_TIME |
||||
|
enum { IDD = IDD_A2LTESTDLG_DIALOG }; |
||||
|
#endif |
||||
|
|
||||
|
protected: |
||||
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
|
|
||||
|
|
||||
|
// Implementation
|
||||
|
protected: |
||||
|
CA2lTestDlgDlgAutoProxy* m_pAutoProxy; |
||||
|
HICON m_hIcon; |
||||
|
|
||||
|
BOOL CanExit(); |
||||
|
|
||||
|
// Generated message map functions
|
||||
|
virtual BOOL OnInitDialog(); |
||||
|
afx_msg void OnSysCommand(UINT nID, LPARAM lParam); |
||||
|
afx_msg void OnPaint(); |
||||
|
afx_msg HCURSOR OnQueryDragIcon(); |
||||
|
afx_msg void OnClose(); |
||||
|
virtual void OnOK(); |
||||
|
virtual void OnCancel(); |
||||
|
DECLARE_MESSAGE_MAP() |
||||
|
public: |
||||
|
afx_msg void OnBnClickedButtonOpen(); |
||||
|
|
||||
|
void AddLogString(std::string strMessage); |
||||
|
|
||||
|
A2L* a2lFile; |
||||
|
}; |
||||
@ -0,0 +1,226 @@ |
|||||
|
|
||||
|
|
||||
|
/* this ALWAYS GENERATED file contains the definitions for the interfaces */ |
||||
|
|
||||
|
|
||||
|
/* File created by MIDL compiler version 8.01.0628 */ |
||||
|
/* at Tue Jan 19 12:14:07 2038
|
||||
|
*/ |
||||
|
/* Compiler settings for A2lTestDlg.idl:
|
||||
|
Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0628 |
||||
|
protocol : dce , ms_ext, c_ext, robust |
||||
|
error checks: allocation ref bounds_check enum stub_data |
||||
|
VC __declspec() decoration level: |
||||
|
__declspec(uuid()), __declspec(selectany), __declspec(novtable) |
||||
|
DECLSPEC_UUID(), MIDL_INTERFACE() |
||||
|
*/ |
||||
|
/* @@MIDL_FILE_HEADING( ) */ |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* verify that the <rpcndr.h> version is high enough to compile this file*/ |
||||
|
#ifndef __REQUIRED_RPCNDR_H_VERSION__ |
||||
|
#define __REQUIRED_RPCNDR_H_VERSION__ 500 |
||||
|
#endif |
||||
|
|
||||
|
#include "rpc.h" |
||||
|
#include "rpcndr.h" |
||||
|
|
||||
|
#ifndef __RPCNDR_H_VERSION__ |
||||
|
#error this stub requires an updated version of <rpcndr.h> |
||||
|
#endif /* __RPCNDR_H_VERSION__ */ |
||||
|
|
||||
|
|
||||
|
#ifndef __A2lTestDlg_h_h__ |
||||
|
#define __A2lTestDlg_h_h__ |
||||
|
|
||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
||||
|
#pragma once |
||||
|
#endif |
||||
|
|
||||
|
#ifndef DECLSPEC_XFGVIRT |
||||
|
#if defined(_CONTROL_FLOW_GUARD_XFG) |
||||
|
#define DECLSPEC_XFGVIRT(base, func) __declspec(xfg_virtual(base, func)) |
||||
|
#else |
||||
|
#define DECLSPEC_XFGVIRT(base, func) |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
/* Forward Declarations */ |
||||
|
|
||||
|
#ifndef __IA2lTestDlg_FWD_DEFINED__ |
||||
|
#define __IA2lTestDlg_FWD_DEFINED__ |
||||
|
typedef interface IA2lTestDlg IA2lTestDlg; |
||||
|
|
||||
|
#endif /* __IA2lTestDlg_FWD_DEFINED__ */ |
||||
|
|
||||
|
|
||||
|
#ifndef __A2lTestDlg_FWD_DEFINED__ |
||||
|
#define __A2lTestDlg_FWD_DEFINED__ |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
typedef class A2lTestDlg A2lTestDlg; |
||||
|
#else |
||||
|
typedef struct A2lTestDlg A2lTestDlg; |
||||
|
#endif /* __cplusplus */ |
||||
|
|
||||
|
#endif /* __A2lTestDlg_FWD_DEFINED__ */ |
||||
|
|
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C"{ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifndef __A2lTestDlg_LIBRARY_DEFINED__ |
||||
|
#define __A2lTestDlg_LIBRARY_DEFINED__ |
||||
|
|
||||
|
/* library A2lTestDlg */ |
||||
|
/* [version][uuid] */ |
||||
|
|
||||
|
|
||||
|
EXTERN_C const IID LIBID_A2lTestDlg; |
||||
|
|
||||
|
#ifndef __IA2lTestDlg_DISPINTERFACE_DEFINED__ |
||||
|
#define __IA2lTestDlg_DISPINTERFACE_DEFINED__ |
||||
|
|
||||
|
/* dispinterface IA2lTestDlg */ |
||||
|
/* [uuid] */ |
||||
|
|
||||
|
|
||||
|
EXTERN_C const IID DIID_IA2lTestDlg; |
||||
|
|
||||
|
#if defined(__cplusplus) && !defined(CINTERFACE) |
||||
|
|
||||
|
MIDL_INTERFACE("9fc78fa1-82e8-4469-9a9f-60c6d387b64a") |
||||
|
IA2lTestDlg : public IDispatch |
||||
|
{ |
||||
|
}; |
||||
|
|
||||
|
#else /* C style interface */ |
||||
|
|
||||
|
typedef struct IA2lTestDlgVtbl |
||||
|
{ |
||||
|
BEGIN_INTERFACE |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IUnknown, QueryInterface) |
||||
|
HRESULT ( STDMETHODCALLTYPE *QueryInterface )( |
||||
|
IA2lTestDlg * This, |
||||
|
/* [in] */ REFIID riid, |
||||
|
/* [annotation][iid_is][out] */ |
||||
|
_COM_Outptr_ void **ppvObject); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IUnknown, AddRef) |
||||
|
ULONG ( STDMETHODCALLTYPE *AddRef )( |
||||
|
IA2lTestDlg * This); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IUnknown, Release) |
||||
|
ULONG ( STDMETHODCALLTYPE *Release )( |
||||
|
IA2lTestDlg * This); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IDispatch, GetTypeInfoCount) |
||||
|
HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( |
||||
|
IA2lTestDlg * This, |
||||
|
/* [out] */ UINT *pctinfo); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IDispatch, GetTypeInfo) |
||||
|
HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( |
||||
|
IA2lTestDlg * This, |
||||
|
/* [in] */ UINT iTInfo, |
||||
|
/* [in] */ LCID lcid, |
||||
|
/* [out] */ ITypeInfo **ppTInfo); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IDispatch, GetIDsOfNames) |
||||
|
HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( |
||||
|
IA2lTestDlg * This, |
||||
|
/* [in] */ REFIID riid, |
||||
|
/* [size_is][in] */ LPOLESTR *rgszNames, |
||||
|
/* [range][in] */ UINT cNames, |
||||
|
/* [in] */ LCID lcid, |
||||
|
/* [size_is][out] */ DISPID *rgDispId); |
||||
|
|
||||
|
DECLSPEC_XFGVIRT(IDispatch, Invoke) |
||||
|
/* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( |
||||
|
IA2lTestDlg * This, |
||||
|
/* [annotation][in] */ |
||||
|
_In_ DISPID dispIdMember, |
||||
|
/* [annotation][in] */ |
||||
|
_In_ REFIID riid, |
||||
|
/* [annotation][in] */ |
||||
|
_In_ LCID lcid, |
||||
|
/* [annotation][in] */ |
||||
|
_In_ WORD wFlags, |
||||
|
/* [annotation][out][in] */ |
||||
|
_In_ DISPPARAMS *pDispParams, |
||||
|
/* [annotation][out] */ |
||||
|
_Out_opt_ VARIANT *pVarResult, |
||||
|
/* [annotation][out] */ |
||||
|
_Out_opt_ EXCEPINFO *pExcepInfo, |
||||
|
/* [annotation][out] */ |
||||
|
_Out_opt_ UINT *puArgErr); |
||||
|
|
||||
|
END_INTERFACE |
||||
|
} IA2lTestDlgVtbl; |
||||
|
|
||||
|
interface IA2lTestDlg |
||||
|
{ |
||||
|
CONST_VTBL struct IA2lTestDlgVtbl *lpVtbl; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifdef COBJMACROS |
||||
|
|
||||
|
|
||||
|
#define IA2lTestDlg_QueryInterface(This,riid,ppvObject) \ |
||||
|
( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) |
||||
|
|
||||
|
#define IA2lTestDlg_AddRef(This) \ |
||||
|
( (This)->lpVtbl -> AddRef(This) ) |
||||
|
|
||||
|
#define IA2lTestDlg_Release(This) \ |
||||
|
( (This)->lpVtbl -> Release(This) ) |
||||
|
|
||||
|
|
||||
|
#define IA2lTestDlg_GetTypeInfoCount(This,pctinfo) \ |
||||
|
( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) |
||||
|
|
||||
|
#define IA2lTestDlg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ |
||||
|
( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) |
||||
|
|
||||
|
#define IA2lTestDlg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ |
||||
|
( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) |
||||
|
|
||||
|
#define IA2lTestDlg_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ |
||||
|
( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) |
||||
|
|
||||
|
#endif /* COBJMACROS */ |
||||
|
|
||||
|
|
||||
|
#endif /* C style interface */ |
||||
|
|
||||
|
|
||||
|
#endif /* __IA2lTestDlg_DISPINTERFACE_DEFINED__ */ |
||||
|
|
||||
|
|
||||
|
EXTERN_C const CLSID CLSID_A2lTestDlg; |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
|
||||
|
class DECLSPEC_UUID("04615303-44d9-45b7-b802-02b06c0dde4f") |
||||
|
A2lTestDlg; |
||||
|
#endif |
||||
|
#endif /* __A2lTestDlg_LIBRARY_DEFINED__ */ |
||||
|
|
||||
|
/* Additional Prototypes for ALL interfaces */ |
||||
|
|
||||
|
/* end of Additional Prototypes */ |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
@ -0,0 +1,84 @@ |
|||||
|
|
||||
|
|
||||
|
/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ |
||||
|
|
||||
|
/* link this file in with the server and any clients */ |
||||
|
|
||||
|
|
||||
|
/* File created by MIDL compiler version 8.01.0628 */ |
||||
|
/* at Tue Jan 19 12:14:07 2038
|
||||
|
*/ |
||||
|
/* Compiler settings for A2lTestDlg.idl:
|
||||
|
Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0628 |
||||
|
protocol : dce , ms_ext, c_ext, robust |
||||
|
error checks: allocation ref bounds_check enum stub_data |
||||
|
VC __declspec() decoration level: |
||||
|
__declspec(uuid()), __declspec(selectany), __declspec(novtable) |
||||
|
DECLSPEC_UUID(), MIDL_INTERFACE() |
||||
|
*/ |
||||
|
/* @@MIDL_FILE_HEADING( ) */ |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C"{ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
#include <rpc.h> |
||||
|
#include <rpcndr.h> |
||||
|
|
||||
|
#ifdef _MIDL_USE_GUIDDEF_ |
||||
|
|
||||
|
#ifndef INITGUID |
||||
|
#define INITGUID |
||||
|
#include <guiddef.h> |
||||
|
#undef INITGUID |
||||
|
#else |
||||
|
#include <guiddef.h> |
||||
|
#endif |
||||
|
|
||||
|
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ |
||||
|
DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) |
||||
|
|
||||
|
#else // !_MIDL_USE_GUIDDEF_
|
||||
|
|
||||
|
#ifndef __IID_DEFINED__ |
||||
|
#define __IID_DEFINED__ |
||||
|
|
||||
|
typedef struct _IID |
||||
|
{ |
||||
|
unsigned long x; |
||||
|
unsigned short s1; |
||||
|
unsigned short s2; |
||||
|
unsigned char c[8]; |
||||
|
} IID; |
||||
|
|
||||
|
#endif // __IID_DEFINED__
|
||||
|
|
||||
|
#ifndef CLSID_DEFINED |
||||
|
#define CLSID_DEFINED |
||||
|
typedef IID CLSID; |
||||
|
#endif // CLSID_DEFINED
|
||||
|
|
||||
|
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ |
||||
|
EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} |
||||
|
|
||||
|
#endif // !_MIDL_USE_GUIDDEF_
|
||||
|
|
||||
|
MIDL_DEFINE_GUID(IID, LIBID_A2lTestDlg,0xaacf2bb9,0x0c94,0x4623,0x8c,0x20,0xbb,0xe3,0x07,0x07,0x21,0xea); |
||||
|
|
||||
|
|
||||
|
MIDL_DEFINE_GUID(IID, DIID_IA2lTestDlg,0x9fc78fa1,0x82e8,0x4469,0x9a,0x9f,0x60,0xc6,0xd3,0x87,0xb6,0x4a); |
||||
|
|
||||
|
|
||||
|
MIDL_DEFINE_GUID(CLSID, CLSID_A2lTestDlg,0x04615303,0x44d9,0x45b7,0xb8,0x02,0x02,0xb0,0x6c,0x0d,0xde,0x4f); |
||||
|
|
||||
|
#undef MIDL_DEFINE_GUID |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,87 @@ |
|||||
|
|
||||
|
// DlgProxy.cpp : implementation file
|
||||
|
//
|
||||
|
|
||||
|
#include "pch.h" |
||||
|
#include "framework.h" |
||||
|
#include "A2lTestDlg.h" |
||||
|
#include "DlgProxy.h" |
||||
|
#include "A2lTestDlgDlg.h" |
||||
|
|
||||
|
#ifdef _DEBUG |
||||
|
#define new DEBUG_NEW |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlgAutoProxy
|
||||
|
|
||||
|
IMPLEMENT_DYNCREATE(CA2lTestDlgDlgAutoProxy, CCmdTarget) |
||||
|
|
||||
|
CA2lTestDlgDlgAutoProxy::CA2lTestDlgDlgAutoProxy() |
||||
|
{ |
||||
|
EnableAutomation(); |
||||
|
|
||||
|
// To keep the application running as long as an automation
|
||||
|
// object is active, the constructor calls AfxOleLockApp.
|
||||
|
AfxOleLockApp(); |
||||
|
|
||||
|
// Get access to the dialog through the application's
|
||||
|
// main window pointer. Set the proxy's internal pointer
|
||||
|
// to point to the dialog, and set the dialog's back pointer to
|
||||
|
// this proxy.
|
||||
|
ASSERT_VALID(AfxGetApp()->m_pMainWnd); |
||||
|
if (AfxGetApp()->m_pMainWnd) |
||||
|
{ |
||||
|
ASSERT_KINDOF(CA2lTestDlgDlg, AfxGetApp()->m_pMainWnd); |
||||
|
if (AfxGetApp()->m_pMainWnd->IsKindOf(RUNTIME_CLASS(CA2lTestDlgDlg))) |
||||
|
{ |
||||
|
m_pDialog = reinterpret_cast<CA2lTestDlgDlg*>(AfxGetApp()->m_pMainWnd); |
||||
|
m_pDialog->m_pAutoProxy = this; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
CA2lTestDlgDlgAutoProxy::~CA2lTestDlgDlgAutoProxy() |
||||
|
{ |
||||
|
// To terminate the application when all objects created with
|
||||
|
// with automation, the destructor calls AfxOleUnlockApp.
|
||||
|
// Among other things, this will destroy the main dialog
|
||||
|
if (m_pDialog != nullptr) |
||||
|
m_pDialog->m_pAutoProxy = nullptr; |
||||
|
AfxOleUnlockApp(); |
||||
|
} |
||||
|
|
||||
|
void CA2lTestDlgDlgAutoProxy::OnFinalRelease() |
||||
|
{ |
||||
|
// When the last reference for an automation object is released
|
||||
|
// OnFinalRelease is called. The base class will automatically
|
||||
|
// deletes the object. Add additional cleanup required for your
|
||||
|
// object before calling the base class.
|
||||
|
|
||||
|
CCmdTarget::OnFinalRelease(); |
||||
|
} |
||||
|
|
||||
|
BEGIN_MESSAGE_MAP(CA2lTestDlgDlgAutoProxy, CCmdTarget) |
||||
|
END_MESSAGE_MAP() |
||||
|
|
||||
|
BEGIN_DISPATCH_MAP(CA2lTestDlgDlgAutoProxy, CCmdTarget) |
||||
|
END_DISPATCH_MAP() |
||||
|
|
||||
|
// Note: we add support for IID_IA2lTestDlg to support typesafe binding
|
||||
|
// from VBA. This IID must match the GUID that is attached to the
|
||||
|
// dispinterface in the .IDL file.
|
||||
|
|
||||
|
// {9fc78fa1-82e8-4469-9a9f-60c6d387b64a}
|
||||
|
static const IID IID_IA2lTestDlg = |
||||
|
{0x9fc78fa1,0x82e8,0x4469,{0x9a,0x9f,0x60,0xc6,0xd3,0x87,0xb6,0x4a}}; |
||||
|
|
||||
|
BEGIN_INTERFACE_MAP(CA2lTestDlgDlgAutoProxy, CCmdTarget) |
||||
|
INTERFACE_PART(CA2lTestDlgDlgAutoProxy, IID_IA2lTestDlg, Dispatch) |
||||
|
END_INTERFACE_MAP() |
||||
|
|
||||
|
// The IMPLEMENT_OLECREATE2 macro is defined in pch.h of this project
|
||||
|
// {04615303-44d9-45b7-b802-02b06c0dde4f}
|
||||
|
IMPLEMENT_OLECREATE2(CA2lTestDlgDlgAutoProxy, "A2lTestDlg.Application", 0x04615303,0x44d9,0x45b7,0xb8,0x02,0x02,0xb0,0x6c,0x0d,0xde,0x4f) |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlgAutoProxy message handlers
|
||||
@ -0,0 +1,43 @@ |
|||||
|
|
||||
|
// DlgProxy.h: header file
|
||||
|
//
|
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
class CA2lTestDlgDlg; |
||||
|
|
||||
|
|
||||
|
// CA2lTestDlgDlgAutoProxy command target
|
||||
|
|
||||
|
class CA2lTestDlgDlgAutoProxy : public CCmdTarget |
||||
|
{ |
||||
|
DECLARE_DYNCREATE(CA2lTestDlgDlgAutoProxy) |
||||
|
|
||||
|
CA2lTestDlgDlgAutoProxy(); // protected constructor used by dynamic creation
|
||||
|
|
||||
|
// Attributes
|
||||
|
public: |
||||
|
CA2lTestDlgDlg* m_pDialog; |
||||
|
|
||||
|
// Operations
|
||||
|
public: |
||||
|
|
||||
|
// Overrides
|
||||
|
public: |
||||
|
virtual void OnFinalRelease(); |
||||
|
|
||||
|
// Implementation
|
||||
|
protected: |
||||
|
virtual ~CA2lTestDlgDlgAutoProxy(); |
||||
|
|
||||
|
// Generated message map functions
|
||||
|
|
||||
|
DECLARE_MESSAGE_MAP() |
||||
|
DECLARE_OLECREATE(CA2lTestDlgDlgAutoProxy) |
||||
|
|
||||
|
// Generated OLE dispatch map functions
|
||||
|
|
||||
|
DECLARE_DISPATCH_MAP() |
||||
|
DECLARE_INTERFACE_MAP() |
||||
|
}; |
||||
|
|
||||
@ -0,0 +1,50 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
/* dbg_print.h */ |
||||
|
/*
|
||||
|
| Code released into public domain, no attribution required |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Debug print
|
||||
|
|
||||
|
#if OPTION_ENABLE_DBG_PRINTS |
||||
|
|
||||
|
extern unsigned int gDebugLevel; |
||||
|
#define DBG_LEVEL gDebugLevel |
||||
|
|
||||
|
#define DBG_PRINTF_ERROR(format, ...) printf(format, __VA_ARGS__) |
||||
|
#define DBG_PRINTF(level, format, ...) if (DBG_LEVEL>=level) printf(format, __VA_ARGS__) |
||||
|
#define DBG_PRINTF1(format, ...) if (DBG_LEVEL>=1) printf(format, __VA_ARGS__) |
||||
|
#define DBG_PRINTF2(format, ...) if (DBG_LEVEL>=2) printf(format, __VA_ARGS__) |
||||
|
#define DBG_PRINTF3(format, ...) if (DBG_LEVEL>=3) printf(format, __VA_ARGS__) |
||||
|
#define DBG_PRINTF4(format, ...) if (DBG_LEVEL>=4) printf(format, __VA_ARGS__) |
||||
|
|
||||
|
#define DBG_PRINT_ERROR(format) printf(format) |
||||
|
#define DBG_PRINT(level, format) if (DBG_LEVEL>=level) printf(format) |
||||
|
#define DBG_PRINT1(format) if (DBG_LEVEL>=1) printf(format) |
||||
|
#define DBG_PRINT2(format) if (DBG_LEVEL>=2) printf(format) |
||||
|
#define DBG_PRINT3(format) if (DBG_LEVEL>=3) printf(format) |
||||
|
#define DBG_PRINT4(format) if (DBG_LEVEL>=4) printf(format) |
||||
|
|
||||
|
#else |
||||
|
|
||||
|
#undef DBG_LEVEL |
||||
|
|
||||
|
#define DBG_PRINTF_ERROR(s, ...) // printf(s,__VA_ARGS__)
|
||||
|
#define DBG_PRINTF(level, s, ...) |
||||
|
#define DBG_PRINTF1(s, ...) |
||||
|
#define DBG_PRINTF2(s, ...) |
||||
|
#define DBG_PRINTF3(s, ...) |
||||
|
#define DBG_PRINTF4(s, ...) |
||||
|
|
||||
|
#define DBG_PRINT_ERROR(s, ...) // printf(s,__VA_ARGS__)
|
||||
|
#define DBG_PRINT(level, s, ...) |
||||
|
#define DBG_PRINT1(s, ...) |
||||
|
#define DBG_PRINT2(s, ...) |
||||
|
#define DBG_PRINT3(s, ...) |
||||
|
#define DBG_PRINT4(s, ...) |
||||
|
|
||||
|
#endif |
||||
|
|
||||
@ -0,0 +1,60 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#ifndef VC_EXTRALEAN |
||||
|
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
||||
|
#endif |
||||
|
|
||||
|
#include "targetver.h" |
||||
|
|
||||
|
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
|
||||
|
|
||||
|
// turns off MFC's hiding of some common and often safely ignored warning messages
|
||||
|
#define _AFX_ALL_WARNINGS |
||||
|
|
||||
|
#include <afxwin.h> // MFC core and standard components |
||||
|
#include <afxext.h> // MFC extensions |
||||
|
|
||||
|
|
||||
|
#include <afxdisp.h> // MFC Automation classes |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifndef _AFX_NO_OLE_SUPPORT |
||||
|
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls |
||||
|
#endif |
||||
|
#ifndef _AFX_NO_AFXCMN_SUPPORT |
||||
|
#include <afxcmn.h> // MFC support for Windows Common Controls |
||||
|
#endif // _AFX_NO_AFXCMN_SUPPORT
|
||||
|
|
||||
|
#include <afxcontrolbars.h> // MFC support for ribbons and control bars |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// This macro is the same as IMPLEMENT_OLECREATE, except it passes TRUE
|
||||
|
// for the bMultiInstance parameter to the COleObjectFactory constructor.
|
||||
|
// We want a separate instance of this application to be launched for
|
||||
|
// each automation proxy object requested by automation controllers.
|
||||
|
#ifndef IMPLEMENT_OLECREATE2 |
||||
|
#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ |
||||
|
AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \ |
||||
|
RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \ |
||||
|
const AFX_DATADEF GUID class_name::guid = \ |
||||
|
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; |
||||
|
#endif // IMPLEMENT_OLECREATE2
|
||||
|
|
||||
|
#ifdef _UNICODE |
||||
|
#if defined _M_IX86 |
||||
|
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") |
||||
|
#elif defined _M_X64 |
||||
|
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") |
||||
|
#else |
||||
|
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
|
||||
@ -0,0 +1,95 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
/* main.h */ |
||||
|
/*
|
||||
|
| Code released into public domain, no attribution required |
||||
|
*/ |
||||
|
|
||||
|
// Windows or Linux ?
|
||||
|
#if defined(_WIN32) || defined(_WIN64) |
||||
|
#define _WIN |
||||
|
#if defined(_WIN32) && defined(_WIN64) |
||||
|
#undef _WIN32 |
||||
|
#endif |
||||
|
#if defined(_LINUX) || defined(_LINUX64)|| defined(_LINUX32) |
||||
|
#error |
||||
|
#endif |
||||
|
#else |
||||
|
#define _LINUX |
||||
|
#if defined (_ix64_) || defined (__x86_64__) || defined (__aarch64__) |
||||
|
#define _LINUX64 |
||||
|
#else |
||||
|
#define _LINUX32 |
||||
|
#endif |
||||
|
#if defined(_WIN) || defined(_WIN64)|| defined(_WIN32) |
||||
|
#error |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
#ifdef _WIN |
||||
|
#define WIN32_LEAN_AND_MEAN |
||||
|
#define _CRT_SECURE_NO_WARNINGS |
||||
|
#else |
||||
|
#define _DEFAULT_SOURCE |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdint.h> |
||||
|
#include <inttypes.h> |
||||
|
#include <math.h> |
||||
|
|
||||
|
#ifdef _WIN |
||||
|
#define M_PI 3.14159265358979323846 |
||||
|
#endif |
||||
|
#define M_2PI (M_PI*2) |
||||
|
|
||||
|
#include <assert.h> |
||||
|
|
||||
|
#ifndef _WIN // Linux
|
||||
|
|
||||
|
#include <stdarg.h> |
||||
|
#include <string.h> |
||||
|
#include <errno.h> |
||||
|
#include <unistd.h> |
||||
|
|
||||
|
#include <sys/time.h> |
||||
|
#include <time.h> |
||||
|
#include <sys/stat.h> |
||||
|
#include <pthread.h> |
||||
|
|
||||
|
#include <ifaddrs.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <netinet/in.h> |
||||
|
#include <netinet/tcp.h> |
||||
|
#include <arpa/inet.h> |
||||
|
#include <sys/socket.h> |
||||
|
|
||||
|
#define MAX_PATH 256 |
||||
|
#define BOOL int |
||||
|
#define FALSE 0 |
||||
|
#define TRUE 1 |
||||
|
|
||||
|
#else // Windows
|
||||
|
|
||||
|
#include <windows.h> |
||||
|
#include <time.h> |
||||
|
#include <conio.h> |
||||
|
|
||||
|
#define BOOL int |
||||
|
#define FALSE 0 |
||||
|
#define TRUE 1 |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
#include <typeinfo> |
||||
|
#include <thread> |
||||
|
#include <string> |
||||
|
#include <vector> |
||||
|
#endif |
||||
|
|
||||
|
#include "main_cfg.h" |
||||
|
|
||||
@ -0,0 +1,48 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
// main_cfg.h
|
||||
|
// CPP_Demo
|
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
// Application configuration:
|
||||
|
// XCP configuration is in xcp_cfg.h (Protocol Layer) and xcptl_cfg.h (Transport Layer)
|
||||
|
|
||||
|
|
||||
|
#define ON 1 |
||||
|
#define OFF 0 |
||||
|
|
||||
|
|
||||
|
// Debug prints
|
||||
|
#define OPTION_ENABLE_DBG_PRINTS ON |
||||
|
#define OPTION_DEBUG_LEVEL 2 |
||||
|
#define OPTION_UDP_DEBUG_LEVEL 0 |
||||
|
|
||||
|
|
||||
|
// Enable C++ class wrapper
|
||||
|
#define OPTION_ENABLE_XCP_CLASS ON |
||||
|
|
||||
|
// Enable demo how to measure dynamic instances
|
||||
|
#define OPTION_ENABLE_DYNAMIC_DEMO ON |
||||
|
|
||||
|
|
||||
|
// A2L generation
|
||||
|
#define OPTION_ENABLE_A2L_GEN ON // Enable A2L generation
|
||||
|
#if OPTION_ENABLE_A2L_GEN |
||||
|
#define OPTION_A2L_NAME "CPP_Demo" // A2L name
|
||||
|
#define OPTION_A2L_FILE_NAME "CPP_Demo.a2l" // A2L filename
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
// Set clock resolution (for clock function in platform.c)
|
||||
|
#define CLOCK_USE_APP_TIME_US |
||||
|
//#define CLOCK_USE_UTC_TIME_NS
|
||||
|
|
||||
|
|
||||
|
// Ethernet Transport Layer
|
||||
|
#define OPTION_USE_TCP OFF |
||||
|
#define OPTION_MTU 1500 // Ethernet MTU
|
||||
|
#define OPTION_SERVER_PORT 5555 // Default UDP port
|
||||
|
#define OPTION_SERVER_ADDR {127,0,0,1} // IP addr to bind, 0.0.0.0 = ANY
|
||||
|
|
||||
@ -0,0 +1,39 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
// main_cfg.h
|
||||
|
// CPP_Demo
|
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
#define APP_CPP_Demo |
||||
|
|
||||
|
#define APP_NAME "CPP_Demo" |
||||
|
#define APP_VERSION_MAJOR @CPP_Demo_VERSION_MAJOR@ |
||||
|
#define APP_VERSION_MINOR @CPP_Demo_VERSION_MINOR@ |
||||
|
|
||||
|
//-----------------------------------------------------------------------------------------------------
|
||||
|
// Application configuration:
|
||||
|
// XCP configuration is in xcp_cfg.h (Protocol Layer) and xcptl_cfg.h (Transport Layer)
|
||||
|
|
||||
|
#define ON 1 |
||||
|
#define OFF 0 |
||||
|
|
||||
|
#define OPTION_DEBUG_LEVEL @OPTION_DEBUG_LEVEL@ |
||||
|
|
||||
|
// A2L generation
|
||||
|
#define OPTION_ENABLE_A2L_GEN ON // Enable A2L generation
|
||||
|
#if OPTION_ENABLE_A2L_GEN |
||||
|
#define OPTION_ENABLE_A2L_SYMBOL_LINKS ON // Enable generation of symbol links (required for CANape integrated linker map update)
|
||||
|
#define OPTION_A2L_NAME "CPP_Demo" // A2L name
|
||||
|
#define OPTION_A2L_FILE_NAME "CPP_Demo.a2l" // A2L filename
|
||||
|
#define OPTION_A2L_PROJECT_NAME "CPP_Demo" // A2L project name
|
||||
|
#endif |
||||
|
|
||||
|
// Default communication parameters
|
||||
|
#define OPTION_ENABLE_TCP @OPTION_ENABLE_TCP@ // Enable TCP support
|
||||
|
#define OPTION_USE_TCP @OPTION_USE_TCP@ // Default
|
||||
|
#define OPTION_MTU @OPTION_MTU@ // Ethernet MTU
|
||||
|
#define OPTION_SERVER_PORT @OPTION_SERVER_PORT@ // Default UDP port, overwritten by commandline option -port
|
||||
|
#define OPTION_SERVER_ADDR @OPTION_SERVER_ADDR@ // Default IP addr to bind, 0.0.0.0 = ANY, overwritten by commandline option -bind x.x.x.x
|
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
// pch.cpp: source file corresponding to the pre-compiled header
|
||||
|
|
||||
|
#include "pch.h" |
||||
|
|
||||
|
// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
|
||||
@ -0,0 +1,13 @@ |
|||||
|
// pch.h: This is a precompiled header file.
|
||||
|
// Files listed below are compiled only once, improving build performance for future builds.
|
||||
|
// This also affects IntelliSense performance, including code completion and many code browsing features.
|
||||
|
// However, files listed here are ALL re-compiled if any one of them is updated between builds.
|
||||
|
// Do not add files here that you will be updating frequently as this negates the performance advantage.
|
||||
|
|
||||
|
#ifndef PCH_H |
||||
|
#define PCH_H |
||||
|
|
||||
|
// add headers that you want to pre-compile here
|
||||
|
#include "framework.h" |
||||
|
|
||||
|
#endif //PCH_H
|
||||
@ -0,0 +1,183 @@ |
|||||
|
#pragma once |
||||
|
/* platform.h */ |
||||
|
/*
|
||||
|
| Code released into public domain, no attribution required |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Keyboard
|
||||
|
|
||||
|
#ifdef _LINUX |
||||
|
|
||||
|
#include <termios.h> |
||||
|
|
||||
|
extern int _getch(); |
||||
|
extern int _kbhit(); |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Safe sprintf
|
||||
|
|
||||
|
#if defined(_WIN) // Windows
|
||||
|
#define SPRINTF(dest,format,...) sprintf_s((char*)dest,sizeof(dest),format,__VA_ARGS__) |
||||
|
#define SNPRINTF(dest,len,format,...) sprintf_s((char*)dest,len,format,__VA_ARGS__) |
||||
|
#elif defined(_LINUX) // Linux
|
||||
|
#define SPRINTF(dest,format,...) snprintf((char*)dest,sizeof(dest),format,__VA_ARGS__) |
||||
|
#define SNPRINTF(dest,len,format,...) snprintf((char*)dest,len,format,__VA_ARGS__) |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Delay
|
||||
|
|
||||
|
// Delay based on clock
|
||||
|
extern void sleepNs(uint32_t ns); |
||||
|
|
||||
|
// Delay - Less precise and less CPU load, not based on clock, time domain different
|
||||
|
extern void sleepMs(uint32_t ms); |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Mutex
|
||||
|
|
||||
|
|
||||
|
#if defined(_WIN) // Windows
|
||||
|
|
||||
|
#define MUTEX CRITICAL_SECTION |
||||
|
#define mutexLock EnterCriticalSection |
||||
|
#define mutexUnlock LeaveCriticalSection |
||||
|
|
||||
|
#elif defined(_LINUX) // Linux
|
||||
|
|
||||
|
#define MUTEX pthread_mutex_t |
||||
|
#define MUTEX_INTIALIZER PTHREAD_MUTEX_INITIALIZER |
||||
|
#define mutexLock pthread_mutex_lock |
||||
|
#define mutexUnlock pthread_mutex_unlock |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
void mutexInit(MUTEX* m, BOOL recursive, uint32_t spinCount); |
||||
|
void mutexDestroy(MUTEX* m); |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Threads
|
||||
|
|
||||
|
#if defined(_WIN) // Windows
|
||||
|
|
||||
|
typedef HANDLE tXcpThread; |
||||
|
#define create_thread(h,t) *h = CreateThread(0, 0, t, NULL, 0, NULL) |
||||
|
#define join_thread(h) WaitForSingleObject(h, INFINITE); |
||||
|
#define terminate_thread(h) { TerminateThread(h,0); WaitForSingleObject(h,1000); CloseHandle(h); } |
||||
|
#define cancel_thread terminate_thread |
||||
|
|
||||
|
#elif defined(_LINUX) // Linux
|
||||
|
|
||||
|
typedef pthread_t tXcpThread; |
||||
|
#define create_thread(h,t) pthread_create(h, NULL, t, NULL); |
||||
|
#define join_thread(h) pthread_join(h,NULL); |
||||
|
#define detach_thread(h) { pthread_detach(h); pthread_cancel(h); } |
||||
|
#define cancel_thread detach_thread |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Platform independant socket functions
|
||||
|
|
||||
|
#ifdef _LINUX // Linux sockets
|
||||
|
|
||||
|
#define SOCKET int |
||||
|
#define INVALID_SOCKET (-1) |
||||
|
|
||||
|
#define SOCKADDR_IN struct sockaddr_in |
||||
|
#define SOCKADDR struct sockaddr |
||||
|
|
||||
|
#define SOCKET_ERROR_ABORT EBADF |
||||
|
#define SOCKET_ERROR_RESET EBADF |
||||
|
#define SOCKET_ERROR_INTR EBADF |
||||
|
#define SOCKET_ERROR_WBLOCK EAGAIN |
||||
|
|
||||
|
#undef htonll |
||||
|
#define htonll(val) ((((uint64_t)htonl((uint32_t)val)) << 32) + htonl((uint32_t)(val >> 32))) |
||||
|
|
||||
|
|
||||
|
#define socketGetLastError() errno |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#if defined(_WIN) // Windows // Windows sockets or XL-API
|
||||
|
|
||||
|
#include <winsock2.h> |
||||
|
#include <ws2tcpip.h> |
||||
|
|
||||
|
#define SOCKET_ERROR_OTHER 1 |
||||
|
#define SOCKET_ERROR_WBLOCK WSAEWOULDBLOCK |
||||
|
#define SOCKET_ERROR_ABORT WSAECONNABORTED |
||||
|
#define SOCKET_ERROR_RESET WSAECONNRESET |
||||
|
#define SOCKET_ERROR_INTR WSAEINTR |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
// Timestamp mode
|
||||
|
#define SOCKET_TIMESTAMP_NONE 0 // No timestamps
|
||||
|
#define SOCKET_TIMESTAMP_HW 1 // Hardware clock
|
||||
|
#define SOCKET_TIMESTAMP_HW_SYNT 2 // Hardware clock syntonized to PC clock
|
||||
|
#define SOCKET_TIMESTAMP_PC 3 // PC clock
|
||||
|
|
||||
|
// Clock mode
|
||||
|
#define SOCKET_TIMESTAMP_FREE_RUNNING 0 |
||||
|
#define SOCKET_TIMESTAMP_SOFTWARE_SYNC 1 |
||||
|
|
||||
|
extern BOOL socketStartup(); |
||||
|
extern int32_t socketGetLastError(); |
||||
|
extern void socketCleanup(); |
||||
|
extern BOOL socketOpen(SOCKET* sp, BOOL useTCP, BOOL nonBlocking, BOOL reuseaddr, BOOL timestamps); |
||||
|
extern BOOL socketBind(SOCKET sock, uint8_t* addr, uint16_t port); |
||||
|
extern BOOL socketJoin(SOCKET sock, uint8_t* maddr); |
||||
|
extern BOOL socketListen(SOCKET sock); |
||||
|
extern SOCKET socketAccept(SOCKET sock, uint8_t addr[]); |
||||
|
extern int16_t socketRecv(SOCKET sock, uint8_t* buffer, uint16_t bufferSize, BOOL waitAll); |
||||
|
extern int16_t socketRecvFrom(SOCKET sock, uint8_t* buffer, uint16_t bufferSize, uint8_t* srcAddr, uint16_t* srcPort, uint64_t *time); |
||||
|
extern int16_t socketSend(SOCKET sock, const uint8_t* buffer, uint16_t bufferSize); |
||||
|
extern int16_t socketSendTo(SOCKET sock, const uint8_t* buffer, uint16_t bufferSize, const uint8_t* addr, uint16_t port, uint64_t *time); |
||||
|
extern BOOL socketShutdown(SOCKET sock); |
||||
|
extern BOOL socketClose(SOCKET* sp); |
||||
|
extern BOOL socketGetLocalAddr(uint8_t* mac, uint8_t* addr); |
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Clock
|
||||
|
|
||||
|
// Clock resolution and epoch
|
||||
|
#if !defined(CLOCK_USE_UTC_TIME_NS) && !defined(CLOCK_USE_APP_TIME_US) |
||||
|
// Default
|
||||
|
#define CLOCK_USE_UTC_TIME_NS // Use ns timestamps relative to 1.1.1970 (TAI monotonic - no backward jumps)
|
||||
|
//#define CLOCK_USE_APP_TIME_US // Use arbitrary us timestamps relative to application start
|
||||
|
#endif |
||||
|
|
||||
|
#ifdef CLOCK_USE_UTC_TIME_NS |
||||
|
|
||||
|
#define CLOCK_TICKS_PER_M (1000000000ULL*60) |
||||
|
#define CLOCK_TICKS_PER_S 1000000000 |
||||
|
#define CLOCK_TICKS_PER_MS 1000000 |
||||
|
#define CLOCK_TICKS_PER_US 1000 |
||||
|
#define CLOCK_TICKS_PER_NS 1 |
||||
|
|
||||
|
#else |
||||
|
|
||||
|
#define CLOCK_TICKS_PER_S 1000000 |
||||
|
#define CLOCK_TICKS_PER_MS 1000 |
||||
|
#define CLOCK_TICKS_PER_US 1 |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
// Clock
|
||||
|
extern BOOL clockInit(); |
||||
|
extern uint64_t clockGet(); |
||||
|
extern uint64_t clockGetLast(); |
||||
|
extern char* clockGetString(char* s, uint32_t l, uint64_t c); |
||||
|
extern char* clockGetTimeString(char* s, uint32_t l, int64_t c); |
||||
|
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
@ -0,0 +1,24 @@ |
|||||
|
//{{NO_DEPENDENCIES}}
|
||||
|
// Microsoft Visual C++ generated include file.
|
||||
|
// Used by A2lTestDlg.rc
|
||||
|
//
|
||||
|
#define IDM_ABOUTBOX 0x0010 |
||||
|
#define IDD_ABOUTBOX 100 |
||||
|
#define IDP_OLE_INIT_FAILED 100 |
||||
|
#define IDS_ABOUTBOX 101 |
||||
|
#define IDD_A2LTESTDLG_DIALOG 102 |
||||
|
#define IDR_MAINFRAME 128 |
||||
|
#define IDC_LIST2 1001 |
||||
|
#define IDC_LIST_DATA 1001 |
||||
|
#define IDC_BUTTON_OPEN 1002 |
||||
|
|
||||
|
// Next default values for new objects
|
||||
|
//
|
||||
|
#ifdef APSTUDIO_INVOKED |
||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS |
||||
|
#define _APS_NEXT_RESOURCE_VALUE 130 |
||||
|
#define _APS_NEXT_COMMAND_VALUE 32771 |
||||
|
#define _APS_NEXT_CONTROL_VALUE 1003 |
||||
|
#define _APS_NEXT_SYMED_VALUE 101 |
||||
|
#endif |
||||
|
#endif |
||||
@ -0,0 +1,8 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
|
|
||||
|
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
|
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
|
|
||||
|
#include <SDKDDKVer.h> |
||||
File diff suppressed because it is too large
@ -0,0 +1,27 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
/* xcpEthTl.h */ |
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
/* ETH transport Layer functions called by application */ |
||||
|
extern BOOL XcpEthTlInit(const uint8_t* addr, uint16_t port, BOOL useTCP, uint16_t segmentSize, BOOL blockingRx); // Start transport layer
|
||||
|
|
||||
|
// Test mode
|
||||
|
#ifdef XCPTL_ENABLE_SELF_TEST |
||||
|
extern void XcpEthTlCreateA2lDescription(); |
||||
|
extern void XcpEthTlCreateXcpEvents(); |
||||
|
extern uint64_t XcpEthTlGetBytesWritten(); // Get the number of bytes send
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* ETH transport Layer functions called by XCPlite.c */ |
||||
|
extern void XcpEthTlSendMulticastCrm(const uint8_t* data, uint16_t n, const uint8_t* addr, uint16_t port); // Send multicast command response
|
||||
|
#ifdef XCPTL_ENABLE_MULTICAST |
||||
|
extern void XcpEthTlSetClusterId(uint16_t clusterId); // Set cluster id for GET_DAQ_CLOCK_MULTICAST reception
|
||||
|
#endif |
||||
|
|
||||
|
extern void XcpEthTlGetInfo(BOOL* isTCP, uint8_t* mac, uint8_t* addr, uint16_t* port); |
||||
|
|
||||
|
|
||||
@ -0,0 +1,188 @@ |
|||||
|
#pragma once |
||||
|
/* xcpLite.h */ |
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
|
||||
|
#ifdef __XCPTL_CFG_H__ |
||||
|
#error "Include dependency error!" |
||||
|
#endif |
||||
|
#ifdef __XCP_CFG_H__ |
||||
|
#error "Include dependency error!" |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
// Transport layer type
|
||||
|
// The protocol layer implementation has some dependencies on the transport layer type
|
||||
|
// Some XCP commands are only supported on Ethernet and can not be compiled with MAX_CTO == 8
|
||||
|
#define XCP_TRANSPORT_LAYER_ETH 1 |
||||
|
#define XCP_TRANSPORT_LAYER_CAN 0 |
||||
|
|
||||
|
#include "xcptl_cfg.h" // Transport layer configuration |
||||
|
|
||||
|
// Transport layer definitions and configuration
|
||||
|
#if XCP_TRANSPORT_LAYER_TYPE==XCP_TRANSPORT_LAYER_ETH |
||||
|
#include "xcpTl.h" |
||||
|
#include "xcpEthTl.h" // Ethernet transport layer specific functions |
||||
|
#elif XCP_TRANSPORT_LAYER_TYPE==XCP_TRANSPORT_LAYER_CAN |
||||
|
#include "xcptl.h" |
||||
|
#include "xcpcantl.h" |
||||
|
#else |
||||
|
#error "Define XCP_TRANSPORT_LAYER_ETH or XCP_TRANSPORT_LAYER_CAN" |
||||
|
#endif |
||||
|
|
||||
|
// Protocol layer definitions and configuration
|
||||
|
#include "xcp_cfg.h" // Protocol layer configuration |
||||
|
#include "xcp.h" // XCP protocol defines |
||||
|
|
||||
|
|
||||
|
|
||||
|
/****************************************************************************/ |
||||
|
/* DAQ event information */ |
||||
|
/****************************************************************************/ |
||||
|
|
||||
|
#ifdef XCP_ENABLE_DAQ_EVENT_LIST |
||||
|
|
||||
|
#define XCP_MAX_EVENT_NAME 8 |
||||
|
|
||||
|
typedef struct { |
||||
|
char shortName[XCP_MAX_EVENT_NAME+1]; // A2L XCP IF_DATA short event name, long name not supported
|
||||
|
uint32_t size; // ext event size
|
||||
|
uint8_t timeUnit; // timeCycle unit, 1ns=0, 10ns=1, 100ns=2, 1us=3, ..., 1ms=6, ...
|
||||
|
uint8_t timeCycle; // cycletime in units, 0 = sporadic or unknown
|
||||
|
uint16_t sampleCount; // packed event sample count
|
||||
|
uint16_t daqList; // associated DAQ list
|
||||
|
uint8_t priority; // priority 0 = queued, 1 = pushing, 2 = realtime
|
||||
|
#ifdef XCP_ENABLE_MULTITHREAD_EVENTS |
||||
|
MUTEX mutex; |
||||
|
#endif |
||||
|
#ifdef XCP_ENABLE_TEST_CHECKS |
||||
|
uint64_t time; // last event time stamp
|
||||
|
#endif |
||||
|
} tXcpEvent; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/****************************************************************************/ |
||||
|
/* Protocol layer interface */ |
||||
|
/****************************************************************************/ |
||||
|
|
||||
|
/* Initialization for the XCP Protocol Layer */ |
||||
|
extern void XcpInit(void); |
||||
|
extern void XcpStart(void); |
||||
|
extern void XcpDisconnect(); |
||||
|
extern void XcpReset(); |
||||
|
|
||||
|
/* Trigger a XCP data acquisition or stimulation event */ |
||||
|
extern void XcpEvent(uint16_t event); |
||||
|
extern void XcpEventExt(uint16_t event, uint8_t* base); |
||||
|
extern void XcpEventAt(uint16_t event, uint64_t clock); |
||||
|
|
||||
|
/* XCP command processor */ |
||||
|
extern void XcpCommand( const uint32_t* pCommand, uint16_t len ); |
||||
|
|
||||
|
/* Send an XCP event message */ |
||||
|
extern void XcpSendEvent(uint8_t evc, const uint8_t* d, uint8_t l); |
||||
|
|
||||
|
/* Check status */ |
||||
|
extern BOOL XcpIsStarted(); |
||||
|
extern BOOL XcpIsConnected(); |
||||
|
extern BOOL XcpIsDaqRunning(); |
||||
|
extern BOOL XcpIsDaqEventRunning(uint16_t event); |
||||
|
extern uint64_t XcpGetDaqStartTime(); |
||||
|
extern uint32_t XcpGetDaqOverflowCount(); |
||||
|
|
||||
|
/* Time synchronisation */ |
||||
|
#ifdef XCP_ENABLE_DAQ_CLOCK_MULTICAST |
||||
|
extern uint16_t XcpGetClusterId(); |
||||
|
#endif |
||||
|
|
||||
|
// Event list
|
||||
|
#ifdef XCP_ENABLE_DAQ_EVENT_LIST |
||||
|
|
||||
|
#define XCP_INVALID_EVENT 0xFFFF |
||||
|
|
||||
|
// Clear event list
|
||||
|
extern void XcpClearEventList(); |
||||
|
// Add a measurement event to event list, return event number (0..MAX_EVENT-1)
|
||||
|
extern uint16_t XcpCreateEvent(const char* name, uint32_t cycleTimeNs /* ns */, uint8_t priority /* 0-normal, >=1 realtime*/, uint16_t sampleCount, uint32_t size); |
||||
|
// Get event list
|
||||
|
extern tXcpEvent* XcpGetEventList(uint16_t* eventCount); |
||||
|
// Lookup event
|
||||
|
extern tXcpEvent* XcpGetEvent(uint16_t event); |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/****************************************************************************/ |
||||
|
/* Protocol layer external dependencies */ |
||||
|
/****************************************************************************/ |
||||
|
|
||||
|
// All callback functions supplied by the application
|
||||
|
// Must be thread save
|
||||
|
|
||||
|
/* Callbacks on connect, measurement prepare, start and stop */ |
||||
|
extern BOOL ApplXcpConnect(); |
||||
|
#if XCP_PROTOCOL_LAYER_VERSION >= 0x0104 |
||||
|
extern BOOL ApplXcpPrepareDaq(); |
||||
|
#endif |
||||
|
extern BOOL ApplXcpStartDaq(); |
||||
|
extern void ApplXcpStopDaq(); |
||||
|
|
||||
|
/* Address conversions from A2L address to pointer and vice versa */ |
||||
|
/* Note that xcpAddrExt 0x01 and 0xFF are reserved for special use cases (0x01 if XCP_ENABLE_DYN_ADDRESSING, 0xFF if XCP_ENABLE_IDT_A2L_UPLOAD) */ |
||||
|
extern uint8_t* ApplXcpGetPointer(uint8_t xcpAddrExt, uint32_t xcpAddr); /* Create a pointer (uint8_t*) from xcpAddrExt and xcpAddr, returns NULL if no access */ |
||||
|
extern uint32_t ApplXcpGetAddr(uint8_t* p); // Calculate the xcpAddr address from a pointer
|
||||
|
extern uint8_t *ApplXcpGetBaseAddr(); // Get the base address for DAQ data access */
|
||||
|
/*
|
||||
|
Note 1: |
||||
|
For DAQ performance and memory optimization: |
||||
|
XCPlite DAQ tables do not store address extensions and do not use ApplXcpGetPointer(), addr is stored as 32 Bit value and access is hardcoded by *(baseAddr+xcpAddr) |
||||
|
All accesible DAQ data is within a 4GByte range starting at ApplXcpGetBaseAddr() |
||||
|
Address extensions to increase the addressable range are not supported yet |
||||
|
Attempting to setup an ODT entry with address extension != 0 gives a CRC_ACCESS_DENIED error message |
||||
|
|
||||
|
Note 2: |
||||
|
ApplXcpGetPointer may do address transformations according to active calibration page |
||||
|
When measuring calibration variables inswitch |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/* Switch calibration pages */ |
||||
|
#ifdef XCP_ENABLE_CAL_PAGE |
||||
|
extern uint8_t ApplXcpGetCalPage(uint8_t segment, uint8_t mode); |
||||
|
extern uint8_t ApplXcpSetCalPage(uint8_t segment, uint8_t page, uint8_t mode); |
||||
|
#endif |
||||
|
|
||||
|
/* DAQ clock */ |
||||
|
extern uint64_t ApplXcpGetClock64(); |
||||
|
|
||||
|
#define CLOCK_STATE_SYNCH_IN_PROGRESS (0) |
||||
|
#define CLOCK_STATE_SYNCH (1) |
||||
|
#define CLOCK_STATE_FREE_RUNNING (7) |
||||
|
#define CLOCK_STATE_GRANDMASTER_STATE_SYNCH (1 << 3) |
||||
|
extern uint8_t ApplXcpGetClockState(); |
||||
|
|
||||
|
#ifdef XCP_ENABLE_PTP |
||||
|
#define CLOCK_STRATUM_LEVEL_UNKNOWN 255 |
||||
|
#define CLOCK_STRATUM_LEVEL_ARB 16 // unsychronized
|
||||
|
#define CLOCK_STRATUM_LEVEL_UTC 0 // Atomic reference clock
|
||||
|
#define CLOCK_EPOCH_TAI 0 // Atomic monotonic time since 1.1.1970 (TAI)
|
||||
|
#define CLOCK_EPOCH_UTC 1 // Universal Coordinated Time (with leap seconds) since 1.1.1970 (UTC)
|
||||
|
#define CLOCK_EPOCH_ARB 2 // Arbitrary (epoch unknown)
|
||||
|
extern BOOL ApplXcpGetClockInfoGrandmaster(uint8_t* uuid, uint8_t* epoch, uint8_t* stratum); |
||||
|
#endif |
||||
|
|
||||
|
/* Get info for GET_ID command (pointer to and length of data) */ |
||||
|
/* Supports IDT_ASCII, IDT_ASAM_NAME, IDT_ASAM_PATH, IDT_ASAM_URL, IDT_ASAM_EPK and IDT_ASAM_UPLOAD */ |
||||
|
/* Returns 0 if not available */ |
||||
|
extern uint32_t ApplXcpGetId(uint8_t id, uint8_t* buf, uint32_t bufLen); |
||||
|
|
||||
|
/* Read a chunk (offset,size) of the A2L file for upload */ |
||||
|
/* Return FALSE if out of bounds */ |
||||
|
#ifdef XCP_ENABLE_IDT_A2L_UPLOAD // Enable A2L content upload to host (IDT_ASAM_UPLOAD)
|
||||
|
extern BOOL ApplXcpReadA2L(uint8_t size, uint32_t offset, uint8_t* data); |
||||
|
#endif |
||||
|
|
||||
@ -0,0 +1,32 @@ |
|||||
|
#pragma once |
||||
|
/* xcpTl.h */ |
||||
|
|
||||
|
/* Copyright(c) Vector Informatik GmbH.All rights reserved.
|
||||
|
Licensed under the MIT license.See LICENSE file in the project root for details. */ |
||||
|
|
||||
|
#define XCPTL_TIMEOUT_INFINITE 0xFFFFFFFF // Infinite timeout (blocking mode) for XcpTlHandleCommands, XcpTlWaitForTransmitData
|
||||
|
|
||||
|
|
||||
|
/* Transport Layer functions called by XCPlite.c */ |
||||
|
extern BOOL XcpTlHandleCommands(uint32_t timeout_ms); // Handle all incoming XCP commands, (wait for at least timeout_ms)
|
||||
|
extern void XcpTlSendCrm(const uint8_t* data, uint16_t n); // Send or queue (depending on XCPTL_QUEUED_CRM) a command response
|
||||
|
extern uint8_t* XcpTlGetTransmitBuffer(void** par, uint16_t size); // Get a buffer for a message with size
|
||||
|
extern void XcpTlCommitTransmitBuffer(void* par, BOOL flush); // Commit a buffer (by handle returned from XcpTlGetTransmitBuffer)
|
||||
|
extern void XcpTlFlushTransmitBuffer(); // Finalize the current transmit packet (ETH only)
|
||||
|
extern void XcpTlWaitForTransmitQueueEmpty(); // Wait (sleep) until transmit queue is empty
|
||||
|
|
||||
|
/* Generic transport Layer functions called by application */ |
||||
|
/* All other application functions functions declared in xcpCanTl.h or xcpEthTl.h */ |
||||
|
extern int32_t XcpTlHandleTransmitQueue(); // Send all outgoing packets in the transmit queue
|
||||
|
extern BOOL XcpTlWaitForTransmitData(uint32_t timeout_ms); // Wait for at least timeout_ms, until packets are pending in the transmit queue
|
||||
|
extern void XcpTlShutdown(); |
||||
|
|
||||
|
// Get last error code
|
||||
|
#define XCPTL_OK 0 |
||||
|
#define XCPTL_ERROR_WOULD_BLOCK 1 |
||||
|
#define XCPTL_ERROR_SEND_FAILED 2 |
||||
|
#define XCPTL_ERROR_INVALID_MASTER 3 |
||||
|
extern int32_t XcpTlGetLastError(); |
||||
|
|
||||
|
// Get transmit queue level
|
||||
|
extern int32_t XcpTlGetTransmitQueueLevel(); |
||||
@ -0,0 +1,104 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
/*----------------------------------------------------------------------------
|
||||
|
| File: |
||||
|
| xcp_cfg.h |
||||
|
| |
||||
|
| Description: |
||||
|
| User configuration file for XCP protocol layer parameters |
||||
|
| |
||||
|
| Code released into public domain, no attribution required |
||||
|
| |
||||
|
----------------------------------------------------------------------------*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*----------------------------------------------------------------------------*/ |
||||
|
/* Version */ |
||||
|
|
||||
|
// Driver version (GET_COMM_MODE_INFO)
|
||||
|
#define XCP_DRIVER_VERSION 0x01 |
||||
|
|
||||
|
// Protocol layer version
|
||||
|
// #define XCP_PROTOCOL_LAYER_VERSION 0x0101
|
||||
|
#define XCP_PROTOCOL_LAYER_VERSION 0x0103 // GET_DAQ_CLOCK_MULTICAST, GET_TIME_CORRELATION_PROPERTIES
|
||||
|
// #define XCP_PROTOCOL_LAYER_VERSION 0x0104 // PACKED_MODE, CC_START_STOP_SYNCH prepare
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*----------------------------------------------------------------------------*/ |
||||
|
/* Driver features */ |
||||
|
|
||||
|
#define XCP_TRANSPORT_LAYER_TYPE XCP_TRANSPORT_LAYER_ETH // Enable ethernet specific commands
|
||||
|
|
||||
|
#if OPTION_ENABLE_XCP_CLASS |
||||
|
#define XCP_ENABLE_DYN_ADDRESSING // Enable addr_ext=1 indicating relative addr format (event<<16)|offset
|
||||
|
#endif |
||||
|
|
||||
|
/*----------------------------------------------------------------------------*/ |
||||
|
/* Protocol features */ |
||||
|
|
||||
|
//#define XCP_ENABLE_INTERLEAVED
|
||||
|
//#define XCP_INTERLEAVED_QUEUE_SIZE 16
|
||||
|
|
||||
|
#define XCP_ENABLE_CHECKSUM // Enable checksum calculation command
|
||||
|
|
||||
|
#define XCP_ENABLE_CAL_PAGE // Enable cal page switch
|
||||
|
|
||||
|
|
||||
|
/*----------------------------------------------------------------------------*/ |
||||
|
/* GET_ID command */ |
||||
|
|
||||
|
#if OPTION_ENABLE_A2L_GEN |
||||
|
#define XCP_ENABLE_IDT_A2L_UPLOAD // Upload A2L via XCP UPLOAD
|
||||
|
#endif |
||||
|
|
||||
|
/*----------------------------------------------------------------------------*/ |
||||
|
/* DAQ features and parameters */ |
||||
|
|
||||
|
// #define XCP_ENABLE_DAQ_EVENT_INFO // Enable XCP_GET_EVENT_INFO, if this is enabled, A2L file event information will be ignored
|
||||
|
#define XCP_ENABLE_DAQ_EVENT_LIST // Enable event list
|
||||
|
#define XCP_MAX_EVENT 256 // Maximum number of events, size of event table
|
||||
|
#define XCP_ENABLE_MULTITHREAD_EVENTS // Make XcpEvent thread safe also for same event from different thread
|
||||
|
// #define XCP_ENABLE_PACKED_MODE // Enable packed mode emulation
|
||||
|
|
||||
|
#define XCP_DAQ_MEM_SIZE (5*100) // Amount of memory for DAQ tables, each ODT entry (e.g. measurement variable) needs 5 bytes
|
||||
|
|
||||
|
// CLOCK_USE_UTC_TIME_NS
|
||||
|
// Settings for 64 bit ns since 1.1.1970 TAI clock (CLOCK_USE_UTC_TIME_NS)
|
||||
|
|
||||
|
#define XCP_DAQ_CLOCK_64BIT // Use 64 Bit time stamps in GET_DAQ_CLOCK
|
||||
|
#define XCP_DAQ_CLOCK_UIID { 0xdc,0xa6,0x32,0xFF,0xFE,0x7e,0x66,0xdc } |
||||
|
|
||||
|
// Server DAQ clock info (mandatory)
|
||||
|
#define XCP_TIMESTAMP_UNIT DAQ_TIMESTAMP_UNIT_1NS // unit DAQ_TIMESTAMP_UNIT_xxx
|
||||
|
#define XCP_TIMESTAMP_TICKS 1 // ticks per unit
|
||||
|
#define XCP_TIMESTAMP_EPOCH XCP_EPOCH_TAI |
||||
|
|
||||
|
// Grandmaster clock (optional, use XcpSetGrandmasterClockInfo, implement ApplXcpGetClockInfoGrandmaster)
|
||||
|
// #define XCP_ENABLE_PTP
|
||||
|
|
||||
|
|
||||
|
//#define XCP_ENABLE_DAQ_CLOCK_MULTICAST // Enable GET_DAQ_CLOCK_MULTICAST
|
||||
|
#ifdef XCP_ENABLE_DAQ_CLOCK_MULTICAST |
||||
|
// XCP default cluster id (multicast addr 239,255,0,1, group 127,0,1 (mac 01-00-5E-7F-00-01)
|
||||
|
#define XCP_MULTICAST_CLUSTER_ID 1 |
||||
|
#endif |
||||
|
|
||||
|
#define XCP_TIMESTAMP_TICKS_S CLOCK_TICKS_PER_S // ticks per s (for debug output)
|
||||
|
|
||||
|
|
||||
|
//-------------------------------------------------------------------------------
|
||||
|
// Debug
|
||||
|
|
||||
|
// Debug console prints
|
||||
|
#if OPTION_ENABLE_DBG_PRINTS |
||||
|
#define XCP_ENABLE_DEBUG_PRINTS |
||||
|
#define XCP_DBG_LEVEL XCP_DEBUG_LEVEL |
||||
|
#endif |
||||
|
|
||||
|
// Enable extended error checks, performance penalty !!!
|
||||
|
#define XCP_ENABLE_TEST_CHECKS |
||||
|
|
||||
@ -0,0 +1,70 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
/*----------------------------------------------------------------------------
|
||||
|
| File: |
||||
|
| xcptl_cfg.h |
||||
|
| |
||||
|
| Description: |
||||
|
| User configuration file for XCP transport layer parameters |
||||
|
| |
||||
|
| Code released into public domain, no attribution required |
||||
|
| |
||||
|
----------------------------------------------------------------------------*/ |
||||
|
|
||||
|
// Transport layer
|
||||
|
#define XCP_TRANSPORT_LAYER_TYPE XCP_TRANSPORT_LAYER_ETH |
||||
|
#define XCP_TRANSPORT_LAYER_VERSION 0x0104 |
||||
|
|
||||
|
// TCP or/and UDP option enabled
|
||||
|
#define XCPTL_ENABLE_TCP |
||||
|
#define XCPTL_ENABLE_UDP |
||||
|
|
||||
|
// Transmit mode
|
||||
|
#define XCPTL_QUEUED_CRM // Use transmit queue for command responces
|
||||
|
/*
|
||||
|
Benefits: |
||||
|
- Unique transport layers message counters for CRM and DTO (CANape default transport layer option is "include command response") |
||||
|
- Transmit queue empty before DAQ is stopped (end of measurement consistent for all event channels) |
||||
|
- socketSendTo needs not to be thread safe for a socket |
||||
|
Drawbacks: |
||||
|
- Increased latency for GET_DAQ_CLOCK response during DAQ running, which impacts time sync quality if XCP 1.3 trigger initiator "sampled on reception" is not supported |
||||
|
- Impact on DAQ performance because transport layer packet is flushed for command responses |
||||
|
- DAQ queue overflow can happen on command responses, CANape aborts when response to GET_DAQ_CLOCK is missing |
||||
|
*/ |
||||
|
|
||||
|
// Transport layer header size
|
||||
|
// This is fixed, no other options supported
|
||||
|
#define XCPTL_TRANSPORT_LAYER_HEADER_SIZE 4 |
||||
|
|
||||
|
// TL segment size and DTO size
|
||||
|
// Segment size is the maximum data buffer size given to send/sendTo, for UDP it is the MTU
|
||||
|
#define XCPTL_MAX_SEGMENT_SIZE (OPTION_MTU-20-8) // UDP MTU (MTU - IP-header - UDP-header)
|
||||
|
#define XCPTL_MAX_DTO_SIZE (XCPTL_MAX_SEGMENT_SIZE-XCPTL_TRANSPORT_LAYER_HEADER_SIZE) // Normal ETH frame MTU - IPhdr - UDPhdr- XCPhdr, DTO size must be mod 4
|
||||
|
#define XCPTL_PACKET_ALIGNMENT 4 // Packet alignment for multiple XCP transport layer packets in a XCP transport layer message
|
||||
|
|
||||
|
// CTO size
|
||||
|
// Maximum size of a XCP command
|
||||
|
#define XCPTL_MAX_CTO_SIZE 252 // must be mod 4
|
||||
|
|
||||
|
// DAQ transmit queue
|
||||
|
// Transmit queue size in segments, should at least be able to hold all data produced until the next call to HandleTransmitQueue
|
||||
|
#define XCPTL_QUEUE_SIZE 64 // array[XCPTL_QUEUE_SIZE] of tXcpMessageBuffer (XCPTL_MAX_SEGMENT_SIZE+4)
|
||||
|
// Maximum queue trigger event rate
|
||||
|
#define XCPTL_QUEUE_TRANSMIT_CYCLE_TIME (1*CLOCK_TICKS_PER_MS) |
||||
|
// Flush cycle
|
||||
|
#define XCPTL_QUEUE_FLUSH_CYCLE_MS 50 // Send a DTO packet at least every x ms, XCPTL_TIMEOUT_INFINITE to turn off
|
||||
|
|
||||
|
// Transport layer header size
|
||||
|
// This is fixed, no other options supported
|
||||
|
#define XCPTL_TRANSPORT_LAYER_HEADER_SIZE 4 |
||||
|
|
||||
|
// Multicast (GET_DAQ_CLOCK_MULTICAST)
|
||||
|
// Use multicast time synchronisation to improve synchronisation of multiple XCP slaves
|
||||
|
// This is standard in XCP V1.3, but it needs to create an additional thread and socket for multicast reception
|
||||
|
// Has no benefit with PTP time synchronized slave and is just unnesserary effort
|
||||
|
// CANape expects this by default -> adjust setting in device/protocol/event/TIME_CORRELATION_GETDAQCLOCK from "multicast" to "extended response" to switch it of
|
||||
|
//#define XCPTL_ENABLE_MULTICAST
|
||||
|
#ifdef XCPTL_ENABLE_MULTICAST |
||||
|
#define XCPTL_MULTICAST_PORT 5557 |
||||
|
#endif |
||||
|
|
||||
Loading…
Reference in new issue