<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<oembed><type>rich</type><version>1.0</version><provider_name>phorkie</provider_name><provider_url>https://p.cweiske.de/</provider_url><title>chrome/chromium app: read RFID cards via chome.serial</title><author_name>Christian Weiske</author_name><cache_age>86400</cache_age><width>900</width><height>900</height><html>&lt;!-- embedding all files of https://p.cweiske.de/109 --&gt;
&lt;link rel="stylesheet" href="https://p.cweiske.de/css/embed.css"/&gt;
&lt;div class="phork" id="109"&gt;
    &lt;div class="phork-file"&gt;
 &lt;div class="phork-content"&gt;
  
&lt;div class="document"&gt;


&lt;p&gt;How to produce errors:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Windows: Disable the COM port in device manager&lt;/li&gt;
&lt;li&gt;Linux: Remove read rights from device file /dev/ttyS0&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

 &lt;/div&gt;
 &lt;div class="phork-meta"&gt;
  &lt;a href="https://p.cweiske.de/109/rev-raw/02ebc10c05731ecea593d1e612f14de107640d21/errors.rst" style="float: right"&gt;view raw source&lt;/a&gt;
  &lt;a href="https://p.cweiske.de/109#errors.rst"&gt;errors.rst&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;
    &lt;div class="phork-file"&gt;
 &lt;div class="phork-content"&gt;
  &lt;style type="text/css"&gt;/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .de1, .javascript .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.javascript  {font-family:monospace;}
.javascript .imp {font-weight: bold; color: red;}
.javascript li, .javascript .li1 {color: #DDD;}
.javascript .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
&lt;/style&gt;&lt;div class="code"&gt;&lt;table class="javascript"&gt;&lt;tbody&gt;&lt;tr class="li1"&gt;&lt;td class="ln"&gt;&lt;pre class="de1"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
&lt;/pre&gt;&lt;/td&gt;&lt;td class="de1"&gt;&lt;pre class="de1"&gt;rfidReader &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; webview&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160; &amp;#160; connectionId&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;''&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160; &amp;#160; connected&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160; &amp;#160; infoInterval&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160; &amp;#160; stringReceived&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;''&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* Initialize the rfid reader connection and register the onReceive event&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @return void&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*/&lt;/span&gt;
&amp;#160; &amp;#160; init&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; self &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw1"&gt;this&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; window.&lt;span class="me1"&gt;addEventListener&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'load'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; self.&lt;span class="me1"&gt;webview&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; document.&lt;span class="me1"&gt;getElementById&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'guestportalWebview'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; self.&lt;span class="me1"&gt;webview&lt;/span&gt;.&lt;span class="me1"&gt;addEventListener&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;loadstop&amp;quot;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;self.&lt;span class="me1"&gt;connected&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// load all devices&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; chrome.&lt;span class="me1"&gt;serial&lt;/span&gt;.&lt;span class="me1"&gt;getDevices&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;self.&lt;span class="me1"&gt;getDevicesCallback&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; chrome.&lt;span class="me1"&gt;serial&lt;/span&gt;.&lt;span class="me1"&gt;onReceive&lt;/span&gt;.&lt;span class="me1"&gt;addListener&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;self.&lt;span class="me1"&gt;onReceiveCallback&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* Convert an array buffer into a string.&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @param array data&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @return String&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*/&lt;/span&gt;
&amp;#160; &amp;#160; convertArrayBufferToString&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;data&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt; String.&lt;span class="me1"&gt;fromCharCode&lt;/span&gt;.&lt;span class="me1"&gt;apply&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Uint8Array&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;data&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* Removes not used numbers from the serial readout and trim it.&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* This has to be done, otherwise the card id is not usable.&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* Example:&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* 39383431303030313131333036393032 converts to 9841000111306902&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @param String result&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @return String&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*/&lt;/span&gt;
&amp;#160; &amp;#160; convertResult&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;result&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt; result.&lt;span class="me1"&gt;replace&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="co2"&gt;/\d(\d)/g&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'$1'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;replace&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="co2"&gt;/^\s+|\s+$/gm&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;''&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* The callback for fetching the available serial devices.&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @param array ports Array of XXX with all available devices&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @return void&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*/&lt;/span&gt;
&amp;#160; &amp;#160; getDevicesCallback&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ports&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; path &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;typeof&lt;/span&gt; ports &lt;span class="sy0"&gt;===&lt;/span&gt; &lt;span class="st0"&gt;'undefined'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;showError&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'No serial devices found.'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt; &amp;#160;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ports.&lt;span class="me1"&gt;length&lt;/span&gt; &lt;span class="sy0"&gt;===&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;clientInformation.&lt;span class="me1"&gt;platform&lt;/span&gt;.&lt;span class="me1"&gt;match&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="co2"&gt;/linux/i&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;//we do not get any information about serial devices&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// on linux, so we simply assume there is one&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; path &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'/dev/ttyS0'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;showError&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'No serial devices found.'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; path &lt;span class="sy0"&gt;=&lt;/span&gt; ports&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;.&lt;span class="me1"&gt;path&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// connect to the first serial device&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; chrome.&lt;span class="me1"&gt;serial&lt;/span&gt;.&lt;span class="me1"&gt;connect&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;path&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;bitrate&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="nu0"&gt;19200&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;connectionInfo&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;typeof&lt;/span&gt; connectionInfo &lt;span class="sy0"&gt;===&lt;/span&gt; &lt;span class="st0"&gt;'undefined'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;showError&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Cannot access serial device.'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;connectionId&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; connectionInfo.&lt;span class="me1"&gt;connectionId&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;connected&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* The callback for fetching the data sent by the serial reader.&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @param object info The readout from the serial port&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;* @return void&lt;/span&gt;
&lt;span class="coMULTI"&gt;&amp;#160; &amp;#160; &amp;#160;*/&lt;/span&gt;
&amp;#160; &amp;#160; onReceiveCallback&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;info&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;info.&lt;span class="me1"&gt;connectionId&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; rfidReader.&lt;span class="me1"&gt;connectionId&lt;/span&gt; &lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt; info.&lt;span class="me1"&gt;data&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; str &lt;span class="sy0"&gt;=&lt;/span&gt; rfidReader.&lt;span class="me1"&gt;convertArrayBufferToString&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;info.&lt;span class="me1"&gt;data&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;str.&lt;span class="me1"&gt;charAt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;str.&lt;span class="me1"&gt;length&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;===&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;&lt;span class="es0"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt; &lt;span class="sy0"&gt;+=&lt;/span&gt; str.&lt;span class="me1"&gt;substring&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; str.&lt;span class="me1"&gt;length&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; rfidReader.&lt;span class="me1"&gt;convertResult&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt; &lt;span class="sy0"&gt;===&lt;/span&gt; &lt;span class="st0"&gt;''&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; console.&lt;span class="me1"&gt;log&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'received an empty string'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// send the retreived data to the webview content&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;webview&lt;/span&gt;.&lt;span class="me1"&gt;contentWindow&lt;/span&gt;.&lt;span class="me1"&gt;postMessage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;cardId&lt;span class="sy0"&gt;:&lt;/span&gt; rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'*'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;''&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; rfidReader.&lt;span class="me1"&gt;stringReceived&lt;/span&gt; &lt;span class="sy0"&gt;+=&lt;/span&gt; str&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; showError&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; console.&lt;span class="me1"&gt;error&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.&lt;span class="me1"&gt;getElementById&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'error'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;appendChild&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;document.&lt;span class="me1"&gt;createTextNode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.&lt;span class="me1"&gt;getElementById&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'error'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;display&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'block'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
rfidReader.&lt;span class="me1"&gt;init&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="phork-meta"&gt;
  &lt;a href="https://p.cweiske.de/109/rev-raw/02ebc10c05731ecea593d1e612f14de107640d21/rfidReader.js" style="float: right"&gt;view raw source&lt;/a&gt;
  &lt;a href="https://p.cweiske.de/109#rfidReader.js"&gt;rfidReader.js&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</html></oembed>
