save
This commit is contained in:
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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user