Compare commits

...

10 Commits

Author SHA1 Message Date
4ca91056b1 Merge branch 'develop' into 'master'
all features to master

See merge request group_rocho02/fitness-web!1
2023-09-14 07:18:46 +00:00
Schneider Roland
a6f9ae283b [5] - fix door_manager_log updated_at make nullable 2023-09-14 09:14:32 +02:00
Schneider Roland
f9de3a5908 0.0.60 2023-08-31 08:26:37 +02:00
Schneider Roland
0d06cc8657 0.0.59 2023-08-31 08:16:03 +02:00
Schneider Roland
45e2e4093c 0.0.58 2023-08-31 01:59:28 +02:00
Schneider Roland
9a62c6eba8 0.0.57 2023-08-31 01:44:48 +02:00
Schneider Roland
b7d265d92a serial-reader 2023-08-25 18:27:54 +02:00
Schneider Roland
691eb0cf23 add serial api 2023-08-24 07:02:43 +02:00
Schneider Roland
d0dfd677d0 add serial api 2023-08-23 01:10:56 +02:00
Schneider Roland
579d261cf9 0.0.56 2023-07-06 16:21:38 +02:00
6 changed files with 326 additions and 13 deletions

View File

@ -0,0 +1,42 @@
<?php
use yii\db\Migration;
/**
* Class m230914_062843_alter_table_door_log_manager_make_updated_at_nullable_and_default
*/
class m230914_062843_alter_table_door_log_manager_make_updated_at_nullable_and_default extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->alterColumn('door_manager_log','updated_at',$this->datetime()->null());
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
echo "m230914_062843_alter_table_door_log_manager_make_updated_at_nullable_and_default cannot be reverted.\n";
return false;
}
/*
// Use up()/down() to run migration code without a transaction.
public function up()
{
}
public function down()
{
echo "m230914_062843_alter_table_door_log_manager_make_updated_at_nullable_and_default cannot be reverted.\n";
return false;
}
*/
}

View File

@ -30,11 +30,12 @@ if ( isset($model->card)){
<?php $form = ActiveForm::begin([ <?php $form = ActiveForm::begin([
'enableAjaxValidation' => false, 'enableAjaxValidation' => false,
'method' => 'get', 'method' => 'get',
'action' => $route 'action' => $route,
'id' => 'reception-card-number-form'
]); ?> ]); ?>
<div class="row" > <div class="row" >
<div class='col-md-12'> <div class='col-md-12'>
<?php echo Html::textInput("number", $number ,['class' => 'form-control', 'placeholder' => 'Kártya/kulcs szám'])?> <?php echo Html::textInput("number", $number ,['class' => 'form-control', 'placeholder' => 'Kártya/kulcs szám', 'id' => 'input-reception-card-number'])?>
</div> </div>
</div> </div>
<div class="row" > <div class="row" >

View File

@ -1,14 +1,18 @@
<?php <?php
use frontend\components\ReceptionWidget; use frontend\components\ReceptionWidget;
?> ?>
<?php <?php
\frontend\assets\AppAsset::register($this); \frontend\assets\AppAsset::register($this);
?> ?>
<h1>Recepció</h1> <h1>Recepció</h1>
<?php echo ReceptionWidget::widget( ['form' => $model, 'route' => ['customer/reception'] ] )?> <?php
echo ReceptionWidget::widget(['form' => $model, 'route' => ['customer/reception']]) ?>
<?php <?php if ( !isset($model->card)){ ?>
// echo "Timezone:" . date_default_timezone_get(); <?= $this->render('serial', [
//echo date("Y-m-d H:i"); 'model' => $model,
]) ?>
<?php } ?>
?>

View File

@ -0,0 +1,266 @@
<style>
.warning-component {
padding: 12px;
border-radius: 6px;
margin-top: 12px;
}
</style>
<script>
const qrcodeReader = {
usbVendorId: 0x0c2e, usbProductId: 0x1094, name: 'qrcode'
};
const rfidReader = {
usbVendorId: 0x09d8, usbProductId: 0x0420, name: 'rfid'
};
const readers = [qrcodeReader, rfidReader];
const ports = {};
class SerialReader {
connected = false;
port = null;
value = null;
options = null;
constructor(options) {
this.options = options;
}
listen = async () => {
const options = this.options;
const port = options.port;
console.info("Listening port")
while (port.readable) {
const reader = port.readable.getReader();
try {
while (true) {
const {value, done} = await reader.read();
const str = String.fromCharCode.apply(null, value);
if (done) {
// |reader| has been canceled.
break;
}
options.onChange(str);
// Do something with |value|...
}
} catch (error) {
console.info("Error while listening port", error);
// Handle |error|...
// options.onError(error, options.device, 'listen');
} finally {
console.info("stopped listening port");
reader.releaseLock();
}
}
}
connect = async () => {
const options = this.options;
const port = options.port;
console.info("opening port", options, this.options.port);
await port.open({baudRate: 9600});
this.connected = true;
console.info("opened", options);
};
}
const pageLoadedAt = new Date().getTime();
const openCardNumber = (cardNumber) => {
if ( (new Date().getTime() - pageLoadedAt ) < 400 ){
return;
}
const input = document.getElementById('input-reception-card-number');
const form = document.getElementById('reception-card-number-form');
input.value = cardNumber;
form.submit();
}
const ready = async () => {
const startSerialReader = async (port) => {
const info = port.getInfo();
const id = info.usbVendorId + "_" + info.usbProductId;
const serialReader = new SerialReader({
port,
id,
onChange: (cardNumber) => openCardNumber(cardNumber)
}
);
ports[id] = serialReader;
await serialReader.connect();
serialReader.listen().then(() => console.info("listen finishend"))
}
const pickPort = async () => {
const vendors = document.getElementById('vendors');
const deviceGroupName = vendors.value;
console.info("vendorgroup selected", deviceGroupName);
let filters = readers
.filter(reader => reader.name === deviceGroupName).map(reader => ({'usbVendorId': reader.usbVendorId}));
console.info("Calling requestPort with filters", filters);
try {
const requestedPort = await navigator.serial
.requestPort({
filters: filters
});
await startSerialReader(requestedPort);
readStatus(0).then();
} catch (e) {
alert('Nem választott eszközt!')
}
}
const btnRfid = document.getElementById("rfid");
const btnQRcode = document.getElementById("qrcode");
const btnSelectDevice = document.getElementById("selectDevice");
// btnRfid.addEventListener('click', async () => {
// await rfid.requestPair();
// });
//
// btnQRcode.addEventListener('click', async () => {
// await qrcode.requestPair();
// });
btnSelectDevice.addEventListener('click', async () => {
await pickPort();
});
const sleep = m => new Promise(r => setTimeout(r, m))
const readStatus = async (millis) => {
const serialPorts = await navigator.serial.getPorts();
const infoDiv = document.getElementById('allowed_devices');
infoDiv.innerHTML = '';
const table = document.createElement("table");
table.classList.add('table');
table.classList.add('table-bordered');
const header = document.createElement("thead");
const tbody = document.createElement("tbody");
const headerRow = document.createElement('tr');
header.appendChild(headerRow);
const createTd = (text) =>{
const td = document.createElement('td');
td.innerText = text;
return td;
}
headerRow.appendChild(createTd("Vendor"))
headerRow.appendChild(createTd("Product"))
headerRow.appendChild(createTd("Típus"))
table.appendChild(header);
for (let port of serialPorts) {
const {usbVendorId, usbProductId} = port.getInfo();
const tableRow = document.createElement('tr');
const devices = readers.filter(reader => (reader.usbVendorId === usbVendorId));
let readerGroup = "Ismeretlen";
if (devices && devices.length) {
readerGroup = devices[0].name;
}
tableRow.innerHTML =
'<td>' + usbVendorId + '</td><td>' + usbProductId + '</td><td>' + readerGroup+'</td>';
tbody.appendChild(tableRow);
}
table.appendChild(tbody)
infoDiv.appendChild(table);
console.info("ports", serialPorts);
console.info("qr found", serialPorts.find(port => qrcodeReader.usbVendorId === port.getInfo().usbVendorId));
const displayWarningRfid = !serialPorts.find(port => rfidReader.usbVendorId === port.getInfo().usbVendorId);
const displayWarningQRCode = !serialPorts.find(port => qrcodeReader.usbVendorId === port.getInfo().usbVendorId);
console.info("displayWarningQRCode", displayWarningQRCode);
const warningComponentRfid = document.getElementById("warning-component-rfid");
const warningComponentQrcode = document.getElementById("warning-component-qrcode");
const setClassName = (element, className, active) => {
if (element) {
if (active) {
element.classList.add(className);
} else {
element.classList.remove(className);
}
}
}
setClassName(warningComponentRfid, 'show', displayWarningRfid);
setClassName(warningComponentRfid, 'hide', !displayWarningRfid);
setClassName(warningComponentQrcode, 'show', displayWarningQRCode);
setClassName(warningComponentQrcode, 'hide', !displayWarningQRCode);
if ( millis ){
await sleep(millis);
await readStatus(millis);
}
}
const start = async () => {
const serialPorts = await navigator.serial.getPorts();
for (const port of serialPorts) {
await startSerialReader(port)
}
}
readStatus(1000).then();
start().then(() => console.info("Startup process ready"))
}
document.addEventListener('DOMContentLoaded', ready);
</script>
<div class="mt-3 ">
<h3>Engedélyezett eszközök</h3>
<div class="alert-danger warning-component " id="warning-component-rfid">
Rfid olvasó nem található
<br>
<ul>
<li>Válaszd ki az 'Eszköztipusok' lenyiló listából az RFID olvasót</li>
<li>Nyomd meg az olvasó engedélyezée gombot</li>
<li>A felugró ablakban válaszd ki ismét az rfid olvasót</li>
<li>Nyomd meg a csatlakozás (connect) gombot</li>
</ul>
</div>
<div class="alert-danger warning-component" id="warning-component-qrcode">
QRCode olvasó nem található
<br>
<ul>
<li>Válaszd ki az 'Eszköztipusok' lenyiló listából az QRCode olvasót</li>
<li>Nyomd meg az olvasó engedélyezée gombot</li>
<li>A felugró ablakban válaszd ki ismét az QRCode olvasót (Pl.: HF680)</li>
<li>Nyomd meg a csatlakozás (connect) gombot</li>
</ul>
</div>
<div id="allowed_devices"></div>
<label for="vendors">Eszköztipusok</label>
<select name="vendors" id="vendors" class="vendors">
<option value="">Mind</option>
<option value="qrcode">QRCode</option>
<option value="rfid">RFID</option>
</select>
<button class="btn btn-primary" id="selectDevice">Olvasó engedélyezése</button>
<!-- <button class="btn btn-primary" id="rfid">Kártya Olvasó engedélyezése</button>-->
<!-- <button class="btn btn-primary" id="qrcode">QRCode Olvasó engedélyezése</button>-->
</div>

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "coma", "name": "coma",
"version": "0.0.55", "version": "0.0.60",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "coma", "name": "coma",
"version": "0.0.55", "version": "0.0.60",
"dependencies": { "dependencies": {
"cache-manager": "^3.3.0" "cache-manager": "^3.3.0"
}, },

View File

@ -1,7 +1,7 @@
{ {
"author": "rocho", "author": "rocho",
"name": "coma", "name": "coma",
"version": "0.0.55", "version": "0.0.60",
"private": true, "private": true,
"dependencies": { "dependencies": {
"cache-manager": "^3.3.0" "cache-manager": "^3.3.0"