enumobjects

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1193665761703&lmt=1193665780&format=336x280_as&output=html&correlator=1193665761687&url=http%3A%2F%2Fwww.codeguru.cn%2Fpublic%2Fiframe%2Fwinapiiframe.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=1285758818.1193665762&ga_sid=1193665762&ga_hid=111695597&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_his=8&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency">     函数功能:该函数为指定的设备上下文环境枚举可用的笔或画笔,对于每个可用对象,该函数调用应用程序定义的回调函数,提供数据描述该对象。Enumobjects继续调用回调函数直到回调函数返回零或所有的对象都已枚举为止。

    函数原型:int EnumObjects(HDC hdc, int nObjectType, GOBJENUMPROC lpObjectFunc, LPARAM lParam);

    参数:

    hdc:设备上下文环境句柄。

    nObjectType:指定对象类型,该参数可为OBJ_BRUSH或OBJ_PEN。

    lpObjectFunc:指向应用程序定义的回调函数的指针,关于回调函数的更多信息,参见EnumObjectsProc函数。

    LParam:指向应用程序定义的数据的指针,该数据与对象信息一起传送给回调函数。

    返回值:返回值表明回调函数最后的一次返回值并且由用户定义;如果有太多的对象而无法枚举,则返回值为-1,在这种情况下回调函数不被调用。

    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。

#include <windows.h> #include <shlobj.h> #include <tchar.h> #include <commctrl.h> #include <strsafe.h> #include <Shlwapi.h> #include <knownfolders.h> #include <ShObjIdl.h> #pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "comctl32.lib") #pragma comment(lib, "Shell32.lib") // 禁用某些警告 #define _CRT_NONSTDC_NO_DEPRECATE #pragma warning(disable:4996) // 确保使用正确版本的公共控件 #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // 避免宏重定义 #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0601 #endif #ifndef WINVER #define WINVER 0x0601 #endif // 全局状态管理结构 typedef struct { HTREEITEM hItem; BOOL isExpanded; LPITEMIDLIST pidl; BOOL isLibrary; BOOL isSystemFolder; } TreeNodeState; #define MAX_TREE_NODES 1024 TreeNodeState g_treeStates[MAX_TREE_NODES]; int g_nodeCount = 0; // 控件ID定义 #define ID_TREEVIEW 101 #define ID_EDIT_PATH 102 #define ID_BUTTON_COPY 103 // 函数声明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HTREEITEM ExpandTreeViewItem(HWND hTreeView, HTREEITEM hItem); HRESULT PopulateChildFolders(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlParent, BOOL isLibraryParent); HTREEITEM AddFolderToTreeView(HWND hTreeView, HTREEITEM hParent, LPWSTR pszName, LPITEMIDLIST pidl, BOOL isLibrary, BOOL isSystemFolder); void CleanupTreeStates(); void DebugPrint(LPCTSTR format, ...); void UpdatePathDisplay(HWND hEdit, LPITEMIDLIST pidl, BOOL isLibrary); void CopyPathToClipboard(HWND hWnd, LPCTSTR path); BOOL IsLibraryFolder(LPITEMIDLIST pidl); BOOL IsSystemFolder(LPITEMIDLIST pidl); BOOL ShouldSkipFolder(LPCTSTR pszName, BOOL isLibraryContext); HRESULT HandleLibraryFolder(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlLibrary); HRESULT SafeGetDisplayName(IShellFolder* pFolder, LPCITEMIDLIST pidl, LPWSTR pszName, DWORD cchName); HRESULT EnumerateFolderContents(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlFolder, BOOL isLibraryContext); HRESULT AddKnownLibraryFolders(HWND hTreeView, HTREEITEM hParent); HRESULT EnumerateLibraryContents(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlLibrary); // 主窗口类名 #define CLASS_NAME _T("TreeViewDesktopBrowser") // 函数实现 void DebugPrint(LPCTSTR format, ...) { TCHAR buffer[1024]; va_list args; va_start(args, format); StringCchVPrintf(buffer, _countof(buffer), format, args); va_end(args); OutputDebugString(buffer); } void CleanupTreeStates() { DebugPrint(L"清理状态\n"); for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].pidl) { CoTaskMemFree(g_treeStates[i].pidl); g_treeStates[i].pidl = NULL; } } g_nodeCount = 0; } HTREEITEM AddFolderToTreeView(HWND hTreeView, HTREEITEM hParent, LPWSTR pszName, LPITEMIDLIST pidl, BOOL isLibrary, BOOL isSystemFolder) { if (!hTreeView || !pszName || !pidl) return NULL; TVINSERTSTRUCT tvInsert = { 0 }; tvInsert.hParent = hParent; tvInsert.hInsertAfter = TVI_LAST; tvInsert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_CHILDREN; tvInsert.item.pszText = pszName; tvInsert.item.lParam = (LPARAM)pidl; tvInsert.item.cChildren = 1; HTREEITEM hItem = TreeView_InsertItem(hTreeView, &tvInsert); if (hItem) { if (g_nodeCount < MAX_TREE_NODES) { g_treeStates[g_nodeCount].hItem = hItem; g_treeStates[g_nodeCount].isExpanded = FALSE; g_treeStates[g_nodeCount].pidl = pidl; g_treeStates[g_nodeCount].isLibrary = isLibrary; g_treeStates[g_nodeCount].isSystemFolder = isSystemFolder; g_nodeCount++; } } else { DebugPrint(L"添加文件夹失败: %s\n", pszName); CoTaskMemFree(pidl); } return hItem; } HTREEITEM ExpandTreeViewItem(HWND hTreeView, HTREEITEM hItem) { if (!hTreeView || !hItem) return NULL; TVITEM tvItem = { 0 }; tvItem.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE; tvItem.hItem = hItem; tvItem.stateMask = TVIS_EXPANDED; if (!TreeView_GetItem(hTreeView, &tvItem)) { return NULL; } LPITEMIDLIST pidlParent = (LPITEMIDLIST)tvItem.lParam; if (!pidlParent) return NULL; BOOL isCurrentlyExpanded = (tvItem.state & TVIS_EXPANDED) != 0; if (!isCurrentlyExpanded) { BOOL isLibraryParent = FALSE; for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].hItem == hItem) { isLibraryParent = g_treeStates[i].isLibrary; break; } } HTREEITEM hFirstChild = TreeView_GetChild(hTreeView, hItem); if (!hFirstChild) { HRESULT hr = PopulateChildFolders(hTreeView, hItem, pidlParent, isLibraryParent); if (FAILED(hr)) { DebugPrint(L"展开失败: 0x%08X\n", hr); return NULL; } } TreeView_Expand(hTreeView, hItem, TVE_EXPAND); for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].hItem == hItem) { g_treeStates[i].isExpanded = TRUE; break; } } } else { TreeView_Expand(hTreeView, hItem, TVE_COLLAPSE); for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].hItem == hItem) { g_treeStates[i].isExpanded = FALSE; break; } } } return hItem; } HRESULT PopulateChildFolders(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlParent, BOOL isLibraryParent) { DebugPrint(L"填充子文件夹,父节点是库: %d\n", isLibraryParent); if (IsLibraryFolder(pidlParent)) { return HandleLibraryFolder(hTreeView, hParent, pidlParent); } return EnumerateFolderContents(hTreeView, hParent, pidlParent, isLibraryParent); } HRESULT SafeGetDisplayName(IShellFolder* pFolder, LPCITEMIDLIST pidl, LPWSTR pszName, DWORD cchName) { if (!pFolder || !pidl || !pszName || cchName == 0) { return E_INVALIDARG; } STRRET strRet; HRESULT hr = pFolder->GetDisplayNameOf(pidl, SHGDN_NORMAL, &strRet); if (SUCCEEDED(hr)) { hr = StrRetToBuf(&strRet, pidl, pszName, cchName); if (strRet.uType == STRRET_WSTR && strRet.pOleStr) { CoTaskMemFree(strRet.pOleStr); } } return hr; } BOOL IsLibraryFolder(LPITEMIDLIST pidl) { if (!pidl) return FALSE; LPITEMIDLIST pidlLibraries = NULL; if (SUCCEEDED(SHGetKnownFolderIDList(FOLDERID_Libraries, 0, NULL, &pidlLibraries))) { BOOL isEqual = ILIsEqual(pidl, pidlLibraries); CoTaskMemFree(pidlLibraries); if (isEqual) return TRUE; } IShellFolder* pDesktop = NULL; if (SUCCEEDED(SHGetDesktopFolder(&pDesktop))) { WCHAR szName[MAX_PATH]; if (SUCCEEDED(SafeGetDisplayName(pDesktop, pidl, szName, _countof(szName)))) { if (_wcsicmp(szName, L"库") == 0 || _wcsicmp(szName, L"Libraries") == 0 || wcsstr(szName, L"库") != NULL) { // 包含"库"字样的也可能是库 pDesktop->Release(); return TRUE; } } pDesktop->Release(); } return FALSE; } BOOL IsSystemFolder(LPITEMIDLIST pidl) { if (!pidl) return FALSE; // 通过路径判断系统文件夹 WCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList(pidl, szPath)) { // 常见的系统文件夹路径模式 if (wcsstr(szPath, L"\\Windows\\") != NULL || wcsstr(szPath, L"\\Program Files\\") != NULL || wcsstr(szPath, L"\\ProgramData\\") != NULL || (wcsstr(szPath, L"\\Users\\") != NULL && wcsstr(szPath, L"\\AppData\\") != NULL)) { return TRUE; } } return FALSE; } void CopyPathToClipboard(HWND hWnd, LPCTSTR path) { if (OpenClipboard(hWnd)) { EmptyClipboard(); SIZE_T cbSize = (_tcslen(path) + 1) * sizeof(TCHAR); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cbSize); if (hGlobal) { LPTSTR pszData = (LPTSTR)GlobalLock(hGlobal); if (pszData) { _tcscpy_s(pszData, _tcslen(path) + 1, path); GlobalUnlock(hGlobal); #ifdef UNICODE SetClipboardData(CF_UNICODETEXT, hGlobal); #else SetClipboardData(CF_TEXT, hGlobal); #endif } else { GlobalFree(hGlobal); } } CloseClipboard(); MessageBox(hWnd, _T("路径已复制到剪贴板"), _T("成功"), MB_ICONINFORMATION); } else { MessageBox(hWnd, _T("无法打开剪贴板"), _T("错误"), MB_ICONERROR); } } HRESULT HandleLibraryFolder(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlLibrary) { DebugPrint(L"处理库文件夹\n"); return EnumerateLibraryContents(hTreeView, hParent, pidlLibrary); } // 修复的 AddKnownLibraryFolders 函数,避免在已知库中重复添加 HRESULT AddKnownLibraryFolders(HWND hTreeView, HTREEITEM hParent) { DebugPrint(L"添加已知库文件夹\n"); // 检查父节点是否是已知库文件夹本身,如果是则跳过添加 TVITEM tvParent = { 0 }; tvParent.mask = TVIF_HANDLE | TVIF_TEXT; tvParent.hItem = hParent; WCHAR szParentName[MAX_PATH] = L""; tvParent.pszText = szParentName; tvParent.cchTextMax = _countof(szParentName); if (TreeView_GetItem(hTreeView, &tvParent)) { // 检查父节点名称是否是已知库文件夹 static const LPCWSTR knownLibraryNames[] = { L"文档", L"图片", L"音乐", L"视频", L"Documents", L"Pictures", L"Music", L"Videos", NULL }; BOOL isParentKnownLibrary = FALSE; for (int i = 0; knownLibraryNames[i] != NULL; i++) { if (wcscmp(szParentName, knownLibraryNames[i]) == 0) { isParentKnownLibrary = TRUE; break; } } if (isParentKnownLibrary) { DebugPrint(L"父节点是已知库文件夹 %s,跳过添加已知库文件夹\n", szParentName); return S_FALSE; // 跳过添加 } } struct { KNOWNFOLDERID folderId; LPCWSTR name; } libraries[] = { { FOLDERID_Documents, L"文档" }, { FOLDERID_Pictures, L"图片" }, { FOLDERID_Music, L"音乐" }, { FOLDERID_Videos, L"视频" }, }; int addedCount = 0; for (int i = 0; i < ARRAYSIZE(libraries); i++) { LPITEMIDLIST pidl = NULL; HRESULT hr = SHGetKnownFolderIDList(libraries[i].folderId, 0, NULL, &pidl); if (SUCCEEDED(hr) && pidl) { UINT pidlSize = ILGetSize(pidl); if (pidlSize > 0) { LPITEMIDLIST pidlPersistent = (LPITEMIDLIST)CoTaskMemAlloc(pidlSize); if (pidlPersistent) { memcpy(pidlPersistent, pidl, pidlSize); BOOL isLibrary = IsLibraryFolder(pidlPersistent); BOOL isSystem = IsSystemFolder(pidlPersistent); HTREEITEM hNewItem = AddFolderToTreeView(hTreeView, hParent, (LPWSTR)libraries[i].name, pidlPersistent, isLibrary, isSystem); if (hNewItem) { addedCount++; DebugPrint(L"添加已知库文件夹: %s\n", libraries[i].name); } else { CoTaskMemFree(pidlPersistent); } } } CoTaskMemFree(pidl); } } DebugPrint(L"成功添加 %d 个已知库文件夹\n", addedCount); return addedCount > 0 ? S_OK : E_FAIL; } BOOL ShouldSkipFolder(LPCTSTR pszName, BOOL isLibraryContext) { if (!pszName) return FALSE; if (pszName[0] == L'\0' || wcscmp(pszName, L".") == 0 || wcscmp(pszName, L"..") == 0) { return TRUE; } static const LPCWSTR skipFolders[] = { L"Application Data", L"Cookies", L"Local Settings", L"NetHood", L"PrintHood", L"Recent", L"SendTo", L"Templates", L"$Recycle.Bin", L"System32", L"SysWOW64", NULL }; for (int i = 0; skipFolders[i] != NULL; i++) { if (_wcsicmp(pszName, skipFolders[i]) == 0) { return TRUE; } } return FALSE; } HRESULT EnumerateFolderContents(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlFolder, BOOL isLibraryContext) { DebugPrint(L"枚举文件夹内容\n"); IShellFolder* pFolder = NULL; HRESULT hr = SHBindToObject(NULL, pidlFolder, NULL, IID_IShellFolder, (void**)&pFolder); if (FAILED(hr)) { DebugPrint(L"绑定文件夹失败: 0x%08X\n", hr); return hr; } IEnumIDList* pEnum = NULL; hr = pFolder->EnumObjects(NULL, SHCONTF_FOLDERS, &pEnum); if (FAILED(hr) || !pEnum) { DebugPrint(L"枚举失败: 0x%08X\n", hr); pFolder->Release(); return FAILED(hr) ? hr : E_FAIL; } int itemCount = 0; LPITEMIDLIST pidlChild = NULL; ULONG cFetched = 0; while (SUCCEEDED(pEnum->Next(1, &pidlChild, &cFetched)) && cFetched > 0) { WCHAR szName[MAX_PATH] = L""; hr = SafeGetDisplayName(pFolder, pidlChild, szName, _countof(szName)); if (SUCCEEDED(hr)) { if (ShouldSkipFolder(szName, isLibraryContext)) { CoTaskMemFree(pidlChild); continue; } LPITEMIDLIST pidlCombined = ILCombine(pidlFolder, pidlChild); if (pidlCombined) { BOOL isChildLibrary = IsLibraryFolder(pidlCombined); BOOL isSystemFolder = IsSystemFolder(pidlCombined); UINT pidlSize = ILGetSize(pidlCombined); if (pidlSize > 0) { LPITEMIDLIST pidlPersistent = (LPITEMIDLIST)CoTaskMemAlloc(pidlSize); if (pidlPersistent) { memcpy(pidlPersistent, pidlCombined, pidlSize); HTREEITEM hNewItem = AddFolderToTreeView(hTreeView, hParent, szName, pidlPersistent, isChildLibrary, isSystemFolder); if (hNewItem) { itemCount++; DebugPrint(L"添加文件夹: %s (库: %d, 系统: %d)\n", szName, isChildLibrary, isSystemFolder); } else { CoTaskMemFree(pidlPersistent); } } } CoTaskMemFree(pidlCombined); } } CoTaskMemFree(pidlChild); } pEnum->Release(); pFolder->Release(); DebugPrint(L"枚举完成,添加 %d 个项目\n", itemCount); return S_OK; } // 修复的 EnumerateLibraryContents 函数 - 现在会正确枚举库内容,避免重复添加已知库 HRESULT EnumerateLibraryContents(HWND hTreeView, HTREEITEM hParent, LPITEMIDLIST pidlLibrary) { DebugPrint(L"枚举库内容 - 开始\n"); int totalAdded = 0; // 1. 首先添加已知的库文件夹 HRESULT hr = AddKnownLibraryFolders(hTreeView, hParent); if (SUCCEEDED(hr)) { DebugPrint(L"已知库文件夹添加完成\n"); totalAdded += 4; // 文档、图片、音乐、视频四个已知库 } // 2. 然后枚举库中的其他文件夹(不包括已知的库文件夹) IShellFolder* pFolder = NULL; hr = SHBindToObject(NULL, pidlLibrary, NULL, IID_IShellFolder, (void**)&pFolder); if (FAILED(hr)) { DebugPrint(L"绑定库文件夹失败: 0x%08X\n", hr); return hr; } IEnumIDList* pEnum = NULL; hr = pFolder->EnumObjects(NULL, SHCONTF_FOLDERS, &pEnum); if (FAILED(hr) || !pEnum) { DebugPrint(L"枚举库内容失败: 0x%08X\n", hr); pFolder->Release(); return FAILED(hr) ? hr : E_FAIL; } int enumeratedCount = 0; LPITEMIDLIST pidlChild = NULL; ULONG cFetched = 0; // 定义已知库文件夹的名称列表(多种语言) static const LPCWSTR knownLibraryNames[] = { L"文档", L"图片", L"音乐", L"视频", L"Documents", L"Pictures", L"Music", L"Videos", NULL }; while (SUCCEEDED(pEnum->Next(1, &pidlChild, &cFetched)) && cFetched > 0) { WCHAR szName[MAX_PATH] = L""; hr = SafeGetDisplayName(pFolder, pidlChild, szName, _countof(szName)); if (SUCCEEDED(hr)) { // 检查是否为已知库文件夹 BOOL isKnownLibrary = FALSE; for (int i = 0; knownLibraryNames[i] != NULL; i++) { if (wcscmp(szName, knownLibraryNames[i]) == 0) { isKnownLibrary = TRUE; break; } } // 跳过已知的库文件夹(已经通过AddKnownLibraryFolders添加) if (isKnownLibrary) { DebugPrint(L"跳过已知库文件夹: %s\n", szName); CoTaskMemFree(pidlChild); continue; } if (ShouldSkipFolder(szName, TRUE)) { CoTaskMemFree(pidlChild); continue; } LPITEMIDLIST pidlCombined = ILCombine(pidlLibrary, pidlChild); if (pidlCombined) { BOOL isChildLibrary = IsLibraryFolder(pidlCombined); BOOL isSystemFolder = IsSystemFolder(pidlCombined); UINT pidlSize = ILGetSize(pidlCombined); if (pidlSize > 0) { LPITEMIDLIST pidlPersistent = (LPITEMIDLIST)CoTaskMemAlloc(pidlSize); if (pidlPersistent) { memcpy(pidlPersistent, pidlCombined, pidlSize); HTREEITEM hNewItem = AddFolderToTreeView(hTreeView, hParent, szName, pidlPersistent, isChildLibrary, isSystemFolder); if (hNewItem) { enumeratedCount++; totalAdded++; DebugPrint(L"添加库中项目: %s (库: %d, 系统: %d)\n", szName, isChildLibrary, isSystemFolder); } else { CoTaskMemFree(pidlPersistent); } } } CoTaskMemFree(pidlCombined); } } CoTaskMemFree(pidlChild); } pEnum->Release(); pFolder->Release(); DebugPrint(L"库枚举完成,总共添加 %d 个项目(已知: %d, 枚举: %d)\n", totalAdded, totalAdded - enumeratedCount, enumeratedCount); return S_OK; } void UpdatePathDisplay(HWND hEdit, LPITEMIDLIST pidl, BOOL isLibrary) { if (!hEdit || !pidl) return; WCHAR szDisplay[MAX_PATH * 2] = L""; if (isLibrary) { IShellFolder* pDesktop = NULL; if (SUCCEEDED(SHGetDesktopFolder(&pDesktop))) { WCHAR szDisplayName[MAX_PATH]; if (SUCCEEDED(SafeGetDisplayName(pDesktop, pidl, szDisplayName, _countof(szDisplayName)))) { WCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList(pidl, szPath)) { StringCchPrintf(szDisplay, _countof(szDisplay), L"库: %s\n路径: %s", szDisplayName, szPath); } else { StringCchPrintf(szDisplay, _countof(szDisplay), L"库: %s", szDisplayName); } } pDesktop->Release(); } } else { WCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList(pidl, szPath)) { StringCchCopy(szDisplay, _countof(szDisplay), szPath); } else { IShellFolder* pDesktop = NULL; if (SUCCEEDED(SHGetDesktopFolder(&pDesktop))) { WCHAR szDisplayName[MAX_PATH]; if (SUCCEEDED(SafeGetDisplayName(pDesktop, pidl, szDisplayName, _countof(szDisplayName)))) { StringCchPrintf(szDisplay, _countof(szDisplay), L"虚拟文件夹: %s", szDisplayName); } pDesktop->Release(); } } } SetWindowText(hEdit, szDisplay); } // WndProc 和 WinMain 函数保持不变 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hTreeView = NULL; static HWND hEditPath = NULL; static HWND hButtonCopy = NULL; static HTREEITEM hDesktopItem = NULL; switch (message) { case WM_CREATE: { // 创建控件 CreateWindow(L"STATIC", L"所选路径:", WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hEditPath = CreateWindow(L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY, 120, 10, 600, 25, hWnd, (HMENU)ID_EDIT_PATH, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hButtonCopy = CreateWindow(L"BUTTON", L"复制路径", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 730, 10, 100, 25, hWnd, (HMENU)ID_BUTTON_COPY, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hTreeView = CreateWindow(WC_TREEVIEW, L"", WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_TRACKSELECT, 10, 50, 860, 580, hWnd, (HMENU)ID_TREEVIEW, ((LPCREATESTRUCT)lParam)->hInstance, NULL); if (!hTreeView) { MessageBox(hWnd, L"TreeView 创建失败!", L"错误", MB_ICONERROR); return -1; } HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); if (hFont) { SendMessage(hEditPath, WM_SETFONT, (WPARAM)hFont, TRUE); SendMessage(hButtonCopy, WM_SETFONT, (WPARAM)hFont, TRUE); SendMessage(hTreeView, WM_SETFONT, (WPARAM)hFont, TRUE); } // 初始化桌面根节点 IShellFolder* pDesktopFolder = NULL; HRESULT hr = SHGetDesktopFolder(&pDesktopFolder); if (SUCCEEDED(hr)) { LPITEMIDLIST pidlDesktop = NULL; hr = SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidlDesktop); if (SUCCEEDED(hr)) { WCHAR szName[MAX_PATH]; hr = SafeGetDisplayName(pDesktopFolder, pidlDesktop, szName, _countof(szName)); if (SUCCEEDED(hr)) { UINT pidlSize = ILGetSize(pidlDesktop); if (pidlSize > 0) { LPITEMIDLIST pidlPersistent = (LPITEMIDLIST)CoTaskMemAlloc(pidlSize); if (pidlPersistent) { memcpy(pidlPersistent, pidlDesktop, pidlSize); TVINSERTSTRUCT tvInsert = { 0 }; tvInsert.hParent = TVI_ROOT; tvInsert.hInsertAfter = TVI_LAST; tvInsert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_CHILDREN; tvInsert.item.pszText = szName; tvInsert.item.lParam = (LPARAM)pidlPersistent; tvInsert.item.cChildren = 1; hDesktopItem = TreeView_InsertItem(hTreeView, &tvInsert); if (hDesktopItem) { DebugPrint(L"添加桌面节点: %s\n", szName); TreeView_Expand(hTreeView, hDesktopItem, TVE_EXPAND); TreeView_SelectItem(hTreeView, hDesktopItem); UpdatePathDisplay(hEditPath, pidlDesktop, FALSE); } else { CoTaskMemFree(pidlPersistent); } } } } CoTaskMemFree(pidlDesktop); } pDesktopFolder->Release(); } break; } case WM_COMMAND: { int wmId = LOWORD(wParam); if (wmId == ID_BUTTON_COPY) { WCHAR szPath[MAX_PATH * 2]; GetWindowText(hEditPath, szPath, _countof(szPath)); if (wcslen(szPath) > 0) { CopyPathToClipboard(hWnd, szPath); } } break; } case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam; if (pnmh->idFrom == ID_TREEVIEW) { switch (pnmh->code) { case TVN_SELCHANGED: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TVITEM tvItem = { 0 }; tvItem.mask = TVIF_HANDLE | TVIF_PARAM; tvItem.hItem = pnmtv->itemNew.hItem; if (TreeView_GetItem(hTreeView, &tvItem)) { LPITEMIDLIST pidl = (LPITEMIDLIST)tvItem.lParam; if (pidl) { BOOL isLibrary = FALSE; for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].hItem == pnmtv->itemNew.hItem) { isLibrary = g_treeStates[i].isLibrary; break; } } UpdatePathDisplay(hEditPath, pidl, isLibrary); } } break; } case TVN_ITEMEXPANDING: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; if (pnmtv->action == TVE_EXPAND) { TVITEM tvItem = { 0 }; tvItem.mask = TVIF_HANDLE | TVIF_PARAM; tvItem.hItem = pnmtv->itemNew.hItem; if (TreeView_GetItem(hTreeView, &tvItem)) { LPITEMIDLIST pidl = (LPITEMIDLIST)tvItem.lParam; if (pidl) { BOOL isLibraryParent = FALSE; for (int i = 0; i < g_nodeCount; i++) { if (g_treeStates[i].hItem == pnmtv->itemNew.hItem) { isLibraryParent = g_treeStates[i].isLibrary; break; } } HTREEITEM hFirstChild = TreeView_GetChild(hTreeView, pnmtv->itemNew.hItem); if (!hFirstChild) { HRESULT hr = PopulateChildFolders(hTreeView, pnmtv->itemNew.hItem, pidl, isLibraryParent); if (FAILED(hr)) { DebugPrint(L"填充子文件夹失败: 0x%08X\n", hr); } } } } } break; } } } break; } case WM_SIZE: { if (hTreeView && hEditPath && hButtonCopy) { RECT rcClient; GetClientRect(hWnd, &rcClient); MoveWindow(hEditPath, 120, 10, rcClient.right - 240, 25, TRUE); MoveWindow(hButtonCopy, rcClient.right - 110, 10, 100, 25, TRUE); MoveWindow(hTreeView, 10, 50, rcClient.right - 20, rcClient.bottom - 60, TRUE); } break; } case WM_DESTROY: CleanupTreeStates(); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { MessageBox(NULL, _T("COM初始化失败!"), _T("错误"), MB_ICONERROR); return 1; } INITCOMMONCONTROLSEX icex; ZeroMemory(&icex, sizeof(icex)); icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_TREEVIEW_CLASSES | ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES; if (!InitCommonControlsEx(&icex)) { InitCommonControls(); } WNDCLASSEX wcex; ZeroMemory(&wcex, sizeof(wcex)); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.hInstance = hInstance; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszClassName = CLASS_NAME; if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("窗口注册失败!"), _T("错误"), MB_ICONERROR); CoUninitialize(); return 1; } HWND hWnd = CreateWindow( CLASS_NAME, _T("桌面浏览器 - 完整库支持版"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 900, 700, NULL, NULL, hInstance, NULL); if (!hWnd) { MessageBox(NULL, _T("窗口创建失败!"), _T("错误"), MB_ICONERROR); CoUninitialize(); return 1; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } CleanupTreeStates(); CoUninitialize(); return (int)msg.wParam; }
最新发布
09-29
/** * \addtogroup EL9800Appl EL9800 application * @{ * This application includes three functional modules:<br> * Digital Input<br> * Digital Outputs<br> * Analog Input<br> * The objects of the modules are defined according the ETG.5001.<br> */ /** \file el9800appl.h \author EthercatSSC@beckhoff.com \brief EL9800 Application defines, typedefs and global variables \version 5.01 <br>Changes to version - :<br> V5.01 : Start file change log */ #ifndef _EL9800APPL_H_ #define _EL9800APPL_H_ /*----------------------------------------------------------------------------------------- ------ ------ Includes ------ -----------------------------------------------------------------------------------------*/ #include "ecatappl.h" /*----------------------------------------------------------------------------------------- ------ ------ Defines and Typedef ------ -----------------------------------------------------------------------------------------*/ /** * \addtogroup PdoMappingObjects PDO Mapping Objects * * Digital Input PDO mapping : 0x1A00<br> * Digital Output PDO mapping : 0x1601<br> * Analog Input PDO mapping : 0x1A02 * @{ */ /** \brief 0x1601 (Digital output RxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[32]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1601; /** \brief 0x1A00 (Digital input TxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[32]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1A00; /** \brief 0x1A02 (Analog input TxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[8]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1A02; /** @}*/ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * SyncManager 2 : 0x1C12 * <br>SyncManager 3 : 0x1C13 * @{ */ /** \brief 0x1C12 (SyncManager 2 assignment) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT16 aEntries[1]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1C12; /** \brief 0x1C13 (SyncManager 3 assignment) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT16 aEntries[2]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1C13; /** @}*/ /** * \addtogroup PDO Process Data Objects * Digital Inputs : 0x6000<br> * Analog Inputs : 0x6010<br> * Digital Outputs : 0x7020 * @{ */ /** \brief 0x6000 (Digital input object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bSwitch1); /**< \brief Switch 1*/ BOOLEAN(bSwitch2); /**< \brief Switch 2*/ BOOLEAN(bSwitch3); /**< \brief Switch 3*/ BOOLEAN(bSwitch4); /**< \brief Switch 4*/ BOOLEAN(bSwitch5); /**< \brief Switch 5*/ BOOLEAN(bSwitch6); /**< \brief Switch 6*/ BOOLEAN(bSwitch7); /**< \brief Switch 7*/ BOOLEAN(bSwitch8); /**< \brief Switch 8*/ BOOLEAN(bSwitch9); /**< \brief Switch 1*/ BOOLEAN(bSwitch10); /**< \brief Switch 2*/ BOOLEAN(bSwitch11); /**< \brief Switch 3*/ BOOLEAN(bSwitch12); /**< \brief Switch 4*/ BOOLEAN(bSwitch13); /**< \brief Switch 5*/ BOOLEAN(bSwitch14); /**< \brief Switch 6*/ BOOLEAN(bSwitch15); /**< \brief Switch 7*/ BOOLEAN(bSwitch16); /**< \brief Switch 8*/ BOOLEAN(bSwitch17); /**< \brief Switch 1*/ BOOLEAN(bSwitch18); /**< \brief Switch 2*/ BOOLEAN(bSwitch19); /**< \brief Switch 3*/ BOOLEAN(bSwitch20); /**< \brief Switch 4*/ BOOLEAN(bSwitch21); /**< \brief Switch 5*/ BOOLEAN(bSwitch22); /**< \brief Switch 6*/ BOOLEAN(bSwitch23); /**< \brief Switch 7*/ BOOLEAN(bSwitch24); /**< \brief Switch 8*/ BOOLEAN(bSwitch25); /**< \brief Switch 1*/ BOOLEAN(bSwitch26); /**< \brief Switch 2*/ BOOLEAN(bSwitch27); /**< \brief Switch 3*/ BOOLEAN(bSwitch28); /**< \brief Switch 4*/ BOOLEAN(bSwitch29); /**< \brief Switch 5*/ BOOLEAN(bSwitch30); /**< \brief Switch 6*/ BOOLEAN(bSwitch31); /**< \brief Switch 7*/ BOOLEAN(bSwitch32); /**< \brief Switch 8*/ // ALIGN8(SubIndex009) /**< \brief 8Bit alignment*/ } OBJ_STRUCT_PACKED_END TOBJ6000; /** \brief 0x6020 (Analog input object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bUnderrange); /**< \brief (SI1) Analog input under range*/ BOOLEAN(bOverrange); /**< \brief (SI2) Analog input over range*/ BIT2(b2Limit1); /**< \brief (SI3) Analog input 1st limit*/ BIT2(b2Limit2); /**< \brief (SI5) Analog input 2nd limit*/ ALIGN2(SubIndex006) /**< \brief 2Bit alignment*/ ALIGN6(SubIndex007) /**< \brief 2Bit alignment*/ BOOLEAN(bTxPDOState); /**< \brief (SI15) TxPdo state*/ BOOLEAN(bTxPDOToggle); /**< \brief (SI16) TxPdo toggle*/ INT16 i16Analoginput; /**< \brief (SI17) Analog input value*/ } OBJ_STRUCT_PACKED_END TOBJ6020; /** \brief 0x7010 (Digital output object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bLED1); /**< \brief LED 1*/ BOOLEAN(bLED2); /**< \brief LED 2*/ BOOLEAN(bLED3); /**< \brief LED 3*/ BOOLEAN(bLED4); /**< \brief LED 4*/ BOOLEAN(bLED5); /**< \brief LED 5*/ BOOLEAN(bLED6); /**< \brief LED 6*/ BOOLEAN(bLED7); /**< \brief LED 7*/ BOOLEAN(bLED8); /**< \brief LED 8*/ BOOLEAN(bLED9); /**< \brief LED 1*/ BOOLEAN(bLED10); /**< \brief LED 2*/ BOOLEAN(bLED11); /**< \brief LED 3*/ BOOLEAN(bLED12); /**< \brief LED 4*/ BOOLEAN(bLED13); /**< \brief LED 5*/ BOOLEAN(bLED14); /**< \brief LED 6*/ BOOLEAN(bLED15); /**< \brief LED 7*/ BOOLEAN(bLED16); /**< \brief LED 8*/ BOOLEAN(bLED17); /**< \brief LED 1*/ BOOLEAN(bLED18); /**< \brief LED 2*/ BOOLEAN(bLED19); /**< \brief LED 3*/ BOOLEAN(bLED20); /**< \brief LED 4*/ BOOLEAN(bLED21); /**< \brief LED 5*/ BOOLEAN(bLED22); /**< \brief LED 6*/ BOOLEAN(bLED23); /**< \brief LED 7*/ BOOLEAN(bLED24); /**< \brief LED 8*/ BOOLEAN(bLED25); /**< \brief LED 1*/ BOOLEAN(bLED26); /**< \brief LED 2*/ BOOLEAN(bLED27); /**< \brief LED 3*/ BOOLEAN(bLED28); /**< \brief LED 4*/ BOOLEAN(bLED29); /**< \brief LED 5*/ BOOLEAN(bLED30); /**< \brief LED 6*/ BOOLEAN(bLED31); /**< \brief LED 7*/ BOOLEAN(bLED32); /**< \brief LED 8*/ // ALIGN8(SubIndex008) /**< \brief 8Bit alignment*/ } OBJ_STRUCT_PACKED_END TOBJ7010; /** @}*/ /** * \addtogroup ConfigObjects Configuration Objects * Analog input settings: 0x8020 * @{ */ /** \brief 0x8020 (Analog input settings object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bEnableuserscale); /**< \brief Enable user scaling*/ BIT3(b3Presentation); /**< \brief Value presentation*/ ALIGN2(SubIndex005) /**< \brief 2Bit Alignment*/ BOOLEAN(bEnablelimit1); /**< \brief Enable limit 1*/ BOOLEAN(bEnablelimit2); /**< \brief Enable limit 2*/ ALIGN8(SubIndex009) /**< \brief 8Bit Alignment*/ INT16 i16Offset; /**< \brief Value offset*/ INT32 i32Gain; /**< \brief Value gain*/ INT16 i16Limit1; /**< \brief Value limit 1*/ INT16 i16Limit2; /**< \brief Value limit 2*/ } OBJ_STRUCT_PACKED_END TOBJ8020; /** @}*/ /** * \addtogroup DeviceParaObjects Device Parameter Objects * Modular Device Profile: 0xF000 * @{ */ /** \brief 0xF000 (Modular Device Profile) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex0*/ UINT16 u16Moduleindexdistance; /**< \brief Module Index distance * * Index distance between two modules (maximum number of objects per module and area)<br> * Default: 0x10*/ UINT16 u16Maximumnumberofmodules; /**< \brief Maximum number of modules*/ } OBJ_STRUCT_PACKED_END TOBJF000; /** \brief 0xF010 (Module Profile List) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex0*/ UINT32 aEntries[3]; /**< \brief Module profile information buffer * * Bit 0..15: Profile number of the module on position 1<br> * Bit 16..31: Profile specific*/ } OBJ_STRUCT_PACKED_END TOBJF010; /** @}*/ #endif //_EL9800APPL_H_ #ifdef _EVALBOARD_ #define PROTO #else #define PROTO extern #endif #ifdef _OBJD_ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * @{ */ /** * \brief Entry descriptions of SyncManager assign objects * * SubIndex0<br> * SubIndex1 (for all other entries the same description will be used (because the object code is ARRAY)) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asPDOAssignEntryDesc[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}}; /** @}*/ /** * \addtogroup EnumObjects Enum Objects * @{ * Presentation (Signed/Unsigned) : 0x800 */ /*--------------------------------------------- - 0x0800: ENUM (Signed/Unsigned Presentation) -----------------------------------------------*/ CHAR sEnum0800_Value00[] = "\000\000\000\000Signed presentation"; /**< \brief Value = 0x00, Text = Signed presentation */ CHAR sEnum0800_Value01[] = "\001\000\000\000Unsigned presentation"; /**< \brief Value = 0x01, Text = Unsigned presentation */ CHAR *apEnum0800[2] = { sEnum0800_Value00, sEnum0800_Value01};/**< \brief List of Enum (0x800) values*/ /** * \brief Enum entry description * * SubIndex0<br> * Enum (Signed Presentation) * enum (Unsigned Presentation) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x0800[] = {{DEFTYPE_UNSIGNED8, 8, ACCESS_READ | OBJACCESS_NOPDOMAPPING}, {DEFTYPE_OCTETSTRING, 8*SIZEOF(sEnum0800_Value00), ACCESS_READ | OBJACCESS_NOPDOMAPPING}, {DEFTYPE_OCTETSTRING, 8*SIZEOF(sEnum0800_Value01), ACCESS_READ | OBJACCESS_NOPDOMAPPING}}; /** @}*/ /** * \addtogroup PdoMappingObjects PDO Mapping Objects * @{ */ /** * \brief Object 0x1601 (Digital output RxPDO) entry descriptions * * SubIndex 0 : read only<br> * SubIndex x : read only<br> * (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1601[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ} }; /** * \brief Object 0x1601 (Digital output RxPDO) name * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1601[] = "DO RxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1601 (Digital output RxPDO) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex 1 : 0x7010.1 1bit (Reference to LED1)<br> * SubIndex 2 : 0x7010.1 1bit (Reference to LED2)<br> * SubIndex 3 : 0x7010.1 1bit (Reference to LED3)<br> * SubIndex 4 : 0x7010.1 1bit (Reference to LED4)<br> * SubIndex 5 : 0x7010.1 1bit (Reference to LED5), only for PIC24<br> * SubIndex 6 : 0x7010.1 1bit (Reference to LED6), only for PIC24<br> * SubIndex 7 : 0x7010.1 1bit (Reference to LED7), only for PIC24<br> * SubIndex 8 : 0x7010.1 1bit (Reference to LED8), only for PIC24 */ PROTO TOBJ1601 sDORxPDOMap #ifdef _EVALBOARD_ = {32, {0x70100101, 0x70100201, 0x70100301, 0x70100401,0x70100501, 0x70100601, 0x70100701, 0x70100801, 0x70100901, 0x70101001, 0x70101101, 0x70101201, 0x70101301, 0x70101401, 0x70101501, 0x70101601, 0x70101701, 0x70101801, 0x70101901, 0x70102001, 0x70102101, 0x70102201, 0x70102301, 0x70102401, 0x70102501, 0x70102601, 0x70102701, 0x70102801, 0x70102901, 0x70103001, 0x70103101, 0x70103201}} #endif ; /** @}*/ /** * \addtogroup PdoParameter PDO Parameter * @{ * * Parameter for PDO mapping object 0x1A02 : 0x1802 */ #ifdef _OBJD_ /** * \brief Entry descriptions of TxPDO Parameter object (0x1802) * * Subindex 0<br> * SubIndex 1 - 5 : not defined<br> * SubIndex 6 : Exclude TxPDOs<br> * SubIndex 7 : TxPDO State<br> * SubIndex 8 : not defined<br> * SubIndex 9 : TxPDO Toggle */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1802[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {DEFTYPE_OCTETSTRING, 0x00, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0, 0x0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}}; /** * \brief Object 0x1802 (TxPDO Parameter) object and entry names */ OBJCONST UCHAR OBJMEM aName0x1802[] = "TxPDO Parameter\000\000\000\000\000\000Exclude TxPDOs\000TxPDOState\000\000TxPDO Toggle\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1802 (TxPDO Parameter) variable to handle object data * * Only Subindex0 for this Object is stored here (all values are stored in other structures, see "ReadObject0x1802" for more details) */ PROTO UINT16 TxPDO1802Subindex0 #ifdef _EVALBOARD_ = 9 #endif ; /** @}*/ /** * \addtogroup PdoMapping PDO Mapping Objects * @{ */ /** * \brief Object 0x1A00 (Digital input TxPDO) entry descriptions * * SubIndex 0 : read only<br> * SubIndex x : read only<br> * (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A00[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ} }; /** * \brief Object 0x1A00 (Digital input TxPDO) object and entry names * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1A00[] = "DI TxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1A00 (Digital Input TxPDO) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex 1 : 0x6000.1 1bit (Reference to SWITCH1)<br> * SubIndex 2 : 0x6000.1 1bit (Reference to SWITCH2)<br> * SubIndex 3 : 0x6000.1 1bit (Reference to SWITCH3)<br> * SubIndex 4 : 0x6000.1 1bit (Reference to SWITCH4)<br> * SubIndex 5 : 0x6000.1 1bit (Reference to SWITCH5), only for PIC24<br> * SubIndex 6 : 0x6000.1 1bit (Reference to SWITCH6), only for PIC24<br> * SubIndex 7 : 0x6000.1 1bit (Reference to SWITCH7), only for PIC24<br> * SubIndex 8 : 0x6000.1 1bit (Reference to SWITCH8), only for PIC24 */ PROTO TOBJ1A00 sDITxPDOMap #ifdef _EVALBOARD_ = {32, {0x60000101, 0x60000201, 0x60000301, 0x60000401,0x60000501, 0x60000601, 0x60000701, 0x60000801, 0x60000901, 0x60001001, 0x60001101, 0x60001201, 0x60001301, 0x60001401, 0x60001501, 0x60001601, 0x60001701, 0x60001801, 0x60001901, 0x60002001, 0x60002101, 0x60002201, 0x60002301, 0x60002401, 0x60002501, 0x60002601, 0x60002701, 0x60002801, 0x60002901, 0x60003001, 0x60003101, 0x60003201}} #endif ; /** * \brief Object 0x1A02 (Analog input TxPDO) entry descriptions * * SubIndex 0 : read only<br> * SubIndex x : read only<br> * (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A02[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 001: SubIndex 001 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 002: SubIndex 002 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 003: SubIndex 003 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 004: SubIndex 004 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 005: SubIndex 005 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 006: SubIndex 006 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 007: SubIndex 007 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}}; /* SubIndex 008: SubIndex 008 */ /** * \brief Object 0x1A02 (Analog input TxPDO) object and entry names * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1A02[] = "AI TxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1A02 (Analog Input TxPDO) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex 1 : 0x6020.1 1bit (Reference to Analog under range)<br> * SubIndex 2 : 0x6020.2 1bit (Reference to Analog over range)<br> * SubIndex 3 : 0x6020.3 2bit (Reference to limit 1)<br> * SubIndex 4 : 0x6020.5 2bit (Reference to limit 2)<br> * SubIndex 5 : 8Bit Alignment<br> * SubIndex 6 : 0x1802.7 1bit (Reference to TxPDO State (stored in analog input struct))<br> * SubIndex 7 : 0x1802.9 1bit (Reference to TxPDO Toggle (stored in analog input struct))<br> * SubIndex 8 : 0x6020.17 16bit (Reference to Analog input value) */ PROTO TOBJ1A02 sAITxPDOMap #ifdef _EVALBOARD_ = {8, {0x60200101, 0x60200201, 0x60200302, 0x60200502, 0x08, 0x18020701, 0x18020901, 0x60201110}} #endif ; /** @}*/ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * @{ */ #ifdef _OBJD_ /** * \brief 0x1C12 (SyncManager 2 assignment) object name * * No entry names defined because the object code is ARRAY and all entry names are "SubIndex 000" */ OBJCONST UCHAR OBJMEM aName0x1C12[] = "RxPDO assign"; #endif //#ifdef _OBJD_ /** * \brief 0x1C12 (SyncManager 2 assignment) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex 1 : 0x1601 */ PROTO TOBJ1C12 sRxPDOassign #ifdef _EVALBOARD_ = {0x01, {0x1601}} #endif ; #ifdef _OBJD_ /** * \brief 0x1C13 (SyncManager 3 assignment) object name * * No entry names defined because the object code is ARRAY and all entry names are "SubIndex 000" */ OBJCONST UCHAR OBJMEM aName0x1C13[] = "TxPDO assign"; #endif //#ifdef _OBJD_ /** * \brief 0x1C13 (SyncManager 3 assignment) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex 1 : 0x1A00<br> * SubIndex 2 : 0x1A02 */ PROTO TOBJ1C13 sTxPDOassign #ifdef _EVALBOARD_ = {0x02, {0x1A00, 0x1A02}} #endif ; /** @}*/ /** * \addtogroup PDO Process Data Objects * @{ */ #ifdef _OBJD_ /** * \brief Object 0x6000 (Digital input object) entry descriptions * * SubIndex 0 : read only<br> * SubIndex x : (One description for each switch) read only and TxPdo mappable<br> * (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6000[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ // {0x0000, 0x08, 0} }; /* Subindex 009 for align */ /** * \brief 0x6000 (Digital input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x6000[] = "DI Inputs\000Switch 1\000Switch 2\000Switch 3\000Switch 4\000Switch 5\000Switch 6\000Switch 7\000Switch 8\000Switch 9\000Switch 10\000Switch 11\000Switch 12\000Switch 13\000Switch 14\000Switch 15\000Switch 16\000Switch 17\000Switch 18\000Switch 19\000Switch 20\000Switch 21\000Switch 22\000Switch 23\000Switch 24\000Switch 25\000Switch 26\000Switch 27\000Switch 28\000Switch 29\000Switch 30\000Switch 31\000Switch 32\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6000 (Digital input object) variable to handle object data * * SubIndex 0 : 1<br> * SubIndex x : every switch value is 0 by default */ PROTO TOBJ6000 sDIInputs #ifdef _EVALBOARD_ = {32, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} #endif ; #ifdef _OBJD_ /** * \brief Object 0x6020 (Analog input object) entry descriptions * * SubIndex 0 : read only<br> * SubIndex 001: Underrange<br> * SubIndex 002: Overrange<br> * SubIndex 003: Limit 1<br> * Subindex 004: doesn't exist<br> * SubIndex 005: Limit 2<br> * Subindex 006: 2Bit Alignment<br> * Subindex 007: 6Bit Alignment<br> * Subindex 008: doesn't exist<br> * Subindex 009: doesn't exist<br> * Subindex 010: doesn't exist<br> * Subindex 011: doesn't exist<br> * Subindex 012: doesn't exist<br> * Subindex 013: doesn't exist<br> * Subindex 014: doesn't exist<br> * SubIndex 015: TxPDO State<br> * SubIndex 016: TxPDO Toggle<br> * SubIndex 017: Analog input */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6020[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0x0000, 0, 0}, {DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0x0000, 0x02, 0}, {0x0000, 0x06, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING}}; /** * \brief 0x6020 (Analog input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x6020[] = "AI Inputs\000Underrange\000Overrange\000Limit 1\000\000Limit 2\000\000\000\000\000\000\000\000\000\000TxPDO State\000TxPDO Toggle\000Analog input\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6020 (Analog input object) variable to handle object data * */ PROTO TOBJ6020 sAIInputs #ifdef _EVALBOARD_ = {17, 0x00, 0x00, 0x00, 0x00, 0, 0, 0x00, 0x00, 0x7FFF} #endif ; /** * \brief Object 0x7010 (Digital output object) entry descriptions * * SubIndex 0 : read only<br> * SubIndex x : (One description for each led) read only and RxPdo mappable<br> * (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x7010[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 009: LED 9 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 010: LED 10 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 011: LED 11 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 012: LED 12 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 013: LED 13 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 014: LED 14 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 015: LED 15 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 016: LED 16 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 009: LED 9 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 010: LED 10 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 011: LED 11 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 012: LED 12 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 013: LED 13 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 014: LED 14 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 015: LED 15 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 016: LED 16 */ // {0x0000, 0x08, 0} }; /* Subindex 008 for align */ /** * \brief 0x6000 (Digital input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x7010[] = "DO Outputs\000LED 1\000LED 2\000LED 3\000LED 4\000LED 5\000LED 6\000LED 7\000LED 8\000LED 9\000LED 10\000LED 11\000LED 12\000LED 13\000LED 14\000LED 15\000LED 16\000LED 17\000LED 18\000LED 19\000LED 20\000LED 21\000LED 22\000LED 23\000LED 24\000LED 25\000LED 26\000LED 27\000LED 28\000LED 29\000LED 30\000LED 31\000LED 32\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6020 (Analog input object) variable to handle object data * */ PROTO TOBJ7010 sDOOutputs #ifdef _EVALBOARD_ = {32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} #endif ; /** @}*/ /** * \addtogroup ConfigObjects Configuration Objects * @{ */ /** * \brief Object 0x8020 (Analog input settings) entry descriptions * * SubIndex 0<br> * SubIndex 001: Enable user scale<br> * SubIndex 002: Presentation<br> * Subindex 003 doesn't exist<br> * Subindex 004 doesn't exist<br> * Subindex 005 for align<br> * Subindex 006 doesn't exist<br> * SubIndex 007: Enable limit 1<br> * SubIndex 008: Enable limit 2<br> * Subindex 009 for align<br> * Subindex 010 doesn't exist<br> * Subindex 011 doesn't exist<br> * Subindex 012 doesn't exist<br> * Subindex 013 doesn't exist<br> * Subindex 014 doesn't exist<br> * Subindex 015 doesn't exist<br> * Subindex 016 doesn't exist<br> * SubIndex 017: Offset<br> * SubIndex 018: Gain<br> * SubIndex 019: Limit 1<br> * SubIndex 020: Limit 2 */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x8020[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0800, 0x03, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0x02, 0}, {0x0000, 0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0000, 0x08, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER32, 0x20, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}}; /** \brief Object 0x8020 (Analog input settings) object and entry names*/ OBJCONST UCHAR OBJMEM aName0x8020[] = "AI Settings\000Enable user scale\000Presentation\000\000\000\000\000Enable limit 1\000Enable limit 2\000\000\000\000\000\000\000\000\000Offset\000Gain\000Limit 1\000Limit 2\000\377"; #endif //#ifdef _OBJD_ /** \brief Object 0x8020 (Analog input settings) variable*/ PROTO TOBJ8020 sAISettings #ifdef _EVALBOARD_ = {20, 0x00, 0x00, 0, 0x00, 0x00, 0, 0x00, 0x00, 0x00, 0x00} #endif ; /** @}*/ /** * \addtogroup DeviceParaObjects Device Parameter Objects * @{ */ #ifdef _OBJD_ /** * \brief 0xF000 (Modular Device Profile) entry descriptions * * Subindex 000<br> * SubIndex 001: Module index distance<br> * SubIndex 002: Maximum number of modules<br> */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0xF000[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}}; /** \brief 0xF000 (Modular Device Profile) object and entry names*/ OBJCONST UCHAR OBJMEM aName0xF000[] = "Modular device profile\000Module index distance\000Maximum number of modules\000\377"; #endif /** * \brief 0xF000 (Modular Device Profile) variable to handle the object data * * SubIndex 0 * SubIndex 1 (Module Index distance) : 0x10 * SubIndex 2 (Maximum number of Modules) : 3 */ /****************************************************************************** * Object 0xF000 ******************************************************************************/ PROTO TOBJF000 sModulardeviceprofile #ifdef _EVALBOARD_ = {2, 0x10, 0x03} #endif ; #ifdef _OBJD_ /** * \brief 0xF010 (Module profile list) entry descriptions * * Subindex 0<br> * SubIndex x * (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0xF010[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}}; /** * \brief 0xF010 (Module profile list) object name * * no entry names defined because the object is an array (for every entry > 0 "SubIndex xxx" is returned) */ OBJCONST UCHAR OBJMEM aName0xF010[] = "Module profile list"; #endif /** *\brief 0xF010 (Module profile list) variable to handle object data * * SubIndex 0 : 3 * SubIndex 1 : 100 (Digital Input SubProfile) * SubIndex 2 : 200 (Digital Output SubProfile) * SubIndex 3 : 300 (Analog Input SubProfile) */ PROTO TOBJF010 sModulelist #ifdef _EVALBOARD_ = {0x03,{0x64, 0xC8, 0x12C}} #endif ; /** @}*/ #ifdef _OBJD_ PROTO UINT8 ReadObject0x1802( UINT16 index, UINT8 subindex, UINT32 dataSize, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /*if _PIC18 is enabled the object dictionary is fixed defined in coeappl.c*/ /** *\brief EL9800 Application specific object dictionary * */ TOBJECT OBJMEM ApplicationObjDic[] = { /* Enum 0x0800 */ {NULL,NULL, 0x0800, {DEFTYPE_ENUM, 0x02 | (OBJCODE_REC << 8)}, asEntryDesc0x0800, 0, apEnum0800 }, /* Object 0x1601 */ {NULL,NULL, 0x1601, {DEFTYPE_PDOMAPPING, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x1601, aName0x1601, &sDORxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1802 */ {NULL,NULL, 0x1802, {DEFTYPE_RECORD, 9 | (OBJCODE_REC << 8)}, asEntryDesc0x1802, aName0x1802,&TxPDO1802Subindex0, ReadObject0x1802, NULL, 0x0000 }, /* Object 0x1A00 */ {NULL,NULL, 0x1A00, {DEFTYPE_PDOMAPPING, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x1A00, aName0x1A00, &sDITxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1A02 */ {NULL,NULL, 0x1A02, {DEFTYPE_PDOMAPPING, 8 | (OBJCODE_REC << 8)}, asEntryDesc0x1A02, aName0x1A02, &sAITxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1C12 */ {NULL,NULL, 0x1C12, {DEFTYPE_UNSIGNED16, 1 | (OBJCODE_ARR << 8)}, asPDOAssignEntryDesc, aName0x1C12, &sRxPDOassign, NULL, NULL, 0x0000 }, /* Object 0x1C13 */ {NULL,NULL, 0x1C13, {DEFTYPE_UNSIGNED16, 2 | (OBJCODE_ARR << 8)}, asPDOAssignEntryDesc, aName0x1C13, &sTxPDOassign, NULL, NULL, 0x0000 }, /* Object 0x6000 */ {NULL,NULL, 0x6000, {DEFTYPE_RECORD, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x6000, aName0x6000, &sDIInputs, NULL, NULL, 0x0000 }, /* Object 0x6020 */ {NULL,NULL, 0x6020, {DEFTYPE_RECORD, 17 | (OBJCODE_REC << 8)}, asEntryDesc0x6020, aName0x6020, &sAIInputs, NULL, NULL, 0x0000 }, /* Object 0x7010 */ {NULL,NULL, 0x7010, {DEFTYPE_RECORD, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x7010, aName0x7010, &sDOOutputs, NULL, NULL, 0x0000 }, /* Object 0x8020 */ {NULL,NULL, 0x8020, {DEFTYPE_RECORD, 20 | (OBJCODE_REC << 8)}, asEntryDesc0x8020, aName0x8020, &sAISettings, NULL, NULL, 0x0008 }, /* Object 0xF000 */ {NULL,NULL, 0xF000, {DEFTYPE_RECORD, 2 | (OBJCODE_REC << 8)}, asEntryDesc0xF000, aName0xF000, &sModulardeviceprofile, NULL, NULL, 0x0000 }, /* Object 0xF010 */ {NULL,NULL, 0xF010, {DEFTYPE_UNSIGNED32, 3 | (OBJCODE_ARR << 8)}, asEntryDesc0xF010, aName0xF010, &sModulelist, NULL, NULL, 0x0000 }, {NULL,NULL, 0xFFFF, {0, 0}, NULL, NULL, NULL, NULL}}; #endif //#ifdef _OBJD_ PROTO void APPL_Application(void); PROTO void APPL_AckErrorInd(UINT16 stateTrans); PROTO UINT16 APPL_StartMailboxHandler(void); PROTO UINT16 APPL_StopMailboxHandler(void); PROTO UINT16 APPL_StartInputHandler(UINT16 *pIntMask); PROTO UINT16 APPL_StopInputHandler(void); PROTO UINT16 APPL_StartOutputHandler(void); PROTO UINT16 APPL_StopOutputHandler(void); PROTO UINT16 APPL_GenerateMapping(UINT16 *pInputSize,UINT16 *pOutputSize); PROTO void APPL_InputMapping(UINT16* pData); PROTO void APPL_OutputMapping(UINT16* pData); PROTO int ECT_main(void); #undef PROTO /** @}*/
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值