Never stop learning, approaching the AI
  • 😄About
  • 🅰️AI-Candy on YouTube
    • 🎬YouTube 视频列表
    • 💠AI项目本地部署
      • 1️⃣安装 Pytorch 运行环境
      • 2️⃣在Python虚拟环境下使用 VS Code or PyCharm
        • VS Code Python format
      • 3️⃣Create python virtual environment in Linux
    • 👽AI 入门系列课程
      • 0️向量及向量运算
        • Reshape array code
      • 1️人工智能,机器学习,深度学习 和神经网络的区别
      • 2️卷积神经网络(CNN)
        • 3D CNN sample code
      • 3️Transformer 原理
      • 4️前馈神经网络 (FNN)
  • 🎭Artificial intelligence
    • 1️⃣Deep learning / machine learning
      • 👉Deep Learning Resources
      • 👉Deep learning notes
    • 2️⃣Python
      • Youtube音乐下载
      • Pytorch 安装环境配置 (old)
        • TorchEEG
      • Anaconda3 Python path
      • Data
      • IEEE-754 Floating Point Converter
        • ieee 754 conversion function
      • 文件读写
      • 文本清理
      • Python 下载在线视频
      • 修改Jupyter Notebook 默认工作目录
    • 3️⃣AI Websites
  • 🪤Programming
    • SQL
      • Delete data and reset auto-increment ID
    • Angular
      • Angular-datatables, dd/MM/yyyy, sorting (no paged list)
      • Datatables save state using localStorage
      • Variable storage method
      • Colour picker
      • Error fix for click columns on Datatable
      • Auto address use Google place
      • Auto address use Azure Maps
      • Upload file to Server
      • Validators.required OnChange input
      • Date, Time field
      • VS Code: Auto add missing imports when save
      • Datatable setting
      • Date time format
      • sticky <th> and <td> content
      • Filter booked time
      • Dropdown time selection with interval
      • Angular date online test
      • Updating data without refreshing the page
      • Object array sort and sum
      • Multi-type of columns use in one column
      • Select button for datatables
      • Switch button and event
      • Delete column from Array
      • Three-layer structure
      • Remove shadow when print mat-dialog content
      • JSON Parse && Object Array
      • Detect unused import in Typescript
      • Change location using radio button
      • display multi line message in the Toastr
      • Custom LOCALE_ID
      • Batch add data from csv to API server
        • Angular read csv and upload to Server
      • USB Port reader Web solution
      • Debug Angular app using JavaScript Debugger in VS Code
      • Skills
        • FormData & FormGroup to JSON
        • Dropdown list (customer)
        • Get current datetime
        • Get first day of year, month, and date
        • Call a function in a forEach loop
        • disable and readonly
        • Form element value
        • HTML input type
        • Input pattern (validation)
      • Display pipe (UI format)
        • Input upper case and button checked
        • Icons (Bootstrap and CoreUI)
        • Page Refresh
        • Selection list (two ways)
        • onChange Selection event
        • Random Password and Toggle
        • Password match
        • Select checkbox disable
      • Print and save to PDF
      • Import JS into Angular
      • LocalStorage
      • Angular DataTable
        • Data sort
        • A sample usage
        • Angular DataTable server side big data query
      • Change chart.js chart type
      • Angular UI - .NET API - .NET Auth
      • Angular - .NET API
      • *ngIf else && change to @if
      • Angular add reCAPTCHA v3 (Google)
      • Angular update
        • Update from v13 to v15
        • Update from v15 to v18
      • Angular application version central
      • Face detection
        • Face-api.js
      • Angular, Node version compatibility matrix
      • Clear cache
      • Angular oauth2 OIDC
      • Angular add header
    • .NET Skills
      • Add ID manually
      • Auto Mapping
        • Ignore Nesting
        • Startup setting
        • Datetime processing in AutoMapping
        • AutoMapper example
      • Validation filter
      • BaseController
      • Group by many
      • Database first, scaffold to class
      • Log setting and exception handler
      • Update appsetting.json value
      • Azure service bus message (queue)
      • Read appsetting.json value
      • Auth get user info by email
      • Azure Time zone
      • .NET API Add Service
      • Object comparison
      • Coravel Schedule
        • Read appsettings.json
      • .Net Core RDLC Report, Coravel and Email
      • Check Network and SQL server connections.
      • Datatime custom format
      • Many to Many EF
        • Many to Many CheckBox
      • PDFpig: Send Email with PDF attachment
      • .NET Core Middleware order
      • .NET API add Worker Service
      • .NET Router
      • Partial columns update
      • Add and Delete
      • 图片自适应宽度
      • ASP.NET Identity
      • Upload file to Azure
        • Upload file to Blob
      • Developer Guide
      • Code first one-many
      • ASP.NET MVC 5 Custom Error Page
      • VS can't debug
      • 通过邮编查 NSW COVID-19 感染人数
      • Jquery File Upload
      • Jquery Datepicker
      • ajax delete file from server
      • Autofac in MVC
      • Autofac in .NET Core
      • .NET Core
      • HTTP Return code
      • IdentityServer4
    • Power BI
      • Add parameter to PowerBI report
      • Convert UTC to Local time
      • Python in PowerBI
        • IEEE-754 conversion
      • PowerBI embed app - Server
      • PowerBI embed app - Client
        • Setting on portal
    • Azure service
      • Key Vault
      • Service bus - queue
      • Power Automate
      • Kusto Query Language
      • Azure Data Explorer
      • Reserved keyword on Azure Error
      • SQL Azure time convert
    • Azure blob
      • Azure blob setting
      • Display image from Blob
      • Upload image to Blob through .NET API
    • Html Bootstrap Icon, colour, size
      • Html spacing
      • Html text alignment
    • Video stream - JsMpeg
      • SSL - generate key
      • Client (SSL)
      • Websocket-Server (SSL)
      • Play RTSP video stream
    • ⏰Time Zone
      • datetime-local set date range
      • 🕐Get data by local time (UI, API)
      • 🕑Add offset hours for local UI and report
      • 🕒UTC time and Datetime convert
      • 🕓Angular - Timezone selection
      • 🕔Angular - Convert UTC to local time
      • 🕕C# Time Zone
  • >>>>>>>>>>>>>>>>>>>>>>>>>>>>
  • 🪜Apps and Skills
    • 1️Windows system app skills
      • Brother HL-2130 打印机 Toner 报警
      • VS Code 快捷键
      • Check SHA256 on windows
      • blob 视频下载
      • Photoshop 制作证件照片
      • 获取 Windows Key
      • 10进制36进制互转
      • Error when publish to Azure
      • Disable windows automatic update
      • Outlook setup for Yahoo Email
      • IIS setting
      • Windows 8/10, IIS Service
      • 安装程序出错 2052,2053 报警
      • 6 Yao Chinese UI
    • 2️Linux command
    • 3️Git command
    • 4️Bitbucket
    • 5️Gitbook Skills
    • 6️GitHub Desktop
    • 7️⃣EndNote
      • EndNote V21
      • Endnote使用技巧
      • 批量删除/修改Endnote 中 notes 栏内容
  • Android mobile connect PC
  • 💎USEFUL LINKS
    • 1️Coding websites
      • Website links
    • 2️Windows 平台工具,网站
    • 3️PotPlayer 设置
  • >>>>>>>>>>>>>>>>>>>>>>>>>>>>
  • 🚩Research >>EEG
    • 1️EEG基本知识的理论介绍
      • EEG 简介
      • EEG 的节律信号
      • EEG电极帽
      • EEG 伪迹
      • ERP 介绍
      • ERP 成分
      • EEG 数据分析软件
    • 2️LSL 应用
    • 3️EEG公开数据集汇总整理
    • 4️REDCap
      • Migration (Export & Import)
    • 5️⃣ScaneR
  • ☕Buy me a coffee
Powered by GitBook
On this page

Was this helpful?

  1. Programming
  2. Angular

USB Port reader Web solution

// TS

```typescript
import { Component,  Inject, OnDestroy, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { RfidService } from 'src/app/services/rfid.service';
import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { VehicleService } from 'src/app/services/vehicle.service';
import { CustomerService } from 'src/app/services/customer.service';
import { ToastrService } from 'ngx-toastr';
import { Connect, DisConnect, CheckStatus} from '../../../../assets/script/portscript.js'


@Component({
  selector: 'app-rfid-add-update',
  templateUrl: './rfid-add-update.component.html',
  styleUrls: ['./rfid-add-update.component.scss']
})
export class RfidAddUpdateComponent implements OnInit,OnDestroy  {

  frm!: FormGroup;
  submitClicked = false;
  is_edit: boolean = true;
  VehicleList: any;
  DriverList:any;
  CompanyList: any;

  constructor(
    @Inject(MAT_DIALOG_DATA) public data:any,
    public router: Router,
    public fb: FormBuilder,
    private rfidService: RfidService,
    private dialog: MatDialog,
    private vehicleService: VehicleService,
    private customerService: CustomerService,
    private toastr: ToastrService,
  ) { }



  ngOnInit(): void {
    this.initialForm(this.data);
 //   this.getCompanyList();
    this.getVehicleList();
   CheckStatus();

  }



  initialForm(data: any){
    this.frm = this.fb.group({
      rfidid: [{value:'', disabled: !this.is_edit}],
      rfidNo: ['', Validators.required],
      serialNo: ['', Validators.required],
      vehicleid: ['', Validators.required],
    });

   if (data.action == 'Edit' )
    {
      this.frm = this.fb.group({
        rfidid: data.rfid.rfidid,
        rfidNo: data.rfid.rfidNo,
        serialNo: data.rfid.serialNo,
        vehicleid: data.rfid.vehicleid
      });
    }
  }

  onConnect() {
    Connect();
  }

  onDisConnect() {
    DisConnect();
  //  window.location.reload();
  }

  ngOnDestroy(): void {
    window.location.reload();
  }

  async onSubmit(frm:FormGroup) {
    this.submitClicked = true;
    if (this.data.action == 'New')
    {
       this.rfidService.addNewRfid(frm.value)
          .subscribe({
            next: data => {
              if (data.status == 200)
              {
                  this.toastr.success('A new record has added successfully !', 'Success',{timeOut: 5000});
                  this.dialog.closeAll();    ///close DialogComponent
                  this.reload(this.router.url);
              }
            },
            error: error => {
                console.error('There was an error in update!', error);
                this.toastr.error('Add Fail', 'Error')
          }})
      // console.log(result);
    }
    else if (this.data.action == 'Edit') {
        this.rfidService.editRfid(frm.value)
         .subscribe({
            next: data => {
             if (data.status == 200)
             {
                 this.toastr.success('Update Success', 'Success');
                 this.dialog.closeAll();    ///close DialogComponent
                // this.reload(this.router.url);
             }
            },
            error: error => {
                console.error('There was an error in update!', error);
                this.toastr.error('Update Fail', 'Error')
        }})
    }
  }

	async reload(url: string): Promise<boolean> {
		await this.router.navigateByUrl('weighing', { skipLocationChange: true });
		return this.router.navigateByUrl(url);
	}


  //#region dropdown list

  getCompanyList(){
    return this.customerService.getCompanyWithCustomerList()
      .subscribe({
        next: res=>{
        this.CompanyList = res;
      },
      error: error => {
        console.log("retrive Customer list error"+error);
    }});

  }

  getVehicleList(){
    return this.vehicleService.getAllVehicles()
      .subscribe({
        next: res=>{
          this.VehicleList = res;
        },
        error: error => {
          console.log("Error: retrive Vehicle list error"+error);
    }});
  }

  //#endregion

}

```
// UI

```html
<h2 mat-dialog-title>{{data.action}} Rfid </h2>
<button (click)="onConnect()" class="btn btn-outline-success btn-sm" id="connectButton">Connect RFID reader</button> &nbsp;
<button (click)="onDisConnect()" class="btn btn-outline-warning btn-sm" id="disconnectButton"  >Disconnect</button>

<label class="text-info"  style="padding-left: 100px;" id="PortStatus" >Not connected</label>
<br>
<!-- <div class="form-group mb-2">
  <textarea id="monitor" readonly rows="2" cols="61"></textarea>
</div> -->


<hr><br>
<form [formGroup] = "frm" (ngSubmit)="onSubmit(frm)">
    <mat-dialog-content >
      <div class="form-group" hidden>
        <label>Rfid Id</label>
        <input class="form-control" [attr.disabled]="true"  formControlName="rfidid" >

      </div>
      <div class="form-group mb-2">
        <label>Rfid No</label>  <span style="color: red;"> *</span>
        <input class="form-control" formControlName="rfidNo" id="rfidNo" >
      </div>

      <div class="form-group mb-2">
        <label>Serial No</label> <span style="color: red;"> *</span>
        <input class="form-control" formControlName="serialNo" >
      </div>


      <div class="form-group mb-2">
        <label>Vehicle</label> <span style="color: red;"> *</span>
        <select class="form-select form-control" formControlName="vehicleid" id="inputGroupSelect03">
          <option *ngFor="let vehicle of VehicleList" [ngValue]="vehicle.vehicleid" >{{vehicle.rego}}</option>
        </select>
      </div>
      <div><span style="color: red;">*</span> is required</div>

    </mat-dialog-content>
    <div mat-dialog-actions align="center">
      <button class="btn btn-block btn-outline-secondary btn-sm" mat-button mat-dialog-close>Cancel</button>
      <span>&nbsp; &nbsp; </span> <span>&nbsp; &nbsp; </span>
      <button type="submit" [disabled] = "!frm.valid || submitClicked"  class="btn btn-outline-success btn-sm" mat-button>Save</button>
    </div>

</form>


```
// 
```typescript
 
  rootURL = environment.backEndAPIEndpoint;
 

  addNewRfid(formGroupData: any): Observable<any> {
    var formData = this.buildFormData(formGroupData);
    let endPoint = this.rootURL + 'api/rfid/create';
    return this.httpClient
      .post<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }

  editRfid(formGroupData: any): Observable<any> {
    var id = formGroupData['rfidid'];
    var formData = this.buildFormData(formGroupData);
    formData.append('Rfidid', id); //edit record need it,

    // for(var pair of formData.entries()) { console.log(pair[0]+ ', '+ pair[1]); }

    let endPoint = this.rootURL + 'api/rfid/edit/' + String(id);
    return this.httpClient
      .put<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }

  //#region functions

  buildFormData(formGroupData: any) {
    var formData: any = new FormData();
    formData.append(
      'RfidNo', formGroupData['rfidNo'] != null ? formGroupData['rfidNo'] : "''"
    );
    formData.append('SerialNo', formGroupData['serialNo']);
    formData.append('Customerid', formGroupData['customerid']);
    formData.append('Vehicleid', formGroupData['vehicleid']);
    return formData;
  }
```
// Some code
// Angular, assets/script

```javascript
let port;
let reader;
let cancel = false;
let isConnect;
let endStr = 13;
let rfidCode = "";

export async function Connect() {
  if ("serial" in navigator) {
    // alert("Your browser supports Web Serial API!");
    try {
      port = await navigator.serial.requestPort();
      await port.open({
        baudRate: 57600,
      });
      CheckStatus();
      while (port.readable) {
        reader = port.readable.getReader();
        try {
          while (true) {
            const { value, done } = await reader.read();
            if (done) {
              cancel = true;
              console.log("Canceled\n");
              break;
            }
            const foundEnd = value[value.length - 1];
            const inputValue = new TextDecoder().decode(value);
            rfidCode = rfidCode + inputValue;

            if (foundEnd === endStr) {
              add_rfid(rfidCode);
              rfidCode = "";
            }
            else {
              rfidCode = inputValue;
            }
          }
          if (cancel) break;
          reader.releaseLock();
        } catch (error) {
          console.log("[Error] Read" + error + "\n");
        } finally {
          CheckStatus();
          break;
        }
      }
    } catch (error) {
      console.log("[Error]Open" + error + "\n");
    }
  } else {
    alert(
      "Your browser does not support Web Serial API, the latest version of Google Chrome is recommended!"
    );
  }
}

//-----------------------------------------------------------------

export async function DisConnect() {
  try {
    reader.releaseLock();
    await port.close();
    console.log("Serial port closed.");
  } catch (error) {
    console.error(error);
  }
}

export function CheckStatus() {
  isConnect = false;
  var state = document.getElementById("PortStatus");

  try {
    if (port.readable) {
      state.innerHTML = "Connected.";
      document.getElementById("connectButton").disabled = true;
      document.getElementById("disconnectButton").disabled = false;
      isConnect = true;
    } else {
      state.innerHTML = "Not connected.";
      document.getElementById("connectButton").disabled = false;
      document.getElementById("disconnectButton").disabled = true;
    }
  } catch (error) {
    state.innerHTML = "Not connected.";
    document.getElementById("connectButton").disabled = false;
    document.getElementById("disconnectButton").disabled = true;
    console.log("[Error] Close" + error + "\n");
  }
}

function add_rfid(rfidCode) {
  let input = document.getElementById("rfidNo");
  input.value = rfidCode;
  input.dispatchEvent(new Event("input", { bubbles: true }));
   //beep();
   var audio = new Audio('../../../assets/sound/beep.mp3');
   audio.play();
}


//-----------------------------------------------------------------

function beep() {
  var snd = new  Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
  snd.play();
}


export function add_message(message) {
  let monitor = document.getElementById("monitor");
  monitor.value += message;
  monitor.schrollTop = monitor.scrollHeight;
}

async function send() {
  let text = document.getElementById("sendBox").value;
  document.getElementById("sendBox").value = "";
  const encoder = new TextEncoder();
  const writer = port.writable.getWriter();
  await writer.write(encoder.encode(text + "\n"));
  writer.releaseLock();
}

```

error TS7016: Could not find a declaration file for module

tsconfig.json

//

 
  rootURL = environment.backEndAPIEndpoint;
 
​
  addNewRfid(formGroupData: any): Observable<any> {
    var formData = this.buildFormData(formGroupData);
    let endPoint = this.rootURL + 'api/rfid/create';
    return this.httpClient
      .post<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }
​
  editRfid(formGroupData: any): Observable<any> {
    var id = formGroupData['rfidid'];
    var formData = this.buildFormData(formGroupData);
    formData.append('Rfidid', id); //edit record need it,
​
    // for(var pair of formData.entries()) { console.log(pair[0]+ ', '+ pair[1]); }
​
    let endPoint = this.rootURL + 'api/rfid/edit/' + String(id);
    return this.httpClient
      .put<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }
​
  //#region functions
​
  buildFormData(formGroupData: any) {
    var formData: any = new FormData();
    formData.append(
      'RfidNo', formGroupData['rfidNo'] != null ? formGroupData['rfidNo'] : "''"
    );
    formData.append('SerialNo', formGroupData['serialNo']);
    formData.append('Customerid', formGroupData['customerid']);
    formData.append('Vehicleid', formGroupData['vehicleid']);
    return formData;
  }

// Some code // Angular, assets/script ​

let port;
let reader;
let cancel = false;
let isConnect;
let endStr = 13;
let rfidCode = "";
​
export async function Connect() {
  if ("serial" in navigator) {
    // alert("Your browser supports Web Serial API!");
    try {
      port = await navigator.serial.requestPort();
      await port.open({
        baudRate: 57600,
      });
      CheckStatus();
      while (port.readable) {
        reader = port.readable.getReader();
        try {
          while (true) {
            const { value, done } = await reader.read();
            if (done) {
              cancel = true;
              console.log("Canceled\n");
              break;
            }
            const foundEnd = value[value.length - 1];
            const inputValue = new TextDecoder().decode(value);
            rfidCode = rfidCode + inputValue;
​
            if (foundEnd === endStr) {
              add_rfid(rfidCode);
              rfidCode = "";
            }
            else {
              rfidCode = inputValue;
            }
          }
          if (cancel) break;
          reader.releaseLock();
        } catch (error) {
          console.log("[Error] Read" + error + "\n");
        } finally {
          CheckStatus();
          break;
        }
      }
    } catch (error) {
      console.log("[Error]Open" + error + "\n");
    }
  } else {
    alert(
      "Your browser does not support Web Serial API, the latest version of Google Chrome is recommended!"
    );
  }
}
​
//-----------------------------------------------------------------
​
export async function DisConnect() {
  try {
    reader.releaseLock();
    await port.close();
    console.log("Serial port closed.");
  } catch (error) {
    console.error(error);
  }
}
​
export function CheckStatus() {
  isConnect = false;
  var state = document.getElementById("PortStatus");
​
  try {
    if (port.readable) {
      state.innerHTML = "Connected.";
      document.getElementById("connectButton").disabled = true;
      document.getElementById("disconnectButton").disabled = false;
      isConnect = true;
    } else {
      state.innerHTML = "Not connected.";
      document.getElementById("connectButton").disabled = false;
      document.getElementById("disconnectButton").disabled = true;
    }
  } catch (error) {
    state.innerHTML = "Not connected.";
    document.getElementById("connectButton").disabled = false;
    document.getElementById("disconnectButton").disabled = true;
    console.log("[Error] Close" + error + "\n");
  }
}
​
function add_rfid(rfidCode) {
  let input = document.getElementById("rfidNo");
  input.value = rfidCode;
  input.dispatchEvent(new Event("input", { bubbles: true }));
   //beep();
   var audio = new Audio('../../../assets/sound/beep.mp3');
   audio.play();
}
​
​
//-----------------------------------------------------------------
​
function beep() {
  var snd = new  Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
```typescript

  rootURL = environment.backEndAPIEndpoint;

​
  addNewRfid(formGroupData: any): Observable<any> {
    var formData = this.buildFormData(formGroupData);
    let endPoint = this.rootURL + 'api/rfid/create';
    return this.httpClient
      .post<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }
​
  editRfid(formGroupData: any): Observable<any> {
    var id = formGroupData['rfidid'];
    var formData = this.buildFormData(formGroupData);
    formData.append('Rfidid', id); //edit record need it,
​
    // for(var pair of formData.entries()) { console.log(pair[0]+ ', '+ pair[1]); }
​
    let endPoint = this.rootURL + 'api/rfid/edit/' + String(id);
    return this.httpClient
      .put<HttpResponse<Object>>(endPoint, formData, { observe: 'response' })
      .pipe((resp) => resp);
  }
​
  //#region functions
​
  buildFormData(formGroupData: any) {
    var formData: any = new FormData();
    formData.append(
      'RfidNo', formGroupData['rfidNo'] != null ? formGroupData['rfidNo'] : "''"
    );
    formData.append('SerialNo', formGroupData['serialNo']);
    formData.append('Customerid', formGroupData['customerid']);
    formData.append('Vehicleid', formGroupData['vehicleid']);
    return formData;
  }

// Some code // Angular, assets/script ​

let port;
let reader;
let cancel = false;
let isConnect;
let endStr = 13;
let rfidCode = "";
​
export async function Connect() {
  if ("serial" in navigator) {
    // alert("Your browser supports Web Serial API!");
    try {
      port = await navigator.serial.requestPort();
      await port.open({
        baudRate: 57600,
      });
      CheckStatus();
      while (port.readable) {
        reader = port.readable.getReader();
        try {
          while (true) {
const { value, done } = await reader.read();
            if (done) {
              cancel = true;
              console.log("Canceled\n");
              break;
            }
            const foundEnd = value[value.length - 1];
            const inputValue = new TextDecoder().decode(value);
            rfidCode = rfidCode + inputValue;
​
            if (foundEnd === endStr) {
              add_rfid(rfidCode);
              rfidCode = "";
            }
            else {
              rfidCode = inputValue;
            }
          }
          if (cancel) break;
          reader.releaseLock();
        } catch (error) {
          console.log("[Error] Read" + error + "\n");
        } finally {
          CheckStatus();
          break;
        }
      }
    } catch (error) {
      console.log("[Error]Open" + error + "\n");
    }
  } else {
    alert(
      "Your browser does not support Web Serial API, the latest version of Google Chrome is recommended!"
    );
  }
}
​
//-----------------------------------------------------------------
​
export async function DisConnect() {
  try {
    reader.releaseLock();
    await port.close();
    console.log("Serial port closed.");
  } catch (error) {
    console.error(error);
  }
}
​
export function CheckStatus() {
  isConnect = false;
  var state = document.getElementById("PortStatus");
​
  try {
    if (port.readable) {
      state.innerHTML = "Connected.";
      document.getElementById("connectButton").disabled = true;
      document.getElementById("disconnectButton").disabled = false;
      isConnect = true;
    } else {
      state.innerHTML = "Not connected.";
      document.getElementById("connectButton").disabled = false;
      document.getElementById("disconnectButton").disabled = true;
    }
  } catch (error) {
    state.innerHTML = "Not connected.";
document.getElementById("connectButton").disabled = false;
    document.getElementById("disconnectButton").disabled = true;
    console.log("[Error] Close" + error + "\n");
  }
}
​
function add_rfid(rfidCode) {
  let input = document.getElementById("rfidNo");
  input.value = rfidCode;
  input.dispatchEvent(new Event("input", { bubbles: true }));
   //beep();
   var audio = new Audio('../../../assets/sound/beep.mp3');
   audio.play();
}
​
​
//-----------------------------------------------------------------
​
function beep() {
var snd = new  Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
  snd.play();
}
​
​
export function add_message(message) {
  let monitor = document.getElementById("monitor");
  monitor.value += message;
  monitor.schrollTop = monitor.scrollHeight;
}
​
async function send() {
  let text = document.getElementById("sendBox").value;
  document.getElementById("sendBox").value = "";
  const encoder = new TextEncoder();
  const writer = port.writable.getWriter();
  await writer.write(encoder.encode(text + "\n"));
  writer.releaseLock();
}
​

error TS7016: Could not find a declaration file for module tsconfig.json "compilerOptions": { "noImplicitAny":false, ... }

PreviousAngular read csv and upload to ServerNextDebug Angular app using JavaScript Debugger in VS Code

Last updated 1 year ago

Was this helpful?

🪤