save
This commit is contained in:
commit
b9b2c6ef79
BIN
.vs/ProjectEvaluation/sickblazorapp.metadata.v10.bin
Normal file
BIN
.vs/ProjectEvaluation/sickblazorapp.metadata.v10.bin
Normal file
Binary file not shown.
BIN
.vs/ProjectEvaluation/sickblazorapp.projects.v10.bin
Normal file
BIN
.vs/ProjectEvaluation/sickblazorapp.projects.v10.bin
Normal file
Binary file not shown.
BIN
.vs/ProjectEvaluation/sickblazorapp.strings.v10.bin
Normal file
BIN
.vs/ProjectEvaluation/sickblazorapp.strings.v10.bin
Normal file
Binary file not shown.
BIN
.vs/SickApp.slnx/v18/.wsuo
Normal file
BIN
.vs/SickApp.slnx/v18/.wsuo
Normal file
Binary file not shown.
35
.vs/SickApp.slnx/v18/DocumentLayout.json
Normal file
35
.vs/SickApp.slnx/v18/DocumentLayout.json
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\Admin\\source\\repos\\SickApp\\",
|
||||
"Documents": [],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": -1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c64b9c2-e352-428e-a56d-0ace190b99a6}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
.vs/SickBlazorApp.slnx/DesignTimeBuild/.dtbcache.v2
Normal file
BIN
.vs/SickBlazorApp.slnx/DesignTimeBuild/.dtbcache.v2
Normal file
Binary file not shown.
Binary file not shown.
1026
.vs/SickBlazorApp.slnx/config/applicationhost.config
Normal file
1026
.vs/SickBlazorApp.slnx/config/applicationhost.config
Normal file
File diff suppressed because it is too large
Load Diff
BIN
.vs/SickBlazorApp.slnx/v18/.futdcache.v2
Normal file
BIN
.vs/SickBlazorApp.slnx/v18/.futdcache.v2
Normal file
Binary file not shown.
BIN
.vs/SickBlazorApp.slnx/v18/.suo
Normal file
BIN
.vs/SickBlazorApp.slnx/v18/.suo
Normal file
Binary file not shown.
35
.vs/SickBlazorApp.slnx/v18/DocumentLayout.backup.json
Normal file
35
.vs/SickBlazorApp.slnx/v18/DocumentLayout.backup.json
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\Admin\\source\\repos\\SickApp\\",
|
||||
"Documents": [],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": -1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c64b9c2-e352-428e-a56d-0ace190b99a6}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
35
.vs/SickBlazorApp.slnx/v18/DocumentLayout.json
Normal file
35
.vs/SickBlazorApp.slnx/v18/DocumentLayout.json
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\Admin\\source\\repos\\SickApp\\",
|
||||
"Documents": [],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": -1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c64b9c2-e352-428e-a56d-0ace190b99a6}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
7
.vs/VSWorkspaceState.json
Normal file
7
.vs/VSWorkspaceState.json
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"ExpandedNodes": [
|
||||
""
|
||||
],
|
||||
"SelectedNode": "\\C:\\Users\\Admin\\source\\repos\\SickApp",
|
||||
"PreviewInSolutionExplorer": false
|
||||
}
|
||||
BIN
.vs/slnx.sqlite
Normal file
BIN
.vs/slnx.sqlite
Normal file
Binary file not shown.
3
SickBlazorApp.slnx
Normal file
3
SickBlazorApp.slnx
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<Solution>
|
||||
<Project Path="SickBlazorApp/SickBlazorApp.csproj" />
|
||||
</Solution>
|
||||
13
SickBlazorApp/.config/dotnet-tools.json
Normal file
13
SickBlazorApp/.config/dotnet-tools.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"version": 1,
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-ef": {
|
||||
"version": "10.0.2",
|
||||
"commands": [
|
||||
"dotnet-ef"
|
||||
],
|
||||
"rollForward": false
|
||||
}
|
||||
}
|
||||
}
|
||||
18
SickBlazorApp/Components/AccordionItem.razor
Normal file
18
SickBlazorApp/Components/AccordionItem.razor
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<div class="accordion-item level-@Level">
|
||||
<div class="accordion-header" @onclick="OnToggle">
|
||||
<span>@Title</span>
|
||||
<span class="icon">@((IsOpen) ? "−" : "+")</span>
|
||||
</div>
|
||||
|
||||
<div class="accordion-content @(IsOpen ? "open" : "")">
|
||||
@ChildContent
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter] public string Title { get; set; } = "";
|
||||
[Parameter] public bool IsOpen { get; set; }
|
||||
[Parameter] public int Level { get; set; } = 0;
|
||||
[Parameter] public EventCallback OnToggle { get; set; }
|
||||
[Parameter] public RenderFragment? ChildContent { get; set; }
|
||||
}
|
||||
24
SickBlazorApp/Components/App.razor
Normal file
24
SickBlazorApp/Components/App.razor
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<base href="/" />
|
||||
<ResourcePreloader />
|
||||
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="@Assets["app.css"]" />
|
||||
<link rel="stylesheet" href="@Assets["SickBlazorApp.styles.css"]" />
|
||||
<ImportMap />
|
||||
<link rel="icon" type="image/png" href="favicon.png" />
|
||||
<HeadOutlet @rendermode="InteractiveServer" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<Routes @rendermode="InteractiveServer" />
|
||||
<ReconnectModal />
|
||||
<script src="@Assets["_framework/blazor.web.js"]"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
23
SickBlazorApp/Components/Layout/MainLayout.razor
Normal file
23
SickBlazorApp/Components/Layout/MainLayout.razor
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
@inherits LayoutComponentBase
|
||||
|
||||
<div class="page">
|
||||
<div class="sidebar">
|
||||
<NavMenu />
|
||||
</div>
|
||||
|
||||
<main>
|
||||
<div class="top-row px-4">
|
||||
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
|
||||
</div>
|
||||
|
||||
<article class="content">
|
||||
@Body
|
||||
</article>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<div id="blazor-error-ui" data-nosnippet>
|
||||
An unhandled error has occurred.
|
||||
<a href="." class="reload">Reload</a>
|
||||
<span class="dismiss">🗙</span>
|
||||
</div>
|
||||
98
SickBlazorApp/Components/Layout/MainLayout.razor.css
Normal file
98
SickBlazorApp/Components/Layout/MainLayout.razor.css
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
.page {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
main {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
|
||||
}
|
||||
|
||||
.top-row {
|
||||
background-color: #f7f7f7;
|
||||
border-bottom: 1px solid #d6d5d5;
|
||||
justify-content: flex-end;
|
||||
height: 3.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.top-row ::deep a, .top-row ::deep .btn-link {
|
||||
white-space: nowrap;
|
||||
margin-left: 1.5rem;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.top-row ::deep a:first-child {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
@media (max-width: 640.98px) {
|
||||
.top-row {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.top-row ::deep a, .top-row ::deep .btn-link {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 641px) {
|
||||
.page {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width: 250px;
|
||||
height: 100vh;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.top-row {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.top-row.auth ::deep a:first-child {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.top-row, article {
|
||||
padding-left: 2rem !important;
|
||||
padding-right: 1.5rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
#blazor-error-ui {
|
||||
color-scheme: light only;
|
||||
background: lightyellow;
|
||||
bottom: 0;
|
||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
|
||||
box-sizing: border-box;
|
||||
display: none;
|
||||
left: 0;
|
||||
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
#blazor-error-ui .dismiss {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
right: 0.75rem;
|
||||
top: 0.5rem;
|
||||
}
|
||||
24
SickBlazorApp/Components/Layout/NavMenu.razor
Normal file
24
SickBlazorApp/Components/Layout/NavMenu.razor
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<div class="top-row ps-3 navbar navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="">SickBlazorApp</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
|
||||
|
||||
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
|
||||
<nav class="nav flex-column">
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
||||
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
||||
</NavLink>
|
||||
</div>
|
||||
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="sick">
|
||||
<span class="bi bi-coin nav-icon"></span>Sick Monitor
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
105
SickBlazorApp/Components/Layout/NavMenu.razor.css
Normal file
105
SickBlazorApp/Components/Layout/NavMenu.razor.css
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
.navbar-toggler {
|
||||
appearance: none;
|
||||
cursor: pointer;
|
||||
width: 3.5rem;
|
||||
height: 2.5rem;
|
||||
color: white;
|
||||
position: absolute;
|
||||
top: 0.5rem;
|
||||
right: 1rem;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.navbar-toggler:checked {
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
.top-row {
|
||||
min-height: 3.5rem;
|
||||
background-color: rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.bi {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
margin-right: 0.75rem;
|
||||
top: -1px;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.bi-house-door-fill-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.bi-plus-square-fill-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.bi-list-nested-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
font-size: 0.9rem;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.nav-item:first-of-type {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.nav-item:last-of-type {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
.nav-item ::deep .nav-link {
|
||||
color: #d7d7d7;
|
||||
background: none;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
height: 3rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 3rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.nav-item ::deep a.active {
|
||||
background-color: rgba(255,255,255,0.37);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-item ::deep .nav-link:hover {
|
||||
background-color: rgba(255,255,255,0.1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-scrollable {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar-toggler:checked ~ .nav-scrollable {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (min-width: 641px) {
|
||||
.navbar-toggler {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.nav-scrollable {
|
||||
/* Never collapse the sidebar for wide screens */
|
||||
display: block;
|
||||
|
||||
/* Allow sidebar to scroll for tall menus */
|
||||
height: calc(100vh - 3.5rem);
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
31
SickBlazorApp/Components/Layout/ReconnectModal.razor
Normal file
31
SickBlazorApp/Components/Layout/ReconnectModal.razor
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<script type="module" src="@Assets["Components/Layout/ReconnectModal.razor.js"]"></script>
|
||||
|
||||
<dialog id="components-reconnect-modal" data-nosnippet>
|
||||
<div class="components-reconnect-container">
|
||||
<div class="components-rejoining-animation" aria-hidden="true">
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<p class="components-reconnect-first-attempt-visible">
|
||||
Rejoining the server...
|
||||
</p>
|
||||
<p class="components-reconnect-repeated-attempt-visible">
|
||||
Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.
|
||||
</p>
|
||||
<p class="components-reconnect-failed-visible">
|
||||
Failed to rejoin.<br />Please retry or reload the page.
|
||||
</p>
|
||||
<button id="components-reconnect-button" class="components-reconnect-failed-visible">
|
||||
Retry
|
||||
</button>
|
||||
<p class="components-pause-visible">
|
||||
The session has been paused by the server.
|
||||
</p>
|
||||
<button id="components-resume-button" class="components-pause-visible">
|
||||
Resume
|
||||
</button>
|
||||
<p class="components-resume-failed-visible">
|
||||
Failed to resume the session.<br />Please reload the page.
|
||||
</p>
|
||||
</div>
|
||||
</dialog>
|
||||
157
SickBlazorApp/Components/Layout/ReconnectModal.razor.css
Normal file
157
SickBlazorApp/Components/Layout/ReconnectModal.razor.css
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
.components-reconnect-first-attempt-visible,
|
||||
.components-reconnect-repeated-attempt-visible,
|
||||
.components-reconnect-failed-visible,
|
||||
.components-pause-visible,
|
||||
.components-resume-failed-visible,
|
||||
.components-rejoining-animation {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible,
|
||||
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation,
|
||||
#components-reconnect-modal.components-reconnect-paused .components-pause-visible,
|
||||
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible,
|
||||
#components-reconnect-modal.components-reconnect-retrying,
|
||||
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible,
|
||||
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation,
|
||||
#components-reconnect-modal.components-reconnect-failed,
|
||||
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
#components-reconnect-modal {
|
||||
background-color: white;
|
||||
width: 20rem;
|
||||
margin: 20vh auto;
|
||||
padding: 2rem;
|
||||
border: 0;
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
|
||||
opacity: 0;
|
||||
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
|
||||
animation: components-reconnect-modal-fadeOutOpacity 0.5s both;
|
||||
&[open]
|
||||
|
||||
{
|
||||
animation: components-reconnect-modal-slideUp 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity 0.5s ease-in-out 0.3s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#components-reconnect-modal::backdrop {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
animation: components-reconnect-modal-fadeInOpacity 0.5s ease-in-out;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-slideUp {
|
||||
0% {
|
||||
transform: translateY(30px) scale(0.95);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-fadeInOpacity {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-fadeOutOpacity {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.components-reconnect-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
#components-reconnect-modal p {
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button {
|
||||
border: 0;
|
||||
background-color: #6b9ed2;
|
||||
color: white;
|
||||
padding: 4px 24px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button:hover {
|
||||
background-color: #3b6ea2;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button:active {
|
||||
background-color: #6b9ed2;
|
||||
}
|
||||
|
||||
.components-rejoining-animation {
|
||||
position: relative;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.components-rejoining-animation div {
|
||||
position: absolute;
|
||||
border: 3px solid #0087ff;
|
||||
opacity: 1;
|
||||
border-radius: 50%;
|
||||
animation: components-rejoining-animation 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
||||
}
|
||||
|
||||
.components-rejoining-animation div:nth-child(2) {
|
||||
animation-delay: -0.5s;
|
||||
}
|
||||
|
||||
@keyframes components-rejoining-animation {
|
||||
0% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
4.9% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
5% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
63
SickBlazorApp/Components/Layout/ReconnectModal.razor.js
Normal file
63
SickBlazorApp/Components/Layout/ReconnectModal.razor.js
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
// Set up event handlers
|
||||
const reconnectModal = document.getElementById("components-reconnect-modal");
|
||||
reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
|
||||
|
||||
const retryButton = document.getElementById("components-reconnect-button");
|
||||
retryButton.addEventListener("click", retry);
|
||||
|
||||
const resumeButton = document.getElementById("components-resume-button");
|
||||
resumeButton.addEventListener("click", resume);
|
||||
|
||||
function handleReconnectStateChanged(event) {
|
||||
if (event.detail.state === "show") {
|
||||
reconnectModal.showModal();
|
||||
} else if (event.detail.state === "hide") {
|
||||
reconnectModal.close();
|
||||
} else if (event.detail.state === "failed") {
|
||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
} else if (event.detail.state === "rejected") {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function retry() {
|
||||
document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
|
||||
try {
|
||||
// Reconnect will asynchronously return:
|
||||
// - true to mean success
|
||||
// - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
|
||||
// - exception to mean we didn't reach the server (this can be sync or async)
|
||||
const successful = await Blazor.reconnect();
|
||||
if (!successful) {
|
||||
// We have been able to reach the server, but the circuit is no longer available.
|
||||
// We'll reload the page so the user can continue using the app as quickly as possible.
|
||||
const resumeSuccessful = await Blazor.resumeCircuit();
|
||||
if (!resumeSuccessful) {
|
||||
location.reload();
|
||||
} else {
|
||||
reconnectModal.close();
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// We got an exception, server is currently unavailable
|
||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
}
|
||||
}
|
||||
|
||||
async function resume() {
|
||||
try {
|
||||
const successful = await Blazor.resumeCircuit();
|
||||
if (!successful) {
|
||||
location.reload();
|
||||
}
|
||||
} catch {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function retryWhenDocumentBecomesVisible() {
|
||||
if (document.visibilityState === "visible") {
|
||||
await retry();
|
||||
}
|
||||
}
|
||||
36
SickBlazorApp/Components/Pages/Error.razor
Normal file
36
SickBlazorApp/Components/Pages/Error.razor
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
@page "/Error"
|
||||
@using System.Diagnostics
|
||||
|
||||
<PageTitle>Error</PageTitle>
|
||||
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
|
||||
@code{
|
||||
[CascadingParameter]
|
||||
private HttpContext? HttpContext { get; set; }
|
||||
|
||||
private string? RequestId { get; set; }
|
||||
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
|
||||
protected override void OnInitialized() =>
|
||||
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
|
||||
}
|
||||
124
SickBlazorApp/Components/Pages/Home.razor
Normal file
124
SickBlazorApp/Components/Pages/Home.razor
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
@page "/"
|
||||
|
||||
<PageTitle>Home</PageTitle>
|
||||
|
||||
<div class="page-header">
|
||||
<div class="page-title">BCG08-C1QM0371 | EcoLine</div>
|
||||
<div class="page-subtitle"> WIRE DRAW ENCODERS</div>
|
||||
</div>
|
||||
|
||||
<div class="product-container">
|
||||
<div class="product-image">
|
||||
<img src="Images/encoder.jpg" alt="BCG08-C1QM0371" />
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<AccordionItem Title="Tổng quan" IsOpen="@(OpenMainSection == "overview")"
|
||||
OnToggle="@(() => ToggleSection("overview"))">
|
||||
<p>
|
||||
Bộ mã hóa kéo dây BCG08-C1QM0371 thuộc dòng EcoLine của SICK,
|
||||
là thiết bị đo chiều dài và vị trí được thiết kế cho các ứng dụng công nghiệp.
|
||||
Sản phẩm sử dụng cơ cấu kéo dây kết hợp encoder tuyệt đối,
|
||||
cho phép đo chính xác vị trí tuyến tính trong các hệ thống chuyển động.
|
||||
</p>
|
||||
<p>
|
||||
Thiết bị phù hợp lắp đặt trong các dây chuyền sản xuất, hệ thống nâng hạ,
|
||||
máy công cụ và các ứng dụng tự động hóa yêu cầu độ tin cậy cao.
|
||||
Với giao tiếp CANopen, BCG08-C1QM0371 dễ dàng tích hợp với PLC
|
||||
và các hệ điều khiển công nghiệp phổ biến hiện nay.
|
||||
</p>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem Title="Thông số kỹ thuật" Level="0" IsOpen="@(OpenMainSection == "spec")"
|
||||
OnToggle="@(() => ToggleSection("spec"))">
|
||||
<AccordionItem Title="Hiệu năng" Level="1" IsOpen="IsPerformanceOpen"
|
||||
OnToggle="@(() => IsPerformanceOpen = !IsPerformanceOpen)">
|
||||
<ul>
|
||||
<li>Phạm vi đo: 1m -> 3m </li>
|
||||
<li>Bộ mã hoá: tuyệt đối</li>
|
||||
<li>Độ phân giải: 0.01mm</li>
|
||||
<li>Độ lặp lại: ≤ 0.2 mm</li>
|
||||
<li>Độ tuyến tính: ≤ ± 2 mm</li>
|
||||
<li>Độ trễ: ≤ 0.4 mm</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
<AccordionItem Title="Giao tiếp" Level="1" IsOpen="IsCommunicationOpen"
|
||||
OnToggle="@(() => IsCommunicationOpen = !IsCommunicationOpen)">
|
||||
<ul>
|
||||
<li>Giao thức truyền thông: Canopen</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
<AccordionItem Title="Điện tử" Level="1" IsOpen="IsElectronicsOpen"
|
||||
OnToggle="@(() => IsElectronicsOpen = !IsElectronicsOpen)">
|
||||
<ul>
|
||||
<li>Kiểu kết nối: đầu nối đực, M12 - 5 chân, chuẩn công nghiệp, dễ đấu PLC /CANopen</li>
|
||||
<li>Điện áp cấp nguồn: 10V -> 30V</li>
|
||||
<li>Công suất tiêu thụ: ≤ 1.5 W (khi không tải)</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
<AccordionItem Title="Cơ khí" Level="1" IsOpen="IsMechanicalOpen"
|
||||
OnToggle="@(() => IsMechanicalOpen = !IsMechanicalOpen)">
|
||||
<ul>
|
||||
<li>Khối lượng thiết bị: 0.37 kg</li>
|
||||
<li>Vật liệu dây đo: Thép không gỉ bện mềm, chuẩn 1.4401/V4A</li>
|
||||
<li>Đường kính dây thép đo: 0.55 mm</li>
|
||||
<li>Khối lượng dây: 1.2 g/m</li>
|
||||
<li>Vỏ & cơ cấu cuộn dây: Nhựa, Noryl</li>
|
||||
<li>Lực lò xo kéo dây về: 3.3 N … 4.4 N</li>
|
||||
<li>Chiều dài dây trên mỗi vòng quay: 230 mm</li>
|
||||
<li>Tuổi thọ cơ cấu kéo dây: ~ 1,000,000 chu kỳ</li>
|
||||
<li>Chiều dài dây thực tế: 3.2 m</li>
|
||||
<li>Gia tốc của dây: 10m/s²</li>
|
||||
<li>Tốc độ làm việc: 6 m/s</li>
|
||||
<li>Encoder gắn bên trong: AHM36 CANopen, AHM36A-S3CC014x12, 1065999</li>
|
||||
<li>Hộp kéo dây: MRA-G080-103D3, 5322778</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
<AccordionItem Title="Dữ liệu môi trường" Level="1" IsOpen="IsEnvironmentOpen"
|
||||
OnToggle="@(() => IsEnvironmentOpen = !IsEnvironmentOpen)">
|
||||
<ul>
|
||||
<li>Khả năng chống nhiễu điện từ: EN 61000-6-2, EN 61000-6-3</li>
|
||||
<li>Cấp bảo vệ: IP50 (hộp kéo dây), IP66/IP67 (bộ mã hóa)</li>
|
||||
<li>Nhiệt độ hoạt động: –30 °C ... +70 °C</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem Title="Cấu hình" IsOpen="@(OpenMainSection == "config")"
|
||||
OnToggle="@(() => ToggleSection("config"))">
|
||||
<ul>
|
||||
<li>Bitrate: 20k -> 1M bit/s</li>
|
||||
<li>Node ID: 1 -> 127</li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
|
||||
<AccordionItem Title="Tài liệu" IsOpen="@(OpenMainSection == "doc")"
|
||||
OnToggle="@(() => ToggleSection("doc"))">
|
||||
<ul>
|
||||
<li><a href="https://www.sick.com/media/pdf/1/71/371/dataSheet_BCG08-C1QM0371_1068867_en.pdf" target="_blank">Datasheet PDF</a></li>
|
||||
<li><a href="https://www.sick.com/media/docs/3/93/193/operating_instructions_ahs_ahm36_canopen_ahs_ahm36_canopen_inox_absolute_encoder_en_im0055193.pdf" target="_blank">Full Documentation</a></li>
|
||||
</ul>
|
||||
</AccordionItem>
|
||||
|
||||
</div>
|
||||
<div class="go-to-monitor" style="margin-top: 2rem; text-align: right;">
|
||||
<a href="/sick" class="btn btn-primary btn-lg">
|
||||
Go to Monitor <i class="bi bi-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@code {
|
||||
string? OpenMainSection;
|
||||
bool IsPerformanceOpen;
|
||||
bool IsCommunicationOpen;
|
||||
bool IsElectronicsOpen;
|
||||
bool IsMechanicalOpen;
|
||||
bool IsEnvironmentOpen;
|
||||
|
||||
void ToggleSection(string section)
|
||||
{
|
||||
OpenMainSection = OpenMainSection == section ? null : section;
|
||||
}
|
||||
}
|
||||
|
||||
5
SickBlazorApp/Components/Pages/NotFound.razor
Normal file
5
SickBlazorApp/Components/Pages/NotFound.razor
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
@page "/not-found"
|
||||
@layout MainLayout
|
||||
|
||||
<h3>Not Found</h3>
|
||||
<p>Sorry, the content you are looking for does not exist.</p>
|
||||
293
SickBlazorApp/Components/Pages/Sick.razor
Normal file
293
SickBlazorApp/Components/Pages/Sick.razor
Normal file
|
|
@ -0,0 +1,293 @@
|
|||
@page "/sick"
|
||||
@implements IDisposable
|
||||
|
||||
@inject IOptions<CanBusOptions> CanOptions
|
||||
@inject ICanBusService CanService
|
||||
@inject IJSRuntime JS
|
||||
|
||||
|
||||
<div class="encoder-container">
|
||||
<div class="encoder-card">
|
||||
<!-- HEADER -->
|
||||
<div class="encoder-header">
|
||||
<div class="encoder-title">Sick Encoder Monitor</div>
|
||||
|
||||
<div class="encoder-actions">
|
||||
<button class="btn btn-start @( _starting ? "loading" : "" )"
|
||||
disabled="@(_starting || _applying)"
|
||||
@onclick="OnStartClicked">
|
||||
@(_starting ? "Starting..." : "Start")
|
||||
</button>
|
||||
|
||||
<button class="btn btn-stop @( _stopping ? "loading" : "" )"
|
||||
disabled="@(_stopping || _applying)"
|
||||
@onclick="OnStopClicked">
|
||||
@(_stopping ? "Stopping..." : "Stop")
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- TABLE -->
|
||||
<table class="encoder-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>CAN-ID</th>
|
||||
<th>Length</th>
|
||||
<th>Data</th>
|
||||
<th>Position (mm)</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach (var f in _frames.Values.OrderBy(f => f.CobId))
|
||||
{
|
||||
<tr>
|
||||
<td class="encoder-id">@($"0x{f.CobId:X3}")</td>
|
||||
<td>@f.Length</td>
|
||||
<td class="encoder-data">@f.DataHex</td>
|
||||
<td class="encoder-pos">
|
||||
@(f.PositionMm.HasValue? f.PositionMm.Value.ToString("F2") : "-")
|
||||
</td>
|
||||
<td class="encoder-time">@f.Timestamp.ToString("HH:mm:ss.fff")</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
<!-- STATUS -->
|
||||
<div class="encoder-status @StateClass"> Node State: @_nodeState | Bitrate: @(CurrentBitrate / 1000) kbit/s | Node ID: @CurrentNodeId</div>
|
||||
<div class="bitrate-group">
|
||||
<label class="bitrate-label">Bitrate</label>
|
||||
|
||||
<select @bind="_selectedBitrate" class="bitrate-select">
|
||||
<option value="1000000">1000 kbit/s</option>
|
||||
<option value="800000">800 kbit/s</option>
|
||||
<option value="500000">500 kbit/s</option>
|
||||
<option value="250000">250 kbit/s</option>
|
||||
<option value="125000">125 kbit/s</option>
|
||||
<option value="100000">100 kbit/s</option>
|
||||
<option value="50000">50 kbit/s</option>
|
||||
<option value="20000">20 kbit/s</option>
|
||||
</select>
|
||||
|
||||
<button class="btn btn-apply @( _applying ? "loading" : "" )"
|
||||
disabled="@(_starting || _applying)"
|
||||
@onclick="OnApplyClicked">
|
||||
@(_applying ? "Applying..." : "Apply Bitrate")
|
||||
</button>
|
||||
<label class="nodeid-label">Node ID (1–127)</label>
|
||||
|
||||
<input type="number"
|
||||
min="1"
|
||||
max="127"
|
||||
@bind="_inputNodeId"
|
||||
placeholder="@CurrentNodeId"
|
||||
class="nodeid-input" />
|
||||
|
||||
<button class="btn btn-apply"
|
||||
disabled="@(!_inputNodeId.HasValue)"
|
||||
@onclick="OnApplyNodeIdClicked">
|
||||
Apply Node ID
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
private PositionPdo? _current;
|
||||
private CanNodeState _nodeState = CanNodeState.Unknown;
|
||||
private int CurrentBitrate => CanService.CurrentBitrate;
|
||||
private readonly Dictionary<uint, CanFrame> _frames = new();
|
||||
private int _selectedBitrate;
|
||||
private bool _bitrateApplied = false;
|
||||
private bool _starting;
|
||||
private bool _stopping;
|
||||
private bool _applying;
|
||||
private int? _inputNodeId;
|
||||
private byte CurrentNodeId => CanService.CurrentNodeId;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
CanService.PositionReceived += OnPositionReceived;
|
||||
CanService.NodeStateChanged += OnNodeStateChanged;
|
||||
CanService.FrameReceived += OnFrameReceived;
|
||||
CanService.NodeIdChanged += OnNodeIdChanged;
|
||||
|
||||
_selectedBitrate = CanService.CurrentBitrate;
|
||||
}
|
||||
|
||||
private async Task Start()
|
||||
{
|
||||
// ❗ LUÔN init lại để đảm bảo COB-ID & state sạch
|
||||
await CanService.InitAsync();
|
||||
|
||||
// ❗ Reset node theo Node ID MỚI
|
||||
CanService.SendNmtReset(CurrentNodeId);
|
||||
await Task.Delay(800);
|
||||
|
||||
CanService.SendNmtStart(CurrentNodeId);
|
||||
|
||||
// ❗ Start read với Node ID MỚI
|
||||
CanService.Start();
|
||||
}
|
||||
|
||||
private Task Stop()
|
||||
{
|
||||
CanService.SendNmtStop(CurrentNodeId);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private void OnPositionReceived(object? sender, PositionPdo e)
|
||||
{
|
||||
_ = InvokeAsync(() =>
|
||||
{
|
||||
_current = e;
|
||||
StateHasChanged();
|
||||
});
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
CanService.PositionReceived -= OnPositionReceived;
|
||||
CanService.NodeStateChanged -= OnNodeStateChanged;
|
||||
CanService.FrameReceived -= OnFrameReceived;
|
||||
CanService.NodeIdChanged -= OnNodeIdChanged;
|
||||
CanService.Stop();
|
||||
}
|
||||
|
||||
private void OnNodeStateChanged(object? sender, CanNodeState state)
|
||||
{
|
||||
_ = InvokeAsync(() =>
|
||||
{
|
||||
_nodeState = state;
|
||||
StateHasChanged();
|
||||
});
|
||||
}
|
||||
|
||||
private string StateClass => _nodeState switch
|
||||
{
|
||||
CanNodeState.Operational => "state-op",
|
||||
CanNodeState.PreOperational => "state-preop",
|
||||
CanNodeState.Stopped => "state-stop",
|
||||
CanNodeState.Timeout => "state-timeout",
|
||||
_ => "state-unknown"
|
||||
};
|
||||
|
||||
private void OnFrameReceived(object? sender, CanFrame frame)
|
||||
{
|
||||
_ = InvokeAsync(() =>
|
||||
{
|
||||
// mỗi CAN-ID chỉ giữ frame mới nhất
|
||||
_frames[frame.CobId] = frame;
|
||||
StateHasChanged();
|
||||
});
|
||||
}
|
||||
|
||||
private async Task ApplyBitrate()
|
||||
{
|
||||
await CanService.ApplyBitrateAsync(
|
||||
CurrentNodeId,
|
||||
_selectedBitrate
|
||||
);
|
||||
|
||||
// UI chỉ báo PreOp / Stopped
|
||||
_nodeState = CanNodeState.PreOperational;
|
||||
}
|
||||
|
||||
private async Task OnApplyNodeIdClicked()
|
||||
{
|
||||
if (!_inputNodeId.HasValue)
|
||||
return;
|
||||
|
||||
byte newNodeId = (byte)_inputNodeId.Value;
|
||||
byte oldNodeId = CanService.CurrentNodeId;
|
||||
|
||||
await CanService.ApplyNodeIdAsync(oldNodeId, newNodeId);
|
||||
|
||||
_inputNodeId = null; // reset input
|
||||
}
|
||||
|
||||
private async Task OnStartClicked()
|
||||
{
|
||||
if (_starting) return;
|
||||
|
||||
_starting = true;
|
||||
StateHasChanged();
|
||||
|
||||
try
|
||||
{
|
||||
// ✅ Nếu CHƯA Apply bitrate → dùng bitrate hiện tại
|
||||
if (!_bitrateApplied)
|
||||
{
|
||||
_selectedBitrate = CanService.CurrentBitrate;
|
||||
}
|
||||
|
||||
await Start();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_starting = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnStopClicked()
|
||||
{
|
||||
if (_stopping) return;
|
||||
|
||||
_stopping = true;
|
||||
StateHasChanged();
|
||||
|
||||
try
|
||||
{
|
||||
await Stop();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_stopping = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnApplyClicked()
|
||||
{
|
||||
if (_applying) return;
|
||||
|
||||
_applying = true;
|
||||
StateHasChanged();
|
||||
|
||||
try
|
||||
{
|
||||
await ApplyBitrate();
|
||||
|
||||
// ✅ Đánh dấu đã Apply
|
||||
_bitrateApplied = true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_applying = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNodeIdChanged(object? sender, byte newNodeId)
|
||||
{
|
||||
_ = InvokeAsync(() =>
|
||||
{
|
||||
// 🔥 XÓA TOÀN BỘ FRAME CŨ
|
||||
_frames.Clear();
|
||||
|
||||
// reset input
|
||||
_inputNodeId = null;
|
||||
|
||||
StateHasChanged();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
6
SickBlazorApp/Components/Routes.razor
Normal file
6
SickBlazorApp/Components/Routes.razor
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<Router AppAssembly="typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
|
||||
<Found Context="routeData">
|
||||
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
||||
<FocusOnNavigate RouteData="routeData" Selector="h1" />
|
||||
</Found>
|
||||
</Router>
|
||||
16
SickBlazorApp/Components/_Imports.razor
Normal file
16
SickBlazorApp/Components/_Imports.razor
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
@using System.Net.Http
|
||||
@using System.Net.Http.Json
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.JSInterop
|
||||
@using Microsoft.Extensions.Options
|
||||
@using SickBlazorApp
|
||||
@using SickBlazorApp.Components
|
||||
@using SickBlazorApp.Components.Layout
|
||||
@using SickBlazorApp.Options
|
||||
@using SickBlazorApp.Models
|
||||
@using SickBlazorApp.Services
|
||||
@using SickBlazorApp.Services.Windows
|
||||
13
SickBlazorApp/Models/CanFrame.cs
Normal file
13
SickBlazorApp/Models/CanFrame.cs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
namespace SickBlazorApp.Models;
|
||||
|
||||
public sealed class CanFrame
|
||||
{
|
||||
public uint CobId { get; init; }
|
||||
public int Length { get; init; }
|
||||
public string DataHex { get; init; } = string.Empty;
|
||||
public DateTime Timestamp { get; init; }
|
||||
|
||||
// Optional
|
||||
public double? PositionMm { get; init; }
|
||||
public string? Description { get; init; }
|
||||
}
|
||||
11
SickBlazorApp/Models/CanNodeStart.cs
Normal file
11
SickBlazorApp/Models/CanNodeStart.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
namespace SickBlazorApp.Models;
|
||||
|
||||
public enum CanNodeState
|
||||
{
|
||||
Unknown = 0,
|
||||
Bootup,
|
||||
PreOperational,
|
||||
Operational,
|
||||
Stopped,
|
||||
Timeout
|
||||
}
|
||||
8
SickBlazorApp/Models/EncoderPosition.cs
Normal file
8
SickBlazorApp/Models/EncoderPosition.cs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
namespace SickBlazorApp.Models;
|
||||
|
||||
public sealed class EncoderPosition
|
||||
{
|
||||
public uint Raw { get; set; }
|
||||
public double PositionMm { get; set; }
|
||||
public DateTime Time { get; set; }
|
||||
}
|
||||
15
SickBlazorApp/Models/PositionPdo.cs
Normal file
15
SickBlazorApp/Models/PositionPdo.cs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
namespace SickBlazorApp.Models
|
||||
{
|
||||
public sealed class PositionPdo
|
||||
{
|
||||
public uint CobId { get; init; }
|
||||
public int Length { get; init; } // DLC
|
||||
public string DataHex { get; init; } = string.Empty; // "0B C4 CE 03 08 00 00 00"
|
||||
|
||||
public uint RawValue { get; init; }
|
||||
|
||||
public double PositionMm { get; init; }
|
||||
|
||||
public DateTime Timestamp { get; init; }
|
||||
}
|
||||
}
|
||||
9
SickBlazorApp/Options/CanBusOptions.cs
Normal file
9
SickBlazorApp/Options/CanBusOptions.cs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
namespace SickBlazorApp.Options
|
||||
{
|
||||
public sealed class CanBusOptions
|
||||
{
|
||||
public string Channel { get; set; } = string.Empty;
|
||||
public uint PositionBaseCobId { get; set; }
|
||||
public double PositionScale { get; set; }
|
||||
}
|
||||
}
|
||||
34
SickBlazorApp/Program.cs
Normal file
34
SickBlazorApp/Program.cs
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
using SickBlazorApp.Components;
|
||||
using SickBlazorApp.Options;
|
||||
using SickBlazorApp.Services;
|
||||
using SickBlazorApp.Services.Windows;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.Configure<CanBusOptions>(
|
||||
builder.Configuration.GetSection("CanBus"));
|
||||
|
||||
builder.Services.AddSingleton<ICanBusService, PcanCanService>();
|
||||
builder.Services.AddRazorComponents()
|
||||
.AddInteractiveServerComponents();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||
app.UseHsts();
|
||||
}
|
||||
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseAntiforgery();
|
||||
|
||||
app.MapStaticAssets();
|
||||
app.MapRazorComponents<App>()
|
||||
.AddInteractiveServerRenderMode();
|
||||
|
||||
app.Run();
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<DeleteExistingFiles>false</DeleteExistingFiles>
|
||||
<ExcludeApp_Data>false</ExcludeApp_Data>
|
||||
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
|
||||
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
|
||||
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
||||
<PublishProvider>FileSystem</PublishProvider>
|
||||
<PublishUrl>D:\BlazorApp\SickEncoder</PublishUrl>
|
||||
<WebPublishMethod>FileSystem</WebPublishMethod>
|
||||
<_TargetId>Folder</_TargetId>
|
||||
<SiteUrlToLaunchAfterPublish />
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
|
||||
<ProjectGuid>354be2d0-9d54-4df9-1b09-6c8797f7c921</ProjectGuid>
|
||||
<SelfContained>false</SelfContained>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<_PublishTargetUrl>D:\BlazorApp\SickEncoder</_PublishTargetUrl>
|
||||
<History>True|2026-01-22T03:29:13.5042732Z||;</History>
|
||||
<LastFailureDetails />
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
23
SickBlazorApp/Properties/launchSettings.json
Normal file
23
SickBlazorApp/Properties/launchSettings.json
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5028",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7296;http://localhost:5028",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
123
SickBlazorApp/Services/EdsParser.cs
Normal file
123
SickBlazorApp/Services/EdsParser.cs
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
namespace SickBlazorApp.Services
|
||||
{
|
||||
public class EdsParser
|
||||
{
|
||||
private readonly Dictionary<string, Dictionary<string, string>> _sections = new();
|
||||
|
||||
public EdsParser(string edsPath)
|
||||
{
|
||||
LoadEds(edsPath);
|
||||
}
|
||||
|
||||
private void LoadEds(string edsPath)
|
||||
{
|
||||
// Đọc embed resource
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
using var stream = assembly.GetManifestResourceStream(edsPath);
|
||||
if (stream == null) throw new FileNotFoundException("EDS not found: " + edsPath);
|
||||
|
||||
using var reader = new StreamReader(stream);
|
||||
string? line;
|
||||
string currentSection = string.Empty;
|
||||
var currentSub = new Dictionary<string, string>();
|
||||
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
line = line.Trim();
|
||||
if (string.IsNullOrEmpty(line) || line.StartsWith(";")) continue;
|
||||
|
||||
if (line.StartsWith("[") && line.EndsWith("]"))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(currentSection))
|
||||
{
|
||||
_sections[currentSection] = currentSub;
|
||||
}
|
||||
currentSection = line[1..^1].ToLower(); // e.g. "1000" hoặc "1800sub1"
|
||||
currentSub = new Dictionary<string, string>();
|
||||
}
|
||||
else if (line.Contains("="))
|
||||
{
|
||||
var parts = line.Split('=', 2);
|
||||
var key = parts[0].Trim().ToLower();
|
||||
var value = parts[1].Trim();
|
||||
currentSub[key] = value;
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(currentSection))
|
||||
{
|
||||
_sections[currentSection] = currentSub;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper lấy giá trị
|
||||
public string GetValue(string section, string key)
|
||||
{
|
||||
section = section.ToLower();
|
||||
if (_sections.TryGetValue(section, out var sub) && sub.TryGetValue(key.ToLower(), out var value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// Ví dụ lấy TPDO1 COB-ID base (trả $nodeid + 0x180 → parse 0x180)
|
||||
public uint GetTpdo1BaseCobId()
|
||||
{
|
||||
var cob = GetValue("1800sub1", "defaultvalue"); // "$NodeID + 0x180"
|
||||
var hexPart = cob.Split('+')[1].Trim(); // "0x180"
|
||||
return Convert.ToUInt32(hexPart, 16); // 384 (0x180)
|
||||
}
|
||||
|
||||
// Lấy access-code (EDS không default, nhưng manual 0x98127634 → hard-code tạm hoặc thêm param)
|
||||
public uint GetAccessCode()
|
||||
{
|
||||
// EDS không có default cho 0x2009sub1 → dùng từ manual
|
||||
return 0x98127634; // Cập nhật từ EDS/manual
|
||||
}
|
||||
|
||||
// Tính scale (mm per count)
|
||||
public double GetPositionScale()
|
||||
{
|
||||
// Lấy resolution per revolution từ EDS (0x6001 default = 0x4000 = 16384 counts/rev)
|
||||
var resPerRevHex = GetValue("6001", "defaultvalue") ?? "0x4000";
|
||||
var countsPerRev = Convert.ToUInt32(resPerRevHex, 16); // 16384
|
||||
|
||||
// Thông số dây kéo BCG08: 230 mm per revolution (từ datasheet SICK BCG08 series)
|
||||
const double mmPerRev = 230.0; // chuẩn từ datasheet wire draw
|
||||
|
||||
// Scale = mm per count = mm/rev / counts/rev
|
||||
double scale = mmPerRev / countsPerRev;
|
||||
|
||||
// Kết quả ≈ 230 / 16384 ≈ 0.014038 mm/count
|
||||
return scale;
|
||||
}
|
||||
|
||||
// Lấy baudrate map (index → bitrate)
|
||||
public Dictionary<byte, int> GetBaudrateMap()
|
||||
{
|
||||
var map = new Dictionary<byte, int>();
|
||||
byte index = 0;
|
||||
if (GetValue("deviceinfo", "baudrate_1000") == "1") map[index++] = 1000000;
|
||||
if (GetValue("deviceinfo", "baudrate_800") == "1") map[index++] = 800000;
|
||||
if (GetValue("deviceinfo", "baudrate_500") == "1") map[index++] = 500000;
|
||||
if (GetValue("deviceinfo", "baudrate_250") == "1") map[index++] = 250000;
|
||||
if (GetValue("deviceinfo", "baudrate_125") == "1") map[index++] = 125000;
|
||||
if (GetValue("deviceinfo", "baudrate_100") == "1") map[index++] = 100000;
|
||||
if (GetValue("deviceinfo", "baudrate_50") == "1") map[index++] = 50000;
|
||||
if (GetValue("deviceinfo", "baudrate_20") == "1") map[index++] = 20000;
|
||||
if (GetValue("deviceinfo", "baudrate_10") == "1") map[index++] = 10000;
|
||||
return map;
|
||||
}
|
||||
|
||||
// Kiểm tra position mapping (byte 0-3 uint32?)
|
||||
public bool IsPositionMappedToTpdo1()
|
||||
{
|
||||
var mapping = GetValue("1a00sub1", "defaultvalue"); // 0x60040020
|
||||
return mapping == "0x60040020"; // Position 32-bit
|
||||
}
|
||||
}
|
||||
}
|
||||
27
SickBlazorApp/Services/ICanBusService.cs
Normal file
27
SickBlazorApp/Services/ICanBusService.cs
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
using SickBlazorApp.Models;
|
||||
|
||||
namespace SickBlazorApp.Services;
|
||||
|
||||
public interface ICanBusService : IDisposable
|
||||
{
|
||||
event EventHandler<PositionPdo>? PositionReceived;
|
||||
|
||||
event EventHandler<CanNodeState>? NodeStateChanged;
|
||||
|
||||
event EventHandler<CanFrame>? FrameReceived;
|
||||
|
||||
event EventHandler<byte>? NodeIdChanged;
|
||||
|
||||
Task InitAsync();
|
||||
void Start();
|
||||
void Stop();
|
||||
void SendNmtStart(byte nodeId);
|
||||
void SendNmtReset(byte nodeId);
|
||||
void SendNmtStop(byte nodeId);
|
||||
void ChangeBitrate(int bitrate);
|
||||
Task ApplyBitrateAsync(byte nodeId, int bitrate);
|
||||
int CurrentBitrate { get; }
|
||||
Task ApplyNodeIdAsync(byte oldNodeId, byte newNodeId);
|
||||
byte CurrentNodeId { get; }
|
||||
|
||||
}
|
||||
456
SickBlazorApp/Services/Windows/PcanCanService.cs
Normal file
456
SickBlazorApp/Services/Windows/PcanCanService.cs
Normal file
|
|
@ -0,0 +1,456 @@
|
|||
using Microsoft.Extensions.Options;
|
||||
using Peak.Can.Basic.BackwardCompatibility;
|
||||
using SickBlazorApp.Models;
|
||||
using SickBlazorApp.Options;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SickBlazorApp.Services.Windows;
|
||||
|
||||
public sealed class PcanCanService : ICanBusService
|
||||
{
|
||||
private readonly CanBusOptions _options;
|
||||
private readonly EdsParser _edsParser; // Parser EDS mới
|
||||
private CancellationTokenSource? _cts;
|
||||
private bool _initialized;
|
||||
|
||||
public event EventHandler<PositionPdo>? PositionReceived;
|
||||
private DateTime _lastHeartbeat = DateTime.MinValue;
|
||||
private readonly TimeSpan _heartbeatTimeout = TimeSpan.FromSeconds(2);
|
||||
public event EventHandler<CanNodeState>? NodeStateChanged;
|
||||
private DateTime _lastSeen = DateTime.MinValue;
|
||||
private CanNodeState _currentState = CanNodeState.Unknown;
|
||||
public event EventHandler<CanFrame>? FrameReceived;
|
||||
private int _currentBitrate;
|
||||
public int CurrentBitrate { get; private set; }
|
||||
private bool _waitingStopAck = false;
|
||||
private bool _autoResumeEnabled = true;
|
||||
private DateTime _lastBootup = DateTime.MinValue;
|
||||
private byte _currentNodeId;
|
||||
public byte CurrentNodeId => _currentNodeId;
|
||||
public byte GetCurrentNodeId() => _currentNodeId;
|
||||
public event EventHandler<byte>? NodeIdChanged;
|
||||
|
||||
private Dictionary<byte, int> _baudMap = new(); // Map baudrate động từ EDS
|
||||
|
||||
public PcanCanService(IOptions<CanBusOptions> options)
|
||||
{
|
||||
_options = options.Value;
|
||||
|
||||
_edsParser = new EdsParser("SickBlazorApp.eds.AHM36_I_CO.eds"); // hard-code tên resource
|
||||
|
||||
_options.PositionBaseCobId = _edsParser.GetTpdo1BaseCobId(); // vẫn động
|
||||
_options.PositionScale = _edsParser.GetPositionScale(); // động từ 230 mm/rev
|
||||
|
||||
if (!_edsParser.IsPositionMappedToTpdo1())
|
||||
throw new InvalidOperationException("Position mapping sai");
|
||||
|
||||
_baudMap = _edsParser.GetBaudrateMap();
|
||||
CurrentBitrate = _currentBitrate;
|
||||
}
|
||||
|
||||
// ================= INIT =================
|
||||
public Task InitAsync()
|
||||
{
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
|
||||
if (_initialized)
|
||||
return Task.CompletedTask;
|
||||
|
||||
var baud = MapBaudrate(_currentBitrate);
|
||||
var status = PCANBasic.Initialize(channel, baud);
|
||||
|
||||
if (status != TPCANStatus.PCAN_ERROR_OK)
|
||||
throw new InvalidOperationException($"PCAN init failed: {status}");
|
||||
|
||||
_initialized = true;
|
||||
CurrentBitrate = _currentBitrate;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
// ================= START READ =================
|
||||
public void Start()
|
||||
{
|
||||
if (_cts != null)
|
||||
return;
|
||||
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
uint pdoCobId = GetPositionCobId();
|
||||
uint heartbeatCobId = 0x700u + _currentNodeId;
|
||||
double scale = _options.PositionScale;
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
while (!_cts!.IsCancellationRequested)
|
||||
{
|
||||
TPCANMsg msg;
|
||||
TPCANTimestamp ts;
|
||||
|
||||
var result = PCANBasic.Read(channel, out msg, out ts);
|
||||
|
||||
// ================= BOOT-UP DETECT =================
|
||||
if (msg.ID >= 0x701 && msg.ID <= 0x77F && msg.LEN >= 1 && msg.DATA[0] == 0x00)
|
||||
{
|
||||
byte detectedNodeId = (byte)(msg.ID - 0x700);
|
||||
if (_currentNodeId != detectedNodeId)
|
||||
{
|
||||
_currentNodeId = detectedNodeId;
|
||||
NodeIdChanged?.Invoke(this, detectedNodeId);
|
||||
}
|
||||
}
|
||||
|
||||
if (result != TPCANStatus.PCAN_ERROR_OK)
|
||||
{
|
||||
CheckHeartbeatTimeout();
|
||||
Thread.Sleep(5);
|
||||
continue;
|
||||
}
|
||||
|
||||
string dataHex = string.Join(" ", msg.DATA.Take(msg.LEN).Select(b => b.ToString("X2")));
|
||||
FrameReceived?.Invoke(this, new CanFrame
|
||||
{
|
||||
CobId = msg.ID,
|
||||
Length = msg.LEN,
|
||||
DataHex = dataHex,
|
||||
Timestamp = DateTime.Now
|
||||
});
|
||||
|
||||
if (!msg.MSGTYPE.HasFlag(TPCANMessageType.PCAN_MESSAGE_STANDARD))
|
||||
continue;
|
||||
|
||||
// ================= HEARTBEAT =================
|
||||
if (msg.ID >= 0x701 && msg.ID <= 0x77F && msg.LEN >= 1)
|
||||
{
|
||||
_lastHeartbeat = DateTime.Now;
|
||||
_lastSeen = DateTime.Now;
|
||||
|
||||
byte nodeIdFromHb = (byte)(msg.ID - 0x700);
|
||||
byte hbValue = msg.DATA[0];
|
||||
|
||||
if (_currentNodeId != nodeIdFromHb)
|
||||
{
|
||||
_currentNodeId = nodeIdFromHb;
|
||||
NodeIdChanged?.Invoke(this, nodeIdFromHb);
|
||||
}
|
||||
|
||||
var hbState = hbValue switch
|
||||
{
|
||||
0x00 => CanNodeState.Bootup,
|
||||
0x04 => CanNodeState.Stopped,
|
||||
0x05 => CanNodeState.Operational,
|
||||
0x7F => CanNodeState.PreOperational,
|
||||
_ => CanNodeState.Unknown
|
||||
};
|
||||
|
||||
UpdateState(hbState);
|
||||
|
||||
if (_autoResumeEnabled && !_waitingStopAck && hbState == CanNodeState.Bootup)
|
||||
{
|
||||
if (DateTime.Now - _lastBootup > TimeSpan.FromSeconds(1))
|
||||
{
|
||||
_lastBootup = DateTime.Now;
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(500);
|
||||
SendNmtStart(_currentNodeId);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (_waitingStopAck && hbState == CanNodeState.Stopped)
|
||||
{
|
||||
_waitingStopAck = false;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// ================= POSITION PDO =================
|
||||
if (msg.ID < 0x180 || msg.ID > 0x1FF || msg.LEN < 6)
|
||||
continue;
|
||||
|
||||
_lastSeen = DateTime.Now;
|
||||
|
||||
uint raw = (uint)(
|
||||
msg.DATA[0] |
|
||||
(msg.DATA[1] << 8) |
|
||||
(msg.DATA[2] << 16) |
|
||||
(msg.DATA[3] << 24)
|
||||
);
|
||||
|
||||
double positionMm = raw * scale;
|
||||
positionMm = Math.Min(positionMm, 3000.0);
|
||||
positionMm = Math.Max(positionMm, 0.0);
|
||||
PositionReceived?.Invoke(this, new PositionPdo
|
||||
{
|
||||
CobId = msg.ID,
|
||||
Length = msg.LEN,
|
||||
DataHex = dataHex,
|
||||
RawValue = raw,
|
||||
PositionMm = positionMm,
|
||||
Timestamp = DateTime.Now
|
||||
});
|
||||
FrameReceived?.Invoke(this, new CanFrame
|
||||
{
|
||||
CobId = msg.ID,
|
||||
Length = msg.LEN,
|
||||
DataHex = dataHex,
|
||||
Timestamp = DateTime.Now,
|
||||
PositionMm = positionMm,
|
||||
Description = "TPDO1 Position"
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ================= STOP =================
|
||||
public void Stop()
|
||||
{
|
||||
if (_cts == null)
|
||||
return;
|
||||
|
||||
_waitingStopAck = true;
|
||||
SendNmtStop(_currentNodeId);
|
||||
|
||||
_cts.Cancel();
|
||||
_cts = null;
|
||||
|
||||
UpdateState(CanNodeState.Stopped);
|
||||
}
|
||||
|
||||
public void Dispose() => Stop();
|
||||
|
||||
// ================= NMT =================
|
||||
public void SendNmtStart(byte nodeId)
|
||||
{
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
var msg = new TPCANMsg
|
||||
{
|
||||
ID = 0x000,
|
||||
LEN = 2,
|
||||
MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,
|
||||
DATA = new byte[8]
|
||||
};
|
||||
msg.DATA[0] = 0x01; // NMT Start
|
||||
msg.DATA[1] = nodeId;
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
PCANBasic.Write(channel, ref msg);
|
||||
Thread.Sleep(50);
|
||||
}
|
||||
}
|
||||
|
||||
public void SendNmtStop(byte nodeId)
|
||||
{
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
var msg = new TPCANMsg
|
||||
{
|
||||
ID = 0x000,
|
||||
LEN = 2,
|
||||
MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,
|
||||
DATA = new byte[8]
|
||||
};
|
||||
msg.DATA[0] = 0x02; // NMT Stop
|
||||
msg.DATA[1] = nodeId;
|
||||
PCANBasic.Write(channel, ref msg);
|
||||
}
|
||||
|
||||
public void SendNmtReset(byte nodeId)
|
||||
{
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
var msg = new TPCANMsg
|
||||
{
|
||||
ID = 0x000,
|
||||
LEN = 2,
|
||||
MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,
|
||||
DATA = new byte[8]
|
||||
};
|
||||
msg.DATA[0] = 0x81; // Reset node
|
||||
msg.DATA[1] = nodeId;
|
||||
PCANBasic.Write(channel, ref msg);
|
||||
}
|
||||
|
||||
// ================= HELPERS =================
|
||||
private static ushort ParseChannel(string ch) => ch switch
|
||||
{
|
||||
"PCAN_USBBUS1" => 0x51,
|
||||
"PCAN_USBBUS2" => 0x52,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(ch))
|
||||
};
|
||||
|
||||
private static TPCANBaudrate MapBaudrate(int b) => b switch
|
||||
{
|
||||
1000000 => TPCANBaudrate.PCAN_BAUD_1M,
|
||||
800000 => TPCANBaudrate.PCAN_BAUD_800K,
|
||||
500000 => TPCANBaudrate.PCAN_BAUD_500K,
|
||||
250000 => TPCANBaudrate.PCAN_BAUD_250K,
|
||||
125000 => TPCANBaudrate.PCAN_BAUD_125K,
|
||||
100000 => TPCANBaudrate.PCAN_BAUD_100K,
|
||||
50000 => TPCANBaudrate.PCAN_BAUD_50K,
|
||||
20000 => TPCANBaudrate.PCAN_BAUD_20K,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(b))
|
||||
};
|
||||
|
||||
private uint GetPositionCobId()
|
||||
{
|
||||
return _options.PositionBaseCobId + _currentNodeId;
|
||||
}
|
||||
|
||||
private void CheckHeartbeatTimeout()
|
||||
{
|
||||
if (_currentState == CanNodeState.PreOperational || _currentState == CanNodeState.Stopped)
|
||||
return;
|
||||
|
||||
if (_lastHeartbeat == DateTime.MinValue)
|
||||
return;
|
||||
|
||||
if (DateTime.Now - _lastHeartbeat > _heartbeatTimeout)
|
||||
{
|
||||
UpdateState(CanNodeState.Timeout);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateState(CanNodeState newState)
|
||||
{
|
||||
if (_currentState == newState)
|
||||
return;
|
||||
|
||||
_currentState = newState;
|
||||
NodeStateChanged?.Invoke(this, newState);
|
||||
}
|
||||
|
||||
public void ChangeBitrate(int bitrate)
|
||||
{
|
||||
if (_currentBitrate == bitrate)
|
||||
return;
|
||||
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
|
||||
Stop();
|
||||
|
||||
if (_initialized)
|
||||
{
|
||||
PCANBasic.Uninitialize(channel);
|
||||
_initialized = false;
|
||||
}
|
||||
|
||||
_currentBitrate = bitrate;
|
||||
}
|
||||
|
||||
private void SendRaw(uint cobId, byte[] data)
|
||||
{
|
||||
ushort channel = ParseChannel(_options.Channel);
|
||||
var msg = new TPCANMsg
|
||||
{
|
||||
ID = cobId,
|
||||
LEN = (byte)data.Length,
|
||||
MSGTYPE = TPCANMessageType.PCAN_MESSAGE_STANDARD,
|
||||
DATA = new byte[8]
|
||||
};
|
||||
Array.Copy(data, msg.DATA, data.Length);
|
||||
PCANBasic.Write(channel, ref msg);
|
||||
}
|
||||
|
||||
private uint GetAccessCode() => _edsParser.GetAccessCode(); // 0x98127634
|
||||
|
||||
private byte GetBitrateIndex(int bitrate)
|
||||
{
|
||||
foreach (var kv in _baudMap)
|
||||
{
|
||||
if (kv.Value == bitrate) return kv.Key;
|
||||
}
|
||||
throw new ArgumentOutOfRangeException(nameof(bitrate), $"Bitrate {bitrate} not supported in EDS");
|
||||
}
|
||||
|
||||
public async Task ApplyBitrateAsync(byte nodeId, int bitrate)
|
||||
{
|
||||
// Pre-Operational
|
||||
SendRaw(0x000, new byte[] { 0x80, nodeId });
|
||||
await Task.Delay(100);
|
||||
|
||||
// Unlock access code (đọc động từ EDS/manual)
|
||||
uint accessCode = GetAccessCode();
|
||||
SendRaw(
|
||||
(uint)(0x600 + nodeId),
|
||||
new byte[] { 0x23, 0x09, 0x20, 0x01,
|
||||
(byte)(accessCode & 0xFF),
|
||||
(byte)((accessCode >> 8) & 0xFF),
|
||||
(byte)((accessCode >> 16) & 0xFF),
|
||||
(byte)((accessCode >> 24) & 0xFF) }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Set bitrate (index từ EDS map)
|
||||
byte bitrateValue = GetBitrateIndex(bitrate);
|
||||
SendRaw(
|
||||
(uint)(0x600 + nodeId),
|
||||
new byte[] { 0x2F, 0x09, 0x20, 0x03, bitrateValue, 0x00, 0x00, 0x00 }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Save EEPROM
|
||||
SendRaw(
|
||||
(uint)(0x600 + nodeId),
|
||||
new byte[] { 0x23, 0x10, 0x10, 0x01, 0x73, 0x61, 0x76, 0x65 }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Reset node
|
||||
SendRaw(0x000u, new byte[] { 0x81, nodeId });
|
||||
|
||||
// Update runtime
|
||||
await Task.Delay(1200);
|
||||
ChangeBitrate(bitrate);
|
||||
CurrentBitrate = bitrate;
|
||||
}
|
||||
|
||||
public async Task ApplyNodeIdAsync(byte oldNodeId, byte newNodeId)
|
||||
{
|
||||
if (newNodeId < 1 || newNodeId > 127)
|
||||
throw new ArgumentOutOfRangeException(nameof(newNodeId));
|
||||
|
||||
// Pre-Operational
|
||||
SendRaw(0x000, new byte[] { 0x80, oldNodeId });
|
||||
await Task.Delay(100);
|
||||
|
||||
// Unlock access code (động từ EDS)
|
||||
uint accessCode = GetAccessCode();
|
||||
SendRaw(
|
||||
(uint)(0x600 + oldNodeId),
|
||||
new byte[] { 0x23, 0x09, 0x20, 0x01,
|
||||
(byte)(accessCode & 0xFF),
|
||||
(byte)((accessCode >> 8) & 0xFF),
|
||||
(byte)((accessCode >> 16) & 0xFF),
|
||||
(byte)((accessCode >> 24) & 0xFF) }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Set Node ID
|
||||
SendRaw(
|
||||
(uint)(0x600 + oldNodeId),
|
||||
new byte[] { 0x2F, 0x09, 0x20, 0x02, newNodeId, 0x00, 0x00, 0x00 }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Save EEPROM
|
||||
SendRaw(
|
||||
(uint)(0x600 + oldNodeId),
|
||||
new byte[] { 0x23, 0x10, 0x10, 0x01, 0x73, 0x61, 0x76, 0x65 }
|
||||
);
|
||||
await Task.Delay(100);
|
||||
|
||||
// Reset node
|
||||
SendRaw(0x000, new byte[] { 0x81, oldNodeId });
|
||||
|
||||
// Thông báo UI
|
||||
_currentNodeId = newNodeId;
|
||||
NodeIdChanged?.Invoke(this, newNodeId);
|
||||
}
|
||||
}
|
||||
27
SickBlazorApp/SickBlazorApp.csproj
Normal file
27
SickBlazorApp/SickBlazorApp.csproj
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="eds\AHM36_I_CO.eds" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="eds\AHM36_I_CO.eds" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Peak.PCANBasic.NET" Version="4.10.1.968" />
|
||||
<PackageReference Include="SocketCANSharp" Version="0.13.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="wwwroot\Images\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
7
SickBlazorApp/SickBlazorApp.csproj.user
Normal file
7
SickBlazorApp/SickBlazorApp.csproj.user
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ActiveDebugProfile>https</ActiveDebugProfile>
|
||||
<NameOfLastUsedPublishProfile>D:\Sick\SickBlazorApp\SickBlazorApp\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
8
SickBlazorApp/appsettings.Development.json
Normal file
8
SickBlazorApp/appsettings.Development.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
14
SickBlazorApp/appsettings.json
Normal file
14
SickBlazorApp/appsettings.json
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"CanBus": {
|
||||
"Channel": "PCAN_USBBUS1",
|
||||
"EdsPath": "SickBlazorApp.eds.AHM36_I_CO.eds"
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Debug/net10.0/PCANBasic.NET.dll
Normal file
BIN
SickBlazorApp/bin/Debug/net10.0/PCANBasic.NET.dll
Normal file
Binary file not shown.
57
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.deps.json
Normal file
57
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.deps.json
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v10.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v10.0": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"dependencies": {
|
||||
"Peak.PCANBasic.NET": "4.10.1.968",
|
||||
"SocketCANSharp": "0.13.0"
|
||||
},
|
||||
"runtime": {
|
||||
"SickBlazorApp.dll": {}
|
||||
}
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/PCANBasic.NET.dll": {
|
||||
"assemblyVersion": "4.10.1.968",
|
||||
"fileVersion": "4.10.1.968"
|
||||
}
|
||||
}
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/SocketCANSharp.dll": {
|
||||
"assemblyVersion": "0.13.0.0",
|
||||
"fileVersion": "0.13.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-sUxW8dhaIB+x7XFcpepad1DaD1N5a9l6qB2cyOgDCv7M+SmF87hOIK/EsT42Th92exA02PfCr6+ilnZ0XYeyrg==",
|
||||
"path": "peak.pcanbasic.net/4.10.1.968",
|
||||
"hashPath": "peak.pcanbasic.net.4.10.1.968.nupkg.sha512"
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-71mLS40IMpnyWeKf0zeWKGlgO6lkll36DdhKmsJ9z/SGnENcq/8XhOYFgLKJ8Wbs2a4WaFelmlz8cKBU82lWyA==",
|
||||
"path": "socketcansharp/0.13.0",
|
||||
"hashPath": "socketcansharp.0.13.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.dll
Normal file
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.dll
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.exe
Normal file
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.exe
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.pdb
Normal file
BIN
SickBlazorApp/bin/Debug/net10.0/SickBlazorApp.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
SickBlazorApp/bin/Debug/net10.0/SocketCANSharp.dll
Normal file
BIN
SickBlazorApp/bin/Debug/net10.0/SocketCANSharp.dll
Normal file
Binary file not shown.
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
14
SickBlazorApp/bin/Debug/net10.0/appsettings.json
Normal file
14
SickBlazorApp/bin/Debug/net10.0/appsettings.json
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"CanBus": {
|
||||
"Channel": "PCAN_USBBUS1",
|
||||
"EdsPath": "SickBlazorApp.eds.AHM36_I_CO.eds"
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Release/net10.0/PCANBasic.NET.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/PCANBasic.NET.dll
Normal file
Binary file not shown.
57
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.deps.json
Normal file
57
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.deps.json
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v10.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v10.0": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"dependencies": {
|
||||
"Peak.PCANBasic.NET": "4.10.1.968",
|
||||
"SocketCANSharp": "0.13.0"
|
||||
},
|
||||
"runtime": {
|
||||
"SickBlazorApp.dll": {}
|
||||
}
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/PCANBasic.NET.dll": {
|
||||
"assemblyVersion": "4.10.1.968",
|
||||
"fileVersion": "4.10.1.968"
|
||||
}
|
||||
}
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/SocketCANSharp.dll": {
|
||||
"assemblyVersion": "0.13.0.0",
|
||||
"fileVersion": "0.13.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-sUxW8dhaIB+x7XFcpepad1DaD1N5a9l6qB2cyOgDCv7M+SmF87hOIK/EsT42Th92exA02PfCr6+ilnZ0XYeyrg==",
|
||||
"path": "peak.pcanbasic.net/4.10.1.968",
|
||||
"hashPath": "peak.pcanbasic.net.4.10.1.968.nupkg.sha512"
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-71mLS40IMpnyWeKf0zeWKGlgO6lkll36DdhKmsJ9z/SGnENcq/8XhOYFgLKJ8Wbs2a4WaFelmlz8cKBU82lWyA==",
|
||||
"path": "socketcansharp/0.13.0",
|
||||
"hashPath": "socketcansharp.0.13.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.dll
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.exe
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.exe
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.pdb
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/SickBlazorApp.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
SickBlazorApp/bin/Release/net10.0/SocketCANSharp.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/SocketCANSharp.dll
Normal file
Binary file not shown.
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
16
SickBlazorApp/bin/Release/net10.0/appsettings.json
Normal file
16
SickBlazorApp/bin/Release/net10.0/appsettings.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"CanBus": {
|
||||
"Backend": "PCAN",
|
||||
"PositionBaseCobId": "0x180",
|
||||
"Channel": "PCAN_USBBUS1",
|
||||
"PositionScale": 0.01403808593
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/PCANBasic.NET.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/PCANBasic.NET.dll
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp
Normal file
Binary file not shown.
|
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v10.0/linux-x64",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v10.0": {},
|
||||
".NETCoreApp,Version=v10.0/linux-x64": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"dependencies": {
|
||||
"Peak.PCANBasic.NET": "4.10.1.968",
|
||||
"SocketCANSharp": "0.13.0"
|
||||
},
|
||||
"runtime": {
|
||||
"SickBlazorApp.dll": {}
|
||||
}
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/PCANBasic.NET.dll": {
|
||||
"assemblyVersion": "4.10.1.968",
|
||||
"fileVersion": "4.10.1.968"
|
||||
}
|
||||
}
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/SocketCANSharp.dll": {
|
||||
"assemblyVersion": "0.13.0.0",
|
||||
"fileVersion": "0.13.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"SickBlazorApp/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Peak.PCANBasic.NET/4.10.1.968": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-sUxW8dhaIB+x7XFcpepad1DaD1N5a9l6qB2cyOgDCv7M+SmF87hOIK/EsT42Th92exA02PfCr6+ilnZ0XYeyrg==",
|
||||
"path": "peak.pcanbasic.net/4.10.1.968",
|
||||
"hashPath": "peak.pcanbasic.net.4.10.1.968.nupkg.sha512"
|
||||
},
|
||||
"SocketCANSharp/0.13.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-71mLS40IMpnyWeKf0zeWKGlgO6lkll36DdhKmsJ9z/SGnENcq/8XhOYFgLKJ8Wbs2a4WaFelmlz8cKBU82lWyA==",
|
||||
"path": "socketcansharp/0.13.0",
|
||||
"hashPath": "socketcansharp.0.13.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp.dll
Normal file
Binary file not shown.
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp.pdb
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SickBlazorApp.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SocketCANSharp.dll
Normal file
BIN
SickBlazorApp/bin/Release/net10.0/linux-x64/SocketCANSharp.dll
Normal file
Binary file not shown.
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
16
SickBlazorApp/bin/Release/net10.0/linux-x64/appsettings.json
Normal file
16
SickBlazorApp/bin/Release/net10.0/linux-x64/appsettings.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"CanBus": {
|
||||
"Backend": "PCAN",
|
||||
"PositionBaseCobId": "0x180",
|
||||
"Channel": "PCAN_USBBUS1",
|
||||
"PositionScale": 0.01403808593
|
||||
}
|
||||
}
|
||||
3115
SickBlazorApp/eds/AHM36_I_CO.eds
Normal file
3115
SickBlazorApp/eds/AHM36_I_CO.eds
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,4 @@
|
|||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]
|
||||
1
SickBlazorApp/obj/Debug/net10.0/ApiEndpoints.json
Normal file
1
SickBlazorApp/obj/Debug/net10.0/ApiEndpoints.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
7
SickBlazorApp/obj/Debug/net10.0/EmbeddedAttribute.cs
Normal file
7
SickBlazorApp/obj/Debug/net10.0/EmbeddedAttribute.cs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
// <auto-generated/>
|
||||
namespace Microsoft.CodeAnalysis
|
||||
{
|
||||
internal sealed partial class EmbeddedAttribute : global::System.Attribute
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("SickBlazorApp")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("SickBlazorApp")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("SickBlazorApp")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
7f6582019cc9d0b8e7d334809c7090cb61fb4be402e233d5cacff60849b3cb87
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
is_global = true
|
||||
build_property.TargetFramework = net10.0
|
||||
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||
build_property.TargetFrameworkVersion = v10.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb = true
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = SickBlazorApp
|
||||
build_property.RootNamespace = SickBlazorApp
|
||||
build_property.ProjectDir = C:\Users\Admin\source\repos\SickApp\SickBlazorApp\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.RazorLangVersion = 9.0
|
||||
build_property.SupportLocalizedComponentNames =
|
||||
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\Admin\source\repos\SickApp\SickBlazorApp
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
build_property.EffectiveAnalysisLevelStyle = 10.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/AccordionItem.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvcmRpb25JdGVtLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/App.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Error.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Home.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/NotFound.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xOb3RGb3VuZC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Sick.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xTaWNrLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Routes.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/_Imports.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/MainLayout.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope = b-qmki05wm3r
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/NavMenu.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope = b-1iw1jlyvzt
|
||||
|
||||
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/ReconnectModal.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcUmVjb25uZWN0TW9kYWwucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope = b-6mk5e94y2s
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
// <auto-generated/>
|
||||
global using Microsoft.AspNetCore.Builder;
|
||||
global using Microsoft.AspNetCore.Hosting;
|
||||
global using Microsoft.AspNetCore.Http;
|
||||
global using Microsoft.AspNetCore.Routing;
|
||||
global using Microsoft.Extensions.Configuration;
|
||||
global using Microsoft.Extensions.DependencyInjection;
|
||||
global using Microsoft.Extensions.Hosting;
|
||||
global using Microsoft.Extensions.Logging;
|
||||
global using Microsoft.Extensions.Validation.Embedded;
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.IO;
|
||||
global using System.Linq;
|
||||
global using System.Net.Http;
|
||||
global using System.Net.Http.Json;
|
||||
global using System.Threading;
|
||||
global using System.Threading.Tasks;
|
||||
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.assets.cache
Normal file
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.assets.cache
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
9fd45452178f1d43e7283c6b8c0d9b81485b3a9e35132b843bc104b37f47b5a4
|
||||
|
|
@ -0,0 +1,271 @@
|
|||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\appsettings.Development.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\appsettings.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.runtime.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.endpoints.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.exe
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.deps.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.runtimeconfig.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.pdb
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\PCANBasic.NET.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Debug\net10.0\SocketCANSharp.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\EmbeddedAttribute.cs
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\ValidatableTypeAttribute.cs
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.AssemblyReference.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\rpswa.dswa.cache.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.GeneratedMSBuildEditorConfig.editorconfig
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfoInputs.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfo.cs
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.CoreCompileInputs.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.MvcApplicationPartsAssemblyInfo.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\rjimswa.dswa.cache.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\bundle\SickBlazorApp.styles.css
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\projectbundle\SickBlazorApp.bundle.scp.css
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\iftrd4n63y-{0}-bqjiyaj88i-bqjiyaj88i.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\b9v1qbrszs-{0}-c2jlpeoesf-c2jlpeoesf.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\xt1ydf62az-{0}-erw9l3u2r3-erw9l3u2r3.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\f2jlt9w81o-{0}-aexeepp0ev-aexeepp0ev.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\mqiozilooi-{0}-d7shbmvgxk-d7shbmvgxk.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\fj6kecqrrq-{0}-ausgxo2sd3-ausgxo2sd3.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\ytvbcpxtvv-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\45v1msuptr-{0}-cosvhxvwiu-cosvhxvwiu.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\gd5zqnn6m7-{0}-ub07r2b239-ub07r2b239.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\lvs1g0gm2f-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\1c9vewjk1j-{0}-b7pk76d08c-b7pk76d08c.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\c0ocz7eib6-{0}-fsbi9cje9m-fsbi9cje9m.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\aj2v8ehcsx-{0}-rzd6atqjts-rzd6atqjts.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\bca31my391-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\kbwgt9n4oo-{0}-dxx9fxp4il-dxx9fxp4il.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\1tzk64zize-{0}-jd9uben2k1-jd9uben2k1.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\rjgerfdlpa-{0}-khv3u5hwcm-khv3u5hwcm.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\5xrf8dv45a-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\lul785h464-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\wrpiw3xssz-{0}-c2oey78nd0-c2oey78nd0.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\61mrmy3rha-{0}-tdbxkamptv-tdbxkamptv.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\vp4av64p8c-{0}-j5mq2jizvt-j5mq2jizvt.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\rq0ofl2uny-{0}-06098lyss8-06098lyss8.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\x28sr319gb-{0}-nvvlpmu67g-nvvlpmu67g.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\im5xxmfkuj-{0}-s35ty4nyc5-s35ty4nyc5.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\ivfbl4jne1-{0}-pj5nd1wqec-pj5nd1wqec.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\mq91envm6n-{0}-46ein0sx1k-46ein0sx1k.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\yaw23x8sni-{0}-v0zj4ognzu-v0zj4ognzu.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\r5cn90t302-{0}-37tfw0ft22-37tfw0ft22.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\ja8tn6gcf8-{0}-hrwsygsryq-hrwsygsryq.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\8zaxi3brfj-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\cf1jy8mm8t-{0}-ft3s53vfgj-ft3s53vfgj.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\guii0gaef3-{0}-6cfz1n2cew-6cfz1n2cew.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\kifvqlfr3o-{0}-6pdc2jztkx-6pdc2jztkx.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\8bdcn07xmt-{0}-493y06b0oq-493y06b0oq.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\d9jin8c8h3-{0}-iovd86k7lj-iovd86k7lj.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\o9e5jhxaol-{0}-vr1egmr9el-vr1egmr9el.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\gtq9ysfdx1-{0}-kbrnm935zg-kbrnm935zg.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\vww9wnomiw-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\nmhdu8k6et-{0}-y7v9cxd14o-y7v9cxd14o.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\1ki1vioce8-{0}-notf2xhcfb-notf2xhcfb.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\fp1t9eikd3-{0}-h1s4sie4z3-h1s4sie4z3.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\wvlwqcbdxa-{0}-63fj8s7r0e-63fj8s7r0e.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\bbpti3e71l-{0}-0j3bgjxly4-0j3bgjxly4.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\an6avfx330-{0}-13ja33weya-13ja33weya.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\6za0cps83j-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\1lxjy4o3fy-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.development.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.endpoints.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\swae.build.ex.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlaz.A824BB92.Up2Date
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\refint\SickBlazorApp.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.pdb
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.genruntimeconfig.cache
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\ref\SickBlazorApp.dll
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.sourcelink.json
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.upToDateCheck.txt
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\8hyy67ot57-{0}-2i0r6wwb69-2i0r6wwb69.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\ki07nybi96-{0}-iz83ucvm53-iz83ucvm53.gz
|
||||
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Debug\net10.0\compressed\zk4xi70r8b-{0}-wueok49yfo-wueok49yfo.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\appsettings.Development.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\appsettings.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.endpoints.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.runtime.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.exe
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.deps.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.runtimeconfig.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.pdb
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\PCANBasic.NET.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\bin\Debug\net10.0\SocketCANSharp.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\EmbeddedAttribute.cs
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\ValidatableTypeAttribute.cs
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.AssemblyReference.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\rpswa.dswa.cache.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.GeneratedMSBuildEditorConfig.editorconfig
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfoInputs.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfo.cs
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.CoreCompileInputs.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.MvcApplicationPartsAssemblyInfo.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\rjimswa.dswa.cache.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\scopedcss\bundle\SickBlazorApp.styles.css
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\scopedcss\projectbundle\SickBlazorApp.bundle.scp.css
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\iftrd4n63y-{0}-bqjiyaj88i-bqjiyaj88i.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\b9v1qbrszs-{0}-c2jlpeoesf-c2jlpeoesf.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\xt1ydf62az-{0}-erw9l3u2r3-erw9l3u2r3.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\f2jlt9w81o-{0}-aexeepp0ev-aexeepp0ev.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\mqiozilooi-{0}-d7shbmvgxk-d7shbmvgxk.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\fj6kecqrrq-{0}-ausgxo2sd3-ausgxo2sd3.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\ytvbcpxtvv-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\45v1msuptr-{0}-cosvhxvwiu-cosvhxvwiu.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\gd5zqnn6m7-{0}-ub07r2b239-ub07r2b239.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\lvs1g0gm2f-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\1c9vewjk1j-{0}-b7pk76d08c-b7pk76d08c.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\c0ocz7eib6-{0}-fsbi9cje9m-fsbi9cje9m.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\aj2v8ehcsx-{0}-rzd6atqjts-rzd6atqjts.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\bca31my391-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\kbwgt9n4oo-{0}-dxx9fxp4il-dxx9fxp4il.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\1tzk64zize-{0}-jd9uben2k1-jd9uben2k1.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\rjgerfdlpa-{0}-khv3u5hwcm-khv3u5hwcm.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\5xrf8dv45a-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\lul785h464-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\wrpiw3xssz-{0}-c2oey78nd0-c2oey78nd0.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\61mrmy3rha-{0}-tdbxkamptv-tdbxkamptv.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\vp4av64p8c-{0}-j5mq2jizvt-j5mq2jizvt.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\rq0ofl2uny-{0}-06098lyss8-06098lyss8.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\x28sr319gb-{0}-nvvlpmu67g-nvvlpmu67g.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\im5xxmfkuj-{0}-s35ty4nyc5-s35ty4nyc5.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\ivfbl4jne1-{0}-pj5nd1wqec-pj5nd1wqec.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\mq91envm6n-{0}-46ein0sx1k-46ein0sx1k.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\yaw23x8sni-{0}-v0zj4ognzu-v0zj4ognzu.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\r5cn90t302-{0}-37tfw0ft22-37tfw0ft22.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\ja8tn6gcf8-{0}-hrwsygsryq-hrwsygsryq.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\8zaxi3brfj-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\cf1jy8mm8t-{0}-ft3s53vfgj-ft3s53vfgj.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\guii0gaef3-{0}-6cfz1n2cew-6cfz1n2cew.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\kifvqlfr3o-{0}-6pdc2jztkx-6pdc2jztkx.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\8bdcn07xmt-{0}-493y06b0oq-493y06b0oq.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\d9jin8c8h3-{0}-iovd86k7lj-iovd86k7lj.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\o9e5jhxaol-{0}-vr1egmr9el-vr1egmr9el.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\gtq9ysfdx1-{0}-kbrnm935zg-kbrnm935zg.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\vww9wnomiw-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\nmhdu8k6et-{0}-y7v9cxd14o-y7v9cxd14o.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\1ki1vioce8-{0}-notf2xhcfb-notf2xhcfb.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\fp1t9eikd3-{0}-h1s4sie4z3-h1s4sie4z3.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\wvlwqcbdxa-{0}-63fj8s7r0e-63fj8s7r0e.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\bbpti3e71l-{0}-0j3bgjxly4-0j3bgjxly4.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\an6avfx330-{0}-13ja33weya-13ja33weya.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\8hyy67ot57-{0}-2i0r6wwb69-2i0r6wwb69.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\ki07nybi96-{0}-iz83ucvm53-iz83ucvm53.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\6za0cps83j-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\1lxjy4o3fy-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\staticwebassets.development.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.endpoints.json
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\swae.build.ex.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\staticwebassets.upToDateCheck.txt
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlaz.A824BB92.Up2Date
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\refint\SickBlazorApp.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.pdb
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.genruntimeconfig.cache
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\ref\SickBlazorApp.dll
|
||||
C:\Users\Admin\OneDrive\Desktop\TestEds\SickBlazorApp\obj\Debug\net10.0\compressed\zk4xi70r8b-{0}-p65sg3eni6-p65sg3eni6.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\appsettings.Development.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\appsettings.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.endpoints.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.staticwebassets.runtime.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.exe
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.deps.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.runtimeconfig.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.dll
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SickBlazorApp.pdb
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\PCANBasic.NET.dll
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\bin\Debug\net10.0\SocketCANSharp.dll
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\EmbeddedAttribute.cs
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\ValidatableTypeAttribute.cs
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.AssemblyReference.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\rpswa.dswa.cache.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.GeneratedMSBuildEditorConfig.editorconfig
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfoInputs.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.AssemblyInfo.cs
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.csproj.CoreCompileInputs.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.MvcApplicationPartsAssemblyInfo.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\rjimswa.dswa.cache.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\bundle\SickBlazorApp.styles.css
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\scopedcss\projectbundle\SickBlazorApp.bundle.scp.css
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\zk4xi70r8b-{0}-p65sg3eni6-p65sg3eni6.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\iftrd4n63y-{0}-bqjiyaj88i-bqjiyaj88i.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\b9v1qbrszs-{0}-c2jlpeoesf-c2jlpeoesf.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\xt1ydf62az-{0}-erw9l3u2r3-erw9l3u2r3.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\f2jlt9w81o-{0}-aexeepp0ev-aexeepp0ev.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\mqiozilooi-{0}-d7shbmvgxk-d7shbmvgxk.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\fj6kecqrrq-{0}-ausgxo2sd3-ausgxo2sd3.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\ytvbcpxtvv-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\45v1msuptr-{0}-cosvhxvwiu-cosvhxvwiu.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\gd5zqnn6m7-{0}-ub07r2b239-ub07r2b239.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\lvs1g0gm2f-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\1c9vewjk1j-{0}-b7pk76d08c-b7pk76d08c.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\c0ocz7eib6-{0}-fsbi9cje9m-fsbi9cje9m.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\aj2v8ehcsx-{0}-rzd6atqjts-rzd6atqjts.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\bca31my391-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\kbwgt9n4oo-{0}-dxx9fxp4il-dxx9fxp4il.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\1tzk64zize-{0}-jd9uben2k1-jd9uben2k1.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\rjgerfdlpa-{0}-khv3u5hwcm-khv3u5hwcm.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\5xrf8dv45a-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\lul785h464-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\wrpiw3xssz-{0}-c2oey78nd0-c2oey78nd0.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\61mrmy3rha-{0}-tdbxkamptv-tdbxkamptv.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\vp4av64p8c-{0}-j5mq2jizvt-j5mq2jizvt.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\rq0ofl2uny-{0}-06098lyss8-06098lyss8.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\x28sr319gb-{0}-nvvlpmu67g-nvvlpmu67g.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\im5xxmfkuj-{0}-s35ty4nyc5-s35ty4nyc5.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\ivfbl4jne1-{0}-pj5nd1wqec-pj5nd1wqec.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\mq91envm6n-{0}-46ein0sx1k-46ein0sx1k.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\yaw23x8sni-{0}-v0zj4ognzu-v0zj4ognzu.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\r5cn90t302-{0}-37tfw0ft22-37tfw0ft22.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\ja8tn6gcf8-{0}-hrwsygsryq-hrwsygsryq.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\8zaxi3brfj-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\cf1jy8mm8t-{0}-ft3s53vfgj-ft3s53vfgj.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\guii0gaef3-{0}-6cfz1n2cew-6cfz1n2cew.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\kifvqlfr3o-{0}-6pdc2jztkx-6pdc2jztkx.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\8bdcn07xmt-{0}-493y06b0oq-493y06b0oq.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\d9jin8c8h3-{0}-iovd86k7lj-iovd86k7lj.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\o9e5jhxaol-{0}-vr1egmr9el-vr1egmr9el.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\gtq9ysfdx1-{0}-kbrnm935zg-kbrnm935zg.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\vww9wnomiw-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\nmhdu8k6et-{0}-y7v9cxd14o-y7v9cxd14o.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\1ki1vioce8-{0}-notf2xhcfb-notf2xhcfb.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\fp1t9eikd3-{0}-h1s4sie4z3-h1s4sie4z3.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\wvlwqcbdxa-{0}-63fj8s7r0e-63fj8s7r0e.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\bbpti3e71l-{0}-0j3bgjxly4-0j3bgjxly4.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\an6avfx330-{0}-13ja33weya-13ja33weya.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\8hyy67ot57-{0}-2i0r6wwb69-2i0r6wwb69.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\ki07nybi96-{0}-iz83ucvm53-iz83ucvm53.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\6za0cps83j-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\compressed\1lxjy4o3fy-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.json.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.development.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.build.endpoints.json
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\swae.build.ex.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\staticwebassets.upToDateCheck.txt
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlaz.A824BB92.Up2Date
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.dll
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\refint\SickBlazorApp.dll
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.pdb
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\SickBlazorApp.genruntimeconfig.cache
|
||||
C:\Users\Admin\source\repos\SickApp\SickBlazorApp\obj\Debug\net10.0\ref\SickBlazorApp.dll
|
||||
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.dll
Normal file
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.dll
Normal file
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
82e4ce05ad0303b91186fcbaa0179f189630d3d41442ba74b362dfd9bb35f8ce
|
||||
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.pdb
Normal file
BIN
SickBlazorApp/obj/Debug/net10.0/SickBlazorApp.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,9 @@
|
|||
// <auto-generated/>
|
||||
namespace Microsoft.Extensions.Validation.Embedded
|
||||
{
|
||||
[global::Microsoft.CodeAnalysis.EmbeddedAttribute]
|
||||
[global::System.AttributeUsage(global::System.AttributeTargets.Class)]
|
||||
internal sealed class ValidatableTypeAttribute : global::System.Attribute
|
||||
{
|
||||
}
|
||||
}
|
||||
BIN
SickBlazorApp/obj/Debug/net10.0/apphost.exe
Normal file
BIN
SickBlazorApp/obj/Debug/net10.0/apphost.exe
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user