|
|
|
|
|
|
|
|
|
// IncSourceTestDlgDlg.cpp: 구현 파일
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#include "pch.h"
|
|
|
|
|
#include "framework.h"
|
|
|
|
|
#include "IncSourceTestDlg.h"
|
|
|
|
|
#include "IncSourceTestDlgDlg.h"
|
|
|
|
|
#include "DlgProxy.h"
|
|
|
|
|
#include "afxdialogex.h"
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include "intelhex.h"
|
|
|
|
|
#include "elfio.hpp"
|
|
|
|
|
#include "elfio_dump.hpp"
|
|
|
|
|
|
|
|
|
|
#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 대화 상자입니다.
|
|
|
|
|
|
|
|
|
|
class CAboutDlg : public CDialogEx
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CAboutDlg();
|
|
|
|
|
|
|
|
|
|
// 대화 상자 데이터입니다.
|
|
|
|
|
#ifdef AFX_DESIGN_TIME
|
|
|
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
|
|
|
|
|
|
|
|
|
|
// 구현입니다.
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CIncSourceTestDlgDlg 대화 상자
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IMPLEMENT_DYNAMIC(CIncSourceTestDlgDlg, CDialogEx);
|
|
|
|
|
|
|
|
|
|
CIncSourceTestDlgDlg::CIncSourceTestDlgDlg(CWnd* pParent /*=nullptr*/)
|
|
|
|
|
: CDialogEx(IDD_INCSOURCETESTDLG_DIALOG, pParent)
|
|
|
|
|
{
|
|
|
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
|
|
|
m_pAutoProxy = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CIncSourceTestDlgDlg::~CIncSourceTestDlgDlg()
|
|
|
|
|
{
|
|
|
|
|
// 이 대화 상자에 대한 자동화 프록시가 있을 경우 이 대화 상자에 대한
|
|
|
|
|
// 후방 포인터를 null로 설정하여
|
|
|
|
|
// 대화 상자가 삭제되었음을 알 수 있게 합니다.
|
|
|
|
|
if (m_pAutoProxy != nullptr)
|
|
|
|
|
m_pAutoProxy->m_pDialog = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
|
|
{
|
|
|
|
|
CDialogEx::DoDataExchange(pDX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CIncSourceTestDlgDlg, CDialogEx)
|
|
|
|
|
ON_WM_SYSCOMMAND()
|
|
|
|
|
ON_WM_CLOSE()
|
|
|
|
|
ON_WM_PAINT()
|
|
|
|
|
ON_WM_QUERYDRAGICON()
|
|
|
|
|
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CIncSourceTestDlgDlg::OnBnClickedButtonOpen)
|
|
|
|
|
ON_BN_CLICKED(IDC_BUTTON_ELF, &CIncSourceTestDlgDlg::OnBnClickedButtonElf)
|
|
|
|
|
ON_BN_CLICKED(IDC_BUTTON_HEX, &CIncSourceTestDlgDlg::OnBnClickedButtonHex)
|
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CIncSourceTestDlgDlg 메시지 처리기
|
|
|
|
|
|
|
|
|
|
BOOL CIncSourceTestDlgDlg::OnInitDialog()
|
|
|
|
|
{
|
|
|
|
|
CDialogEx::OnInitDialog();
|
|
|
|
|
|
|
|
|
|
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
|
|
|
|
|
|
|
|
|
|
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
|
|
|
|
|
// 프레임워크가 이 작업을 자동으로 수행합니다.
|
|
|
|
|
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
|
|
|
|
|
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
|
|
|
|
|
|
|
|
|
|
// TODO: 여기에 추가 초기화 작업을 추가합니다.
|
|
|
|
|
|
|
|
|
|
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
|
|
|
{
|
|
|
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
|
|
|
|
{
|
|
|
|
|
CAboutDlg dlgAbout;
|
|
|
|
|
dlgAbout.DoModal();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CDialogEx::OnSysCommand(nID, lParam);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
|
|
|
|
|
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 애플리케이션의 경우에는
|
|
|
|
|
// 프레임워크에서 이 작업을 자동으로 수행합니다.
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnPaint()
|
|
|
|
|
{
|
|
|
|
|
if (IsIconic())
|
|
|
|
|
{
|
|
|
|
|
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
|
|
|
|
|
|
|
|
|
|
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
|
|
|
|
|
|
|
|
|
|
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
// 아이콘을 그립니다.
|
|
|
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CDialogEx::OnPaint();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
|
|
|
|
|
// 이 함수를 호출합니다.
|
|
|
|
|
HCURSOR CIncSourceTestDlgDlg::OnQueryDragIcon()
|
|
|
|
|
{
|
|
|
|
|
return static_cast<HCURSOR>(m_hIcon);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 컨트롤러에서 해당 개체 중 하나를 계속 사용하고 있을 경우
|
|
|
|
|
// 사용자가 UI를 닫을 때 자동화 서버를 종료하면 안 됩니다. 이들
|
|
|
|
|
// 메시지 처리기는 프록시가 아직 사용 중인 경우 UI는 숨기지만,
|
|
|
|
|
// UI가 표시되지 않아도 대화 상자는
|
|
|
|
|
// 남겨 둡니다.
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnClose()
|
|
|
|
|
{
|
|
|
|
|
if (CanExit())
|
|
|
|
|
CDialogEx::OnClose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnOK()
|
|
|
|
|
{
|
|
|
|
|
if (CanExit())
|
|
|
|
|
CDialogEx::OnOK();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnCancel()
|
|
|
|
|
{
|
|
|
|
|
if (CanExit())
|
|
|
|
|
CDialogEx::OnCancel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CIncSourceTestDlgDlg::CanExit()
|
|
|
|
|
{
|
|
|
|
|
// 프록시 개체가 계속 남아 있으면 자동화 컨트롤러에서는
|
|
|
|
|
// 이 애플리케이션을 계속 사용합니다. 대화 상자는 남겨 두지만
|
|
|
|
|
// 해당 UI는 숨깁니다.
|
|
|
|
|
if (m_pAutoProxy != nullptr)
|
|
|
|
|
{
|
|
|
|
|
ShowWindow(SW_HIDE);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnBnClickedButtonOpen()
|
|
|
|
|
{
|
|
|
|
|
// 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 CIncSourceTestDlgDlg::loadA2lFile(std::string strFilePath)
|
|
|
|
|
{
|
|
|
|
|
std::string strLogData;
|
|
|
|
|
|
|
|
|
|
bool bIsFileExist = false;
|
|
|
|
|
try {
|
|
|
|
|
bIsFileExist = std::filesystem::exists(strFilePath);
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& error) {
|
|
|
|
|
std::cout << "Failed to fetch the A2l test files. Error: "
|
|
|
|
|
<< error.what();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
a2l::A2lFile file;
|
|
|
|
|
file.Filename(strFilePath.data());
|
|
|
|
|
const auto parse = file.ParseFile();
|
|
|
|
|
if (parse)
|
|
|
|
|
std::cout << file.LastError() << " : " << strFilePath.data();
|
|
|
|
|
std::cout << file.Name() << (parse ? " : OK" : " : FAIL") << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(strFilePath.data());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//if (file.A2lVersion().VersionNo == 1)
|
|
|
|
|
// ;
|
|
|
|
|
std::cout << file.A2lVersion().VersionNo << " : " << file.A2lVersion().VersionNo;
|
|
|
|
|
AddLogString(string_format("file.A2lVersion().VersionNo : %d", file.A2lVersion().VersionNo));
|
|
|
|
|
|
|
|
|
|
//if (file.A2lVersion().UpgradeNo == 71)
|
|
|
|
|
// ;
|
|
|
|
|
std::cout << file.A2lVersion().UpgradeNo << " : " << file.A2lVersion().UpgradeNo;
|
|
|
|
|
AddLogString(string_format("file.A2lVersion().UpgradeNo : %d", file.A2lVersion().UpgradeNo));
|
|
|
|
|
|
|
|
|
|
const auto& project = file.Project();
|
|
|
|
|
|
|
|
|
|
const auto& header = project.Header();
|
|
|
|
|
//EXPECT_FALSE(header.Comment.empty());
|
|
|
|
|
//EXPECT_FALSE(header.ProjectNo.empty());
|
|
|
|
|
//EXPECT_FALSE(header.VersionNo.empty());
|
|
|
|
|
std::cout << header.Comment << " : " << header.Comment;
|
|
|
|
|
AddLogString(string_format("header.Comment : %s", header.Comment.c_str()));
|
|
|
|
|
std::cout << header.ProjectNo << " : " << header.ProjectNo;
|
|
|
|
|
AddLogString(string_format("header.ProjectNo : %s", header.ProjectNo.c_str()));
|
|
|
|
|
std::cout << header.VersionNo << " : " << header.VersionNo;
|
|
|
|
|
AddLogString(string_format("header.VersionNo : %s", header.VersionNo.c_str()));
|
|
|
|
|
|
|
|
|
|
const auto& module_list = project.Modules();
|
|
|
|
|
//ASSERT_EQ(module_list.size(), 1);
|
|
|
|
|
std::cout << module_list.size() << " : " << module_list.size();
|
|
|
|
|
AddLogString(string_format("module_list.size() : %d", module_list.size()));
|
|
|
|
|
|
|
|
|
|
if (module_list.size() > 0) {
|
|
|
|
|
|
|
|
|
|
const auto& module = module_list.cbegin()->second;
|
|
|
|
|
//ASSERT_TRUE(module);
|
|
|
|
|
|
|
|
|
|
//EXPECT_STREQ(module->Name().c_str(), "Example");
|
|
|
|
|
//EXPECT_FALSE(module->A2ml().empty());
|
|
|
|
|
AddLogString(string_format("module->Name() : %s", module->Name().c_str()));
|
|
|
|
|
AddLogString(string_format("module->A2ml() : %s", module->A2ml().c_str()));
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& modPar = module->ModPar();
|
|
|
|
|
AddLogString(string_format("modPar.Comment() : %s", modPar.Comment.c_str()));
|
|
|
|
|
AddLogString(string_format("modPar.epk : %s", modPar.Epk.c_str()));
|
|
|
|
|
AddLogString(string_format("modPar.addr_epk size : %d", modPar.AddressEpkList.size()));
|
|
|
|
|
for (int i = 0; i < modPar.AddressEpkList.size(); i++) {
|
|
|
|
|
AddLogString(string_format("modPar.addr_epk (%d) addr (0x%X)", i, modPar.AddressEpkList.at(i)));
|
|
|
|
|
}
|
|
|
|
|
AddLogString(string_format("modPar.memory layout size : %d", modPar.MemoryLayoutList.size()));
|
|
|
|
|
/*
|
|
|
|
|
for (int i = 0; i < modPar.MemoryLayoutList.size(); i++) {
|
|
|
|
|
AddLogString(string_format("modPar.MemoryLayoutList (%d) addr (0x%X)", i, modPar.MemoryLayoutList.at(i)));
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format("modPar.memory segment size : %d", modPar.MemorySegmentList.size()));
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < modPar.MemorySegmentList.size(); i++) {
|
|
|
|
|
AddLogString(string_format("(%d) modPar.Memory sement description=[%s] segment_type=[%d] memory_type=[%d] attribution=[%d] addr (0x%X) size(0x%X) offset_list=[%d] ifDataList=[%d]",
|
|
|
|
|
i, modPar.MemorySegmentList.at(i).Description.c_str(), modPar.MemorySegmentList.at(i).SegmentType, modPar.MemorySegmentList.at(i).MemoryType,
|
|
|
|
|
modPar.MemorySegmentList.at(i).Attribute, modPar.MemorySegmentList.at(i).Address, modPar.MemorySegmentList.at(i).Size,
|
|
|
|
|
modPar.MemorySegmentList.at(i).OffsetList.size(), modPar.MemorySegmentList.at(i).IfDataList.size()));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& modComm = module->ModCommon();
|
|
|
|
|
AddLogString(string_format("modComm.Comment() : %s", modComm.Comment.c_str()));
|
|
|
|
|
AddLogString(string_format("modComm.Deposit : %d", modComm.Deposit));
|
|
|
|
|
AddLogString(string_format("modComm.ByteOrder : %d", modComm.ByteOrder));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentByte : %d", modComm.AlignmentByte));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentFloat16 : %d", modComm.AlignmentFloat16));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentFloat32 : %d", modComm.AlignmentFloat32));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentFloat64 : %d", modComm.AlignmentFloat64));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentInt64 : %d", modComm.AlignmentInt64));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentLong : %d", modComm.AlignmentLong));
|
|
|
|
|
AddLogString(string_format("modComm.AlignmentWord : %d", modComm.AlignmentWord));
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
for (const auto& [protocol, if_data] : module->IfDatas()) {
|
|
|
|
|
a2l::IfDataBlock block(if_data);
|
|
|
|
|
//EXPECT_TRUE(block.IsOk()) << block.LastError();
|
|
|
|
|
std::cout << block.AsString() << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format("IF_DATA : %s", block.Protocol().c_str()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format("block.ItemList().size() : %d", block.ItemList().size()));
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < block.ItemList().size(); i++) {
|
|
|
|
|
AddLogString(string_format("%d block.ItemList() : %s", i, block.ItemList()[i].BlockName.c_str()));
|
|
|
|
|
AddLogString(string_format("block.ItemList()[i].ItemList.size() : %d", block.ItemList()[i].ItemList.size()));
|
|
|
|
|
|
|
|
|
|
// 1. protocol layer
|
|
|
|
|
if (block.ItemList()[i].BlockName == "PROTOCOL_LAYER") {
|
|
|
|
|
for (int j = 0; j < block.ItemList()[i].ItemList.size(); j++) {
|
|
|
|
|
|
|
|
|
|
TRACE("[%d] %s\n", j, block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0: // version
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nXCPProtocolVersion = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 1: // t1
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T1 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 2: // t2
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T2 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 3: // t3
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T3 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 4: // t4
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T4 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 5: // t5
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T5 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 6: // t6
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T6 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 7: // t7
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nTimeout_T7 = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 8: // max cto
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_cMAX_CTO = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case 9: // max dto
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nMAX_DTO = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default: // optional command
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "BYTE_ORDER_MSB_LAST") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nByteOrderMSBType = A2L_BYTE_ORDER_MSB_TYPE::BYTE_ORDER_MSB_LAST;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "BYTE_ORDER_MSB_FIRST") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nByteOrderMSBType = A2L_BYTE_ORDER_MSB_TYPE::BYTE_ORDER_MSB_FIRST;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_GRANULARITY_BYTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nAddressGranularityType = A2L_ADDRESS_GRANULARITY_TYPE::ADDRESS_GRANULARITY_BYTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_GRANULARITY_WORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nAddressGranularityType = A2L_ADDRESS_GRANULARITY_TYPE::ADDRESS_GRANULARITY_WORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_GRANULARITY_DWORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nAddressGranularityType = A2L_ADDRESS_GRANULARITY_TYPE::ADDRESS_GRANULARITY_DWORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIONAL_CMD") {
|
|
|
|
|
j++;
|
|
|
|
|
TRACE("[%d] %s\n", j, block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "GET_COMM_MODE_INFO") { // 0xFB
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_COMM_MODE_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_ID") { // 0xFA
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_ID);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_REQUEST") { // 0xF9
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_REQUEST);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_SEED") { // 0xF8
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_SEED);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNLOCK") { // 0xF7
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::UNLOCK);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_MTA") { // 0xF6
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_MTA);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UPLOAD") { // 0xF5
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::UPLOAD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SHORT_UPLOAD") { // 0xF4
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SHORT_UPLOAD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "BUILD_CHECKSUM") { // 0xF3
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::BUILD_CHECKSUM);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "TRANSPORT_LAYER_CMD") { // 0xF2
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::TRANSPORT_LAYER_CMD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "USER_CMD") { // 0xF1
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::USER_CMD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DOWNLOAD") { // 0xF0
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::DOWNLOAD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DOWNLOAD") { // 0xF0
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::DOWNLOAD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DOWNLOAD_NEXT") { // 0xEF
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::DOWNLOAD_NEXT);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DOWNLOAD_MAX") { // 0xEE
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::DOWNLOAD_MAX);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SHORT_DOWNLOAD") { // 0xED
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SHORT_DOWNLOAD);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "MODIFY_BITS") { // 0xEC
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::MODIFY_BITS);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_CAL_PAGE") { // 0xEB
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_CAL_PAGE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_CAL_PAGE") { // 0xEA
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_CAL_PAGE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_PAG_PROCESSOR_INFO") { // 0xE9
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_PAG_PROCESSOR_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_SEGMENT_INFO") { // 0xE8
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_SEGMENT_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_PAGE_INFO") { // 0xE7
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_PAGE_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_SEGMENT_MODE") { // 0xE6
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_SEGMENT_MODE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_SEGMENT_MODE") { // 0xE5
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_SEGMENT_MODE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "COPY_CAL_PAGE") { // 0xE4
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::COPY_CAL_PAGE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_DAQ_PTR") { // 0xE2
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_DAQ_PTR);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "WRITE_DAQ") { // 0xE1
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::WRITE_DAQ);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SET_DAQ_LIST_MODE") { // 0xE0
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_DAQ_LIST_MODE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_LIST_MODE") { // 0xDF
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_LIST_MODE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "START_STOP_DAQ_LIST") { // 0xDE
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::START_STOP_DAQ_LIST);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "START_STOP_SYNCH") { // 0xDD
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::START_STOP_SYNCH);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_CLOCK") { // 0xDC
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_CLOCK);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "READ_DAQ") { // 0xDB
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::READ_DAQ);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_PROCESSOR_INFO") { // 0xDA
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_PROCESSOR_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_RESOLUTION_INFO") { // 0xD9
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_RESOLUTION_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_LIST_INFO") { // 0xD8
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_LIST_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_DAQ_EVENT_INFO") { // 0xD7
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_DAQ_EVENT_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "FREE_DAQ") { // 0xD6
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::FREE_DAQ);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ALLOC_DAQ") { // 0xD5
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::ALLOC_DAQ);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ALLOC_ODT") { // 0xD4
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::ALLOC_ODT);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ALLOC_ODT_ENTRY") { // 0xD3
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::ALLOC_ODT_ENTRY);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_START") { // 0xD2
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_START);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_CLEAR") { // 0xD1
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_CLEAR);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM") { // 0xD0
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_RESET") { // 0xCF
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_RESET);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_PGM_PROCESSOR_INFO") { // 0xCE
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_PGM_PROCESSOR_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GET_SECTOR_INFO") { // 0xCD
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::GET_SECTOR_INFO);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_PREPARE") { // 0xCC
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_PREPARE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_FORMAT") { // 0xCB
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_NEXT") { // 0xCA
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_NEXT);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DOWNLOAD_NEXT") { // 0xEF
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::SET_DAQ_LIST_MODE);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_MAX") { // 0xC9
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_MAX);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "PROGRAM_VERIFY") { // 0xC8
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::PROGRAM_VERIFY);
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "WRITE_DAQ_MULTIPLE") { // 0xC7
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_nOptionalCommandList.push_back(A2L_OPTIONAL_COMMAND_TYPE::WRITE_DAQ_MULTIPLE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "COMMUNICATION_MODE_SUPPORTED") {
|
|
|
|
|
j++;
|
|
|
|
|
TRACE("[%d] %s\n", j, block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "BLOCK") {
|
|
|
|
|
j++;
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "SLAVE") {
|
|
|
|
|
j++;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "MASTER") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_stCommunicationModeSupported.m_cMaster_MAX_BS = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_stCommunicationModeSupported.m_cMaster_MIN_ST = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SEED_AND_KEY_EXTERNAL_FUNCTION") {
|
|
|
|
|
j++;
|
|
|
|
|
TRACE("[%d] %s\n", j, block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stProtocolLayer.m_strSeedAndKeyExternalFunction = block.ItemList()[i].ItemList[j].Value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 3. DAQ
|
|
|
|
|
if (block.ItemList()[i].BlockName == "DAQ") {
|
|
|
|
|
for (int j = 0; j < block.ItemList()[i].ItemList.size(); j++) {
|
|
|
|
|
|
|
|
|
|
TRACE("[%d] %s\n", j, block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0: // mode
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "STATIC") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nDaqMode = A2L_DAQ_MODE_TYPE::STATIC;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DYNAMIC") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nDaqMode = A2L_DAQ_MODE_TYPE::DYNAMIC;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 1://max daq
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nMaxDaq = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 2://max event channel
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nMaxEventChannel = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 3://min daq
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_cMinDaq = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 4://optimisation type
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_DEFAULT") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_DEFAULT;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_ODT_TYPE_16") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_ODT_TYPE_16;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_ODT_TYPE_32") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_ODT_TYPE_32;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_ODT_TYPE_64") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_ODT_TYPE_64;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_ODT_TYPE_ALIGNMENT") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_ODT_TYPE_ALIGNMENT;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OPTIMISATION_TYPE_MAX_ENTRY_SIZE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOptimisationType = A2L_DAQ_OPTIMISATION_TYPE::OPTIMISATION_TYPE_MAX_ENTRY_SIZE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 5://address extemtopm type
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_EXTENSION_FREE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nAddressExtention = A2L_DAQ_ADDRESS_EXTENSION::ADDRESS_EXTENSION_FREE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_EXTENSION_ODT") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nAddressExtention = A2L_DAQ_ADDRESS_EXTENSION::ADDRESS_EXTENSION_ODT;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "ADDRESS_EXTENSION_DAQ") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nAddressExtention = A2L_DAQ_ADDRESS_EXTENSION::ADDRESS_EXTENSION_DAQ;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 6://identification type
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "IDENTIFICATION_FIELD_TYPE_ABSOLUTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nIdentificationFieldType = A2L_DAQ_IDENTIFICATION_FIELD_TYPE::IDENTIFICATION_FIELD_TYPE_ABSOLUTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "IDENTIFICATION_FIELD_TYPE_RELATIVE_BYTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nIdentificationFieldType = A2L_DAQ_IDENTIFICATION_FIELD_TYPE::IDENTIFICATION_FIELD_TYPE_RELATIVE_BYTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nIdentificationFieldType = A2L_DAQ_IDENTIFICATION_FIELD_TYPE::IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD_ALIGNED") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nIdentificationFieldType = A2L_DAQ_IDENTIFICATION_FIELD_TYPE::IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD_ALIGNED;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 7://granularityodt type
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nGranularityOdtSize = A2L_DAQ_GRANULARITY_ODT_ENTRY_SIZE::GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_DAQ_WORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nGranularityOdtSize = A2L_DAQ_GRANULARITY_ODT_ENTRY_SIZE::GRANULARITY_ODT_ENTRY_SIZE_DAQ_WORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_DAQ_DWORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nGranularityOdtSize = A2L_DAQ_GRANULARITY_ODT_ENTRY_SIZE::GRANULARITY_ODT_ENTRY_SIZE_DAQ_DWORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_DAQ_DLONG") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nGranularityOdtSize = A2L_DAQ_GRANULARITY_ODT_ENTRY_SIZE::GRANULARITY_ODT_ENTRY_SIZE_DAQ_DLONG;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 8://MAX_ODT_ENTRY_SIZE_DAQ
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_cMaxOdtEntrySize = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 9://OverloadIndication
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "NO_OVERLOAD_INDICATION") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOverloadIndication = A2L_OverloadIndication::NO_OVERLOAD_INDICATION;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OVERLOAD_INDICATION_PID") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOverloadIndication = A2L_OverloadIndication::OVERLOAD_INDICATION_PID;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "OVERLOAD_INDICATION_EVENT") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nOverloadIndication = A2L_OverloadIndication::OVERLOAD_INDICATION_EVENT;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "STIM") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_bIsUse = true;
|
|
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_STIM_BYTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_nGranularityOdtEntrySizeStim = A2L_GranularityOdtEntrySizeStim::GRANULARITY_ODT_ENTRY_SIZE_STIM_BYTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_STIM_WORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_nGranularityOdtEntrySizeStim = A2L_GranularityOdtEntrySizeStim::GRANULARITY_ODT_ENTRY_SIZE_STIM_WORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_STIM_DWORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_nGranularityOdtEntrySizeStim = A2L_GranularityOdtEntrySizeStim::GRANULARITY_ODT_ENTRY_SIZE_STIM_DWORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "GRANULARITY_ODT_ENTRY_SIZE_STIM_DLONG") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_nGranularityOdtEntrySizeStim = A2L_GranularityOdtEntrySizeStim::GRANULARITY_ODT_ENTRY_SIZE_STIM_DLONG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nStimBlock.m_cMaxOdtEntrySizeStim = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "TIMESTAMP_SUPPORTED") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_bIsUse = true;
|
|
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampTicks = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "NO_TIME_STAMP") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedSize = A2L_TimestampSupportedSize::NO_TIME_STAMP;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SIZE_BYTE") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedSize = A2L_TimestampSupportedSize::SIZE_BYTE;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SIZE_WORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedSize = A2L_TimestampSupportedSize::SIZE_WORD;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SIZE_DWORD") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedSize = A2L_TimestampSupportedSize::SIZE_DWORD;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "UNIT_1NS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_1NS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_10NS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_10NS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_100NS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_100NS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_1US") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_1US;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_10US") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_10US;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_100US") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_100US;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_1MS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_1MS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_10MS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_10MS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_100MS") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_100MS;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "UNIT_1S") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nTimeStampSupported.m_nTimestampSupportedUnit = A2L_TimestampSupportedUnit::UNIT_1S;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DAQ_LIST") {
|
|
|
|
|
for (int k = 0; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) {
|
|
|
|
|
AddLogString(string_format(" %d : %s : %s", k, block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str(), block.ItemList()[i].ItemList[j].ItemList[k].BlockName.c_str()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "") { // event
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].BlockName == "EVENT") {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList.size() > 0) {
|
|
|
|
|
|
|
|
|
|
A2L_DaqEvent daqEvent;
|
|
|
|
|
daqEvent.m_strEventChannelName = block.ItemList()[i].ItemList[j].ItemList[0].Value;
|
|
|
|
|
daqEvent.m_strEventChannelShortName = block.ItemList()[i].ItemList[j].ItemList[1].Value;
|
|
|
|
|
daqEvent.m_nEventChannelNumber = atoi(block.ItemList()[i].ItemList[j].ItemList[2].Value.c_str());
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList[3].Value == "EVENT_DAQ")
|
|
|
|
|
daqEvent.m_nDaqEventType = A2L_DaqEventType::EVENT_DAQ;
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[3].Value == "EVENT_STIM")
|
|
|
|
|
daqEvent.m_nDaqEventType = A2L_DaqEventType::EVENT_STIM;
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[3].Value == "EVENT_DAQ_STIM")
|
|
|
|
|
daqEvent.m_nDaqEventType = A2L_DaqEventType::EVENT_DAQ_STIM;
|
|
|
|
|
daqEvent.m_cMaxDaqList = atoi(block.ItemList()[i].ItemList[j].ItemList[4].Value.c_str());
|
|
|
|
|
daqEvent.m_cTimeCycle = atoi(block.ItemList()[i].ItemList[j].ItemList[5].Value.c_str());
|
|
|
|
|
daqEvent.m_cTimeUnit = atoi(block.ItemList()[i].ItemList[j].ItemList[6].Value.c_str());
|
|
|
|
|
daqEvent.m_cPriority = atoi(block.ItemList()[i].ItemList[j].ItemList[7].Value.c_str());
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stDAQ.m_nDaqEventList.push_back(daqEvent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 4. PAG
|
|
|
|
|
if (block.ItemList()[i].BlockName == "PAG") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stPAG.m_cMaxSegments = atoi(block.ItemList()[i].ItemList[0].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
// 5. XCP_ON_CAN
|
|
|
|
|
if (block.ItemList()[i].BlockName == "XCP_ON_CAN") {
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < block.ItemList()[i].ItemList.size(); j++) {
|
|
|
|
|
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0:// version
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_nVersion = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "CAN_ID_MASTER") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_lCanIDMater = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "CAN_ID_SLAVE") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_lCanIDSlave = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "CAN_ID_BROADCAST") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_lCanIdBroadcast = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "BAUDRATE") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_lBaudrate = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SAMPLE_POINT") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_cSamplePoint = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SAMPLE_RATE") {
|
|
|
|
|
j++;
|
|
|
|
|
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "SINGLE")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_nSampleRate = A2L_CAN_SAMPLE_RATE::RATE_SINGLE;
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "TRIPLE")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_nSampleRate = A2L_CAN_SAMPLE_RATE::RATE_TRIPLE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "BTL_CYCLES") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_cBtlCycles = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SJW") {
|
|
|
|
|
j++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_cSJW = atoi(block.ItemList()[i].ItemList[j].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "MAX_DLC_REQUIRED") {
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_bIsMaxDlcRequired = true;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "SYNC_EDGE") {
|
|
|
|
|
j++;
|
|
|
|
|
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].Value == "SINGLE")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_nSyncEdge = A2L_CAN_SYNC_EDGE::EDGE_SINGLE;
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "DUAL")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_nSyncEdge = A2L_CAN_SYNC_EDGE::EDGE_DUAL;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].Value == "") { // event
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].BlockName == "DAQ_LIST_CAN_ID") {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList.size() > 0) {
|
|
|
|
|
|
|
|
|
|
A2L_DAQ_LIST_CAN_ID daqCanID;
|
|
|
|
|
|
|
|
|
|
daqCanID.m_nDaqListNumber = atoi(block.ItemList()[i].ItemList[j].ItemList[0].Value.c_str());
|
|
|
|
|
|
|
|
|
|
for (int k = 1; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "FIXED") {
|
|
|
|
|
k++;
|
|
|
|
|
unsigned long value = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
daqCanID.m_lFixedDAQCanIDList.push_back(value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_DaqList.push_back(daqCanID);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].BlockName == "EVENT_CAN_ID_LIST") {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList.size() > 0) {
|
|
|
|
|
|
|
|
|
|
A2L_EVENT_LIST_CAN_ID eventCanID;
|
|
|
|
|
|
|
|
|
|
eventCanID.m_EventListNumber = atoi(block.ItemList()[i].ItemList[j].ItemList[0].Value.c_str());
|
|
|
|
|
|
|
|
|
|
for (int k = 1; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "FIXED") {
|
|
|
|
|
k++;
|
|
|
|
|
unsigned long value = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
eventCanID.m_lFixedDAQCanIDList.push_back(value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_EventList.push_back(eventCanID);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].BlockName == "CAN_FD") {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList.size() > 0) {
|
|
|
|
|
for (int k = 0; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) {
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "MAX_DLC") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_nMAXDlc = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "CAN_FD_DATA_TRANSFER_BAUDRATE") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_lBaudrate = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "SAMPLE_POINT") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_cSamplePoint = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "BTL_CYCLES") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_cBtlCycles = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "SJW") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_cSJW = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "SYNC_EDGE") {
|
|
|
|
|
k++;
|
|
|
|
|
if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "SINGLE")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_nSyncEdge = A2L_CAN_SYNC_EDGE::EDGE_SINGLE;
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "DUAL")
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_nSyncEdge = A2L_CAN_SYNC_EDGE::EDGE_DUAL;
|
|
|
|
|
}
|
|
|
|
|
else if (block.ItemList()[i].ItemList[j].ItemList[k].Value == "SECONDARY_SAMPLE_POINT") {
|
|
|
|
|
k++;
|
|
|
|
|
m_stA2LData.m_stIFDATAs.m_stXCPCAN.m_stCANFD.m_cSecondarySamplePoint = atoi(block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& compu_method_list = module->CompuMethods();
|
|
|
|
|
//EXPECT_GT(compu_method_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tCOMPU METHOD" << std::endl;
|
|
|
|
|
for (const auto& [method_name, method] : compu_method_list) {
|
|
|
|
|
|
|
|
|
|
;
|
|
|
|
|
std::cout << method_name << " " << method->Description() << std::endl;
|
|
|
|
|
COMPU_METHOD compuMethod;
|
|
|
|
|
compuMethod.m_strName = method_name;
|
|
|
|
|
compuMethod.m_strDescription = method->Description();
|
|
|
|
|
compuMethod.m_strFormat = method->Format();
|
|
|
|
|
compuMethod.m_strUnit = method->PhysUnit();
|
|
|
|
|
if (method->Type() == a2l::A2lConversionType::LINEAR) {
|
|
|
|
|
compuMethod.m_nConversionType = A2L_TAB_CONVERSION_TYPE::LINEAR;
|
|
|
|
|
for (int cnt = 0; cnt < method->CoeffsLinear().size(); cnt++) {
|
|
|
|
|
compuMethod.m_Coeffs.push_back(method->CoeffsLinear().at(cnt));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (method->Type() == a2l::A2lConversionType::RAT_FUNC) {
|
|
|
|
|
compuMethod.m_nConversionType = A2L_TAB_CONVERSION_TYPE::RAT_FUNC;
|
|
|
|
|
for (int cnt = 0; cnt < method->Coeffs().size(); cnt++) {
|
|
|
|
|
compuMethod.m_Coeffs.push_back(method->Coeffs().at(cnt));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_stA2LData.m_stCompuMethods.m_CompuMethodList.push_back(compuMethod);
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& meas_list = module->Measurements();
|
|
|
|
|
//EXPECT_GT(meas_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tMEASUREMENT" << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format("measurement : %d", meas_list.size()));
|
|
|
|
|
|
|
|
|
|
for (const auto& [meas_name, meas] : meas_list) {
|
|
|
|
|
std::cout << meas_name << " " << meas->Description() << std::endl;
|
|
|
|
|
|
|
|
|
|
A2L_MEASUREMENT measurement;
|
|
|
|
|
|
|
|
|
|
measurement.m_strName = meas_name;
|
|
|
|
|
measurement.m_strDescription = meas->Description();
|
|
|
|
|
if (meas->DataType() == a2l::A2lDataType::UBYTE)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_UBYTE;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::SBYTE)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_SBYTE;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::UWORD)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_UWORD;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::SWORD)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_SWORD;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::ULONG)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_ULONG;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::SLONG)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_SLONG;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::A_UINT64)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_UINT64;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::A_INT64)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_INT64;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::FLOAT16_IEEE)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_FLOAT16_IEEE;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::FLOAT32_IEEE)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_FLOAT32_IEEE;
|
|
|
|
|
else if (meas->DataType() == a2l::A2lDataType::FLOAT64_IEEE)
|
|
|
|
|
measurement.m_cDataType = A2L_DATA_TYPE::A2L_DATA_TYPE_FLOAT64_IEEE;
|
|
|
|
|
|
|
|
|
|
measurement.m_strCompuMothod = meas->Conversion();
|
|
|
|
|
measurement.m_cResolution = meas->Resolution();
|
|
|
|
|
measurement.m_cAccuracy = meas->Accuracy();
|
|
|
|
|
measurement.m_nLowerLimit = meas->LowerLimit();
|
|
|
|
|
measurement.m_nUpperLimit = meas->UpperLimit();
|
|
|
|
|
measurement.m_strSymbolLink = meas->SymbolLink().SymbolName;
|
|
|
|
|
measurement.m_nSymbolOffset = meas->SymbolLink().Offset;
|
|
|
|
|
measurement.m_nECUAddress = meas->EcuAddress();
|
|
|
|
|
if (meas->MatrixDim().size() > 0) {
|
|
|
|
|
for (int cnt = 0; cnt < meas->MatrixDim().size(); cnt++)
|
|
|
|
|
measurement.m_MatrixDimSizeList.push_back(meas->MatrixDim().at(cnt));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_stA2LData.m_stMeasurements.m_MeasurementList.push_back(measurement);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
const auto& axis_list = module->AxisPtss();
|
|
|
|
|
//EXPECT_GT(axis_list.size(), 1);
|
|
|
|
|
std::cout << "\t\tAXIS PTS" << std::endl;
|
|
|
|
|
for (const auto& [pts_name, pts] : axis_list) {
|
|
|
|
|
std::cout << pts_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& blob_list = module->Blobs();
|
|
|
|
|
//EXPECT_GT(blob_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tBLOB" << std::endl;
|
|
|
|
|
for (const auto& [blob_name, blob] : blob_list) {
|
|
|
|
|
std::cout << blob_name << " " << blob->Address() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& characteristic_list = module->Characteristics();
|
|
|
|
|
//EXPECT_GT(characteristic_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tCHARACTERISTIC" << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format("chracteristics : %d", characteristic_list.size()));
|
|
|
|
|
int i = 0;
|
|
|
|
|
for (const auto& [char_name, characteristic] : characteristic_list) {
|
|
|
|
|
std::cout << char_name << " " << characteristic->Description() << std::endl;
|
|
|
|
|
AddLogString(string_format(" %d : %s", i, characteristic->Description().c_str()));
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const auto& compu_tab_list = module->CompuTabs();
|
|
|
|
|
//EXPECT_GT(compu_tab_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tCOMPU TAB" << std::endl;
|
|
|
|
|
for (const auto& [tab_name, tab] : compu_tab_list) {
|
|
|
|
|
std::cout << tab_name << " " << tab->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& compu_vtab_list = module->CompuVtabs();
|
|
|
|
|
//EXPECT_GT(compu_vtab_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tCOMPU VTAB" << std::endl;
|
|
|
|
|
for (const auto& [vtab_name, vtab] : compu_vtab_list) {
|
|
|
|
|
std::cout << vtab_name << " " << vtab->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& compu_vtab_range_list = module->CompuVtabRanges();
|
|
|
|
|
//EXPECT_GT(compu_vtab_range_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tCOMPU VTAB RANGE" << std::endl;
|
|
|
|
|
for (const auto& [range_name, range] : compu_vtab_range_list) {
|
|
|
|
|
std::cout << range_name << " " << range->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& frame_list = module->Frames();
|
|
|
|
|
// EXPECT_GT(frame_list.size(), 0); No frames in file
|
|
|
|
|
std::cout << "\t\tFRAME" << std::endl;
|
|
|
|
|
for (const auto& [frame_name, frame] : frame_list) {
|
|
|
|
|
std::cout << frame_name << " " << frame->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& func_list = module->Functions();
|
|
|
|
|
//EXPECT_GT(func_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tFUNCTION" << std::endl;
|
|
|
|
|
for (const auto& [func_name, func] : func_list) {
|
|
|
|
|
std::cout << func_name << " " << func->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& group_list = module->Groups();
|
|
|
|
|
//EXPECT_GT(group_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tGROUP" << std::endl;
|
|
|
|
|
for (const auto& [group_name, group] : group_list) {
|
|
|
|
|
std::cout << group_name << " " << group->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& instance_list = module->Instances();
|
|
|
|
|
//EXPECT_GT(instance_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tINSTANCE" << std::endl;
|
|
|
|
|
for (const auto& [instance_name, instance] : instance_list) {
|
|
|
|
|
std::cout << instance_name << " " << instance->Description() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString("");
|
|
|
|
|
|
|
|
|
|
const auto& rec_list = module->RecordLayouts();
|
|
|
|
|
//EXPECT_GT(rec_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tRECORD LAYOUT" << std::endl;
|
|
|
|
|
for (const auto& [rec_name, rec] : rec_list) {
|
|
|
|
|
std::cout << rec_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& trans_list = module->Transformers();
|
|
|
|
|
//EXPECT_GT(trans_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTRANSFORMER" << std::endl;
|
|
|
|
|
for (const auto& [trans_name, trans] : trans_list) {
|
|
|
|
|
std::cout << trans_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& taxis_list = module->TypedefAxiss();
|
|
|
|
|
//EXPECT_GT(taxis_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTYPEDEF AXIS" << std::endl;
|
|
|
|
|
for (const auto& [taxis_name, taxis] : taxis_list) {
|
|
|
|
|
std::cout << taxis_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& tblob_list = module->TypedefBlobs();
|
|
|
|
|
//EXPECT_GT(tblob_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTYPEDEF BLOB" << std::endl;
|
|
|
|
|
for (const auto& [tblob_name, tblob] : tblob_list) {
|
|
|
|
|
std::cout << tblob_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& tchar_list = module->TypedefCharacteristics();
|
|
|
|
|
//EXPECT_GT(tchar_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTYPEDEF CHARACTERISTIC" << std::endl;
|
|
|
|
|
for (const auto& [tchar_name, tchar] : tchar_list) {
|
|
|
|
|
std::cout << tchar_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
const auto& tmeas_list = module->TypedefMeasurements();
|
|
|
|
|
//EXPECT_GT(tmeas_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTYPEDEF MEASUREMENT" << std::endl;
|
|
|
|
|
for (const auto& [tmeas_name, tmeas] : tmeas_list) {
|
|
|
|
|
std::cout << tmeas_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
const auto& tstruct_list = module->TypedefStructures();
|
|
|
|
|
//EXPECT_GT(tstruct_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tTYPEDEF STRUCTURE" << std::endl;
|
|
|
|
|
for (const auto& [tstruct_name, tstruct] : tstruct_list) {
|
|
|
|
|
std::cout << tstruct_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
const auto& unit_list = module->Units();
|
|
|
|
|
//EXPECT_GT(unit_list.size(), 0);
|
|
|
|
|
std::cout << "\t\tUNIT" << std::endl;
|
|
|
|
|
for (const auto& [unit_name, unit] : unit_list) {
|
|
|
|
|
std::cout << unit_name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
a2l::A2mlBlock a2ml_block(module->A2ml());
|
|
|
|
|
const auto& a2ml = module->A2ml();
|
|
|
|
|
const auto a2ml_parse = a2ml_block.IsOk();
|
|
|
|
|
|
|
|
|
|
//EXPECT_TRUE(a2ml_parse) << a2ml_block.LastError();
|
|
|
|
|
/*
|
|
|
|
|
const auto& block_list = a2ml_scanner.BlockList();
|
|
|
|
|
for (const auto& block : block_list) {
|
|
|
|
|
std::cout << block.AsString() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::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());
|
|
|
|
|
}
|
|
|
|
|
void CIncSourceTestDlgDlg::OnBnClickedButtonElf()
|
|
|
|
|
{
|
|
|
|
|
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
|
|
|
|
|
TCHAR hexExt[] = _T("*.elf");
|
|
|
|
|
TCHAR hexBaseFilter[] = _T("ELF file(*.ELF) | *.elf;*.ELF | 모든파일(*.*) | *.* ||");
|
|
|
|
|
CFileDialog dlg(TRUE, hexExt, NULL, OFN_HIDEREADONLY, hexBaseFilter);
|
|
|
|
|
|
|
|
|
|
if (dlg.DoModal() == IDOK) {
|
|
|
|
|
|
|
|
|
|
std::wstring strPath = dlg.GetPathName().GetBuffer();
|
|
|
|
|
|
|
|
|
|
std::string strHexPath;
|
|
|
|
|
|
|
|
|
|
strHexPath.assign(strPath.begin(), strPath.end());
|
|
|
|
|
|
|
|
|
|
ELFIO::elfio reader;
|
|
|
|
|
if (reader.load(strHexPath.c_str())) {
|
|
|
|
|
// Print ELF file properties
|
|
|
|
|
std::cout << "ELF file class : ";
|
|
|
|
|
|
|
|
|
|
if (reader.get_class() == ELFIO::ELFCLASS32) {
|
|
|
|
|
std::cout << "ELF32" << std::endl;
|
|
|
|
|
AddLogString(string_format("ELF file class : ELF32"));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
std::cout << "ELF64" << std::endl;
|
|
|
|
|
AddLogString(string_format("ELF file class : ELF64"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "ELF file encoding : ";
|
|
|
|
|
if (reader.get_encoding() == ELFIO::ELFDATA2LSB) {
|
|
|
|
|
std::cout << "Little endian" << std::endl;
|
|
|
|
|
AddLogString(string_format("ELF file encoding : Little endian"));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
std::cout << "Big endian" << std::endl;
|
|
|
|
|
AddLogString(string_format("ELF file encoding : Big endian"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Print ELF file sections info
|
|
|
|
|
ELFIO::Elf_Half sec_num = reader.sections.size();
|
|
|
|
|
std::cout << "Number of sections: " << sec_num << std::endl;
|
|
|
|
|
AddLogString(string_format("Number of sections: %d", sec_num));
|
|
|
|
|
for (int i = 0; i < sec_num; ++i) {
|
|
|
|
|
ELFIO::section* psec = reader.sections[i];
|
|
|
|
|
std::cout << " [" << i << "] " << psec->get_name() << "\t"
|
|
|
|
|
<< psec->get_size() << std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format(" [%d] %s [%d]", i, psec->get_name(), psec->get_size()));
|
|
|
|
|
|
|
|
|
|
// Access to section's data
|
|
|
|
|
// const char* p = reader.sections[i]->get_data()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Print ELF file segments info
|
|
|
|
|
ELFIO::Elf_Half seg_num = reader.segments.size();
|
|
|
|
|
std::cout << "Number of segments: " << seg_num << std::endl;
|
|
|
|
|
AddLogString(string_format("Number of segments: %d", seg_num));
|
|
|
|
|
for (int i = 0; i < seg_num; ++i) {
|
|
|
|
|
const ELFIO::segment* pseg = reader.segments[i];
|
|
|
|
|
std::cout << " [" << i << "] 0x" << std::hex << pseg->get_flags()
|
|
|
|
|
<< "\t0x" << pseg->get_virtual_address() << "\t0x"
|
|
|
|
|
<< pseg->get_file_size() << "\t0x" << pseg->get_memory_size()
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
AddLogString(string_format(" [%d] 0x%X 0x%X [%d]", i, pseg->get_flags(), pseg->get_virtual_address(), pseg->get_memory_size()));
|
|
|
|
|
// Access to segments's data
|
|
|
|
|
// const char* p = reader.segments[i]->get_data()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < sec_num; ++i) {
|
|
|
|
|
ELFIO::section* psec = reader.sections[i];
|
|
|
|
|
// Check section type
|
|
|
|
|
if (psec->get_type() == ELFIO::SHT_SYMTAB) {
|
|
|
|
|
const ELFIO::symbol_section_accessor symbols(reader, psec);
|
|
|
|
|
for (unsigned int j = 0; j < symbols.get_symbols_num(); ++j) {
|
|
|
|
|
std::string name;
|
|
|
|
|
ELFIO::Elf64_Addr value;
|
|
|
|
|
ELFIO::Elf_Xword size;
|
|
|
|
|
unsigned char bind;
|
|
|
|
|
unsigned char type;
|
|
|
|
|
ELFIO::Elf_Half section_index;
|
|
|
|
|
unsigned char other;
|
|
|
|
|
|
|
|
|
|
// Read symbol properties
|
|
|
|
|
symbols.get_symbol(j, name, value, size, bind, type,
|
|
|
|
|
section_index, other);
|
|
|
|
|
std::cout << j << " " << name << " " << value << std::endl;
|
|
|
|
|
|
|
|
|
|
if (type == 1)
|
|
|
|
|
AddLogString(string_format("[%d][%d] %s 0x%X %d type=%d bind=%d section_index=0x%X other=%d",i, j, name.c_str(), value, size, type, bind, section_index, other));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CIncSourceTestDlgDlg::OnBnClickedButtonHex()
|
|
|
|
|
{
|
|
|
|
|
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TCHAR hexExt[] = _T("*.hex");
|
|
|
|
|
TCHAR hexBaseFilter[] = _T("HEX file(*.HEX) | *.hex;*.HEX | 모든파일(*.*) | *.* ||");
|
|
|
|
|
CFileDialog dlg(TRUE, hexExt, NULL, OFN_HIDEREADONLY, hexBaseFilter);
|
|
|
|
|
|
|
|
|
|
if (dlg.DoModal() == IDOK) {
|
|
|
|
|
|
|
|
|
|
std::wstring strPath = dlg.GetPathName().GetBuffer();
|
|
|
|
|
|
|
|
|
|
std::string strHexPath;
|
|
|
|
|
|
|
|
|
|
strHexPath.assign(strPath.begin(), strPath.end());
|
|
|
|
|
|
|
|
|
|
intelhex::hex_data ithex;
|
|
|
|
|
|
|
|
|
|
ithex.load(strHexPath.c_str());
|
|
|
|
|
|
|
|
|
|
intelhex::hex_data::iterator iter = ithex.begin();
|
|
|
|
|
|
|
|
|
|
for (; iter != ithex.end(); iter++) {
|
|
|
|
|
(*iter).second;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|