This commit is contained in:
DTQuan1212 2026-02-02 10:00:26 +07:00
commit b9b2c6ef79
617 changed files with 133854 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.vs/SickApp.slnx/v18/.wsuo Normal file

Binary file not shown.

View 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}"
}
]
}
]
}
]
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View 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}"
}
]
}
]
}
]
}

View 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}"
}
]
}
]
}
]
}

View File

@ -0,0 +1,7 @@
{
"ExpandedNodes": [
""
],
"SelectedNode": "\\C:\\Users\\Admin\\source\\repos\\SickApp",
"PreviewInSolutionExplorer": false
}

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

3
SickBlazorApp.slnx Normal file
View File

@ -0,0 +1,3 @@
<Solution>
<Project Path="SickBlazorApp/SickBlazorApp.csproj" />
</Solution>

View File

@ -0,0 +1,13 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "10.0.2",
"commands": [
"dotnet-ef"
],
"rollForward": false
}
}
}

View 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; }
}

View 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>

View 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>

View 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;
}

View 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>

View 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;
}
}

View 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>

View 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;
}
}

View 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();
}
}

View 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;
}

View 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;
}
}

View 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>

View 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 (1127)</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();
});
}
}

View 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>

View 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

View 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; }
}

View File

@ -0,0 +1,11 @@
namespace SickBlazorApp.Models;
public enum CanNodeState
{
Unknown = 0,
Bootup,
PreOperational,
Operational,
Stopped,
Timeout
}

View 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; }
}

View 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; }
}
}

View 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
View 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();

View File

@ -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>

View File

@ -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>

View 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"
}
}
}
}

View 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
}
}
}

View 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; }
}

View 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);
}
}

View 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>

View 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>

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,14 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CanBus": {
"Channel": "PCAN_USBBUS1",
"EdsPath": "SickBlazorApp.eds.AHM36_I_CO.eds"
}
}

Binary file not shown.

View 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"
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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

Binary file not shown.

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,14 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CanBus": {
"Channel": "PCAN_USBBUS1",
"EdsPath": "SickBlazorApp.eds.AHM36_I_CO.eds"
}
}

Binary file not shown.

View 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"
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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

Binary file not shown.

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,16 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CanBus": {
"Backend": "PCAN",
"PositionBaseCobId": "0x180",
"Channel": "PCAN_USBBUS1",
"PositionScale": 0.01403808593
}
}

View File

@ -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"
}
}
}

View File

@ -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

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,16 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CanBus": {
"Backend": "PCAN",
"PositionBaseCobId": "0x180",
"Channel": "PCAN_USBBUS1",
"PositionScale": 0.01403808593
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]

View File

@ -0,0 +1 @@
[]

View File

@ -0,0 +1,7 @@
// <auto-generated/>
namespace Microsoft.CodeAnalysis
{
internal sealed partial class EmbeddedAttribute : global::System.Attribute
{
}
}

View File

@ -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.

View File

@ -0,0 +1 @@
7f6582019cc9d0b8e7d334809c7090cb61fb4be402e233d5cacff60849b3cb87

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1 @@
9fd45452178f1d43e7283c6b8c0d9b81485b3a9e35132b843bc104b37f47b5a4

View File

@ -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

Binary file not shown.

View File

@ -0,0 +1 @@
82e4ce05ad0303b91186fcbaa0179f189630d3d41442ba74b362dfd9bb35f8ce

Binary file not shown.

View File

@ -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
{
}
}

Binary file not shown.

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