From c2bc2327238fc6833be861379e214661bfb391ae Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Sat, 13 Jan 2018 14:28:02 +0100 Subject: scanner-session: add getCodeType() --- src/scanner-session/scannersession-interface.vala | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/scanner-session/scannersession-interface.vala') diff --git a/src/scanner-session/scannersession-interface.vala b/src/scanner-session/scannersession-interface.vala index 89498df..9f989e7 100644 --- a/src/scanner-session/scannersession-interface.vala +++ b/src/scanner-session/scannersession-interface.vala @@ -24,3 +24,12 @@ public enum MessageType { WARNING, ERROR } + +public enum ScannerSessionCodeType { + USER, + GUEST, + UNDO, + LOGOUT, + EAN, + UNKNOWN +} -- cgit v1.2.3 From 297d9ca5b7476a6a51f9837741b8cebec484de0d Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Fri, 5 Jan 2018 16:57:47 +0100 Subject: scanner-session: initial state machine implementation --- src/scanner-session/scannersession-interface.vala | 12 + src/scanner-session/scannersession.vala | 311 +++++++++++++--------- 2 files changed, 199 insertions(+), 124 deletions(-) (limited to 'src/scanner-session/scannersession-interface.vala') diff --git a/src/scanner-session/scannersession-interface.vala b/src/scanner-session/scannersession-interface.vala index 9f989e7..ff2c2e9 100644 --- a/src/scanner-session/scannersession-interface.vala +++ b/src/scanner-session/scannersession-interface.vala @@ -33,3 +33,15 @@ public enum ScannerSessionCodeType { EAN, UNKNOWN } + +public enum ScannerSessionState { + READY, + USER +} + +public struct ScannerResult { + public MessageType type; + public string message; + public AudioType audioType; + public string nextScannerdata; +} diff --git a/src/scanner-session/scannersession.vala b/src/scanner-session/scannersession.vala index 23db939..f19d94c 100644 --- a/src/scanner-session/scannersession.vala +++ b/src/scanner-session/scannersession.vala @@ -26,6 +26,8 @@ public class ScannerSessionImplementation { private InputDevice dev; private Cli cli; + private ScannerSessionState state = ScannerSessionState.READY; + private DetailedProduct[] shoppingCard = {}; public signal void msg(MessageType type, string message); public signal void msg_overlay(string title, string message); @@ -51,10 +53,6 @@ public class ScannerSessionImplementation { msg(type, message); } - private void logout() { - logged_in = false; - } - private bool login(int user) throws IOError { this.user = user; try { @@ -120,141 +118,206 @@ public class ScannerSessionImplementation { } } - private void handle_barcode(string scannerdata) { - try { - stdout.printf("scannerdata: %s\n", scannerdata); - if(interpret(scannerdata)) - dev.blink(1000); - } catch(IOError e) { - send_message(MessageType.ERROR, "IOError: %s", e.message); - } catch(DatabaseError e) { - send_message(MessageType.ERROR, "DatabaseError: %s", e.message); + private ScannerResult handleReadyState(string scannerdata) throws DatabaseError, IOError{ + ScannerSessionCodeType codeType = getCodeType(scannerdata); + ScannerResult scannerResult = ScannerResult(); + switch (codeType) { + case ScannerSessionCodeType.USER: + int32 userid = int.parse(scannerdata.substring(5)); + if(login(userid)) { + scannerResult.type = MessageType.INFO; + scannerResult.message = "Login: %s (%d)".printf(name, user); + scannerResult.audioType = AudioType.LOGIN; + shoppingCard = {}; + state = ScannerSessionState.USER; + } else { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Login failed (User ID = %d)".printf(userid); + scannerResult.audioType = AudioType.ERROR; + state = ScannerSessionState.READY; + } + return scannerResult; + case ScannerSessionCodeType.GUEST: + if(login(0)) { + scannerResult.type = MessageType.INFO; + scannerResult.message = "Login as GUEST"; + scannerResult.audioType = AudioType.LOGIN; + shoppingCard = {}; + state = ScannerSessionState.USER; + } else { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Login failed as GUEST"; + scannerResult.audioType = AudioType.ERROR; + state = ScannerSessionState.READY; + } + return scannerResult; + case ScannerSessionCodeType.EAN: + uint64 ean = 0; + scannerdata.scanf("%llu", out ean); + var p = DetailedProduct(); + try { + p = db.get_product_for_ean(ean); + } catch(IOError e) { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Internal Error!"; + scannerResult.audioType = AudioType.ERROR; + return scannerResult; + } catch(DatabaseError e) { + if(e is DatabaseError.PRODUCT_NOT_FOUND) { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Error: unknown product: %llu".printf(ean); + scannerResult.audioType = AudioType.ERROR; + } else { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Error: %s".printf(e.message); + scannerResult.audioType = AudioType.ERROR; + } + return scannerResult; + } + + var mprice = p.memberprice; + var gprice = p.guestprice; + var pname = p.name; + + scannerResult.type = MessageType.INFO; + scannerResult.message = @"article info: $pname (Member: $mprice €, Guest: $gprice €)"; + scannerResult.audioType = AudioType.ERROR; + state = ScannerSessionState.READY; + return scannerResult; + default: + state = ScannerSessionState.READY; + return scannerResult; } } - private bool interpret(string scannerdata) throws DatabaseError, IOError { - if(scannerdata.has_prefix("USER ")) { - string str_id = scannerdata.substring(5); - int32 id = int.parse(str_id); - - /* check if scannerdata has valid format */ - if(scannerdata != "USER %d".printf(id)) { - audio.play_system("error.ogg"); - send_message(MessageType.ERROR, "Invalid User ID: %s", scannerdata); - return false; - } + private ScannerResult handleUserState(string scannerdata) throws DatabaseError, IOError { + ScannerSessionCodeType codeType = getCodeType(scannerdata); + ScannerResult scannerResult = ScannerResult(); + switch (codeType) { + case ScannerSessionCodeType.EAN: + uint64 ean = 0; + scannerdata.scanf("%llu", out ean); + var p = DetailedProduct(); + try { + p = db.get_product_for_ean(ean); + } catch(IOError e) { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Internal Error!"; + scannerResult.audioType = AudioType.ERROR; + return scannerResult; + } catch(DatabaseError e) { + if(e is DatabaseError.PRODUCT_NOT_FOUND) { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Error: unknown product: %llu".printf(ean); + scannerResult.audioType = AudioType.ERROR; + } else { + scannerResult.type = MessageType.ERROR; + scannerResult.message = "Error: %s".printf(e.message); + scannerResult.audioType = AudioType.ERROR; + } + return scannerResult; + } - if(logged_in) { - send_message(MessageType.WARNING, "Last user forgot to logout"); - logout(); - } + shoppingCard += p; - if(login(id)) { - audio.play_user(theme, "login"); - send_message(MessageType.INFO, "Login: %s (%d)", name, user); - return true; - } else { - audio.play_system("error.ogg"); - send_message(MessageType.ERROR, "Login failed (User ID = %d)", id); - return false; - } - } else if(scannerdata == "GUEST") { - if(logged_in) { - send_message(MessageType.WARNING, "Last user forgot to logout"); - logout(); - } + Price price = p.memberprice; - if(login(0)) { - audio.play_user(theme, "login"); - send_message(MessageType.INFO, "Login: %s (%d)", name, user); - return true; - } else { - audio.play_system("error.ogg"); - send_message(MessageType.ERROR, "Login failed (User ID = 0)"); - return false; - } - } else if(scannerdata == "UNDO") { - if(!logged_in) { - audio.play_system("error.ogg"); - send_message(MessageType.ERROR, "Can't undo if not logged in!"); - return false; - } else { - string product = db.undo(user); + if(user == 0){ + price = p.guestprice; + } - if(product != "") { - audio.play_user(theme, "purchase"); - send_message(MessageType.INFO, "Removed purchase of %s", product); - return true; + scannerResult.type = MessageType.INFO; + scannerResult.message = @"article added to shopping card: $(p.name) ($price €)"; + scannerResult.audioType = AudioType.PURCHASE; + state = ScannerSessionState.USER; + break; + case ScannerSessionCodeType.UNDO: + if(shoppingCard.length > 0){ + var removedProduct = shoppingCard[shoppingCard.length-1]; + shoppingCard = shoppingCard[0:shoppingCard.length-1]; + scannerResult.type = MessageType.INFO; + scannerResult.message = @"removed last Item from Shopping Cart: $(removedProduct.name)"; + scannerResult.audioType = AudioType.INFO; } else { - audio.play_user(theme, "error"); - send_message(MessageType.ERROR, "Couldn't undo last purchase!"); - return false; + scannerResult.type = MessageType.INFO; + scannerResult.message = @"No more Items on your Shopping Cart"; + scannerResult.audioType = AudioType.ERROR; } - } - } else if(scannerdata == "LOGOUT") { - if(logged_in) { - audio.play_user(theme, "logout"); - send_message(MessageType.INFO, "Logout!"); - logout(); - return true; - } - - return false; - } else { - uint64 id = 0; - scannerdata.scanf("%llu", out id); - - /* check if scannerdata has valid format */ - if(scannerdata != "%llu".printf(id) && scannerdata != "%08llu".printf(id) && scannerdata != "%013llu".printf(id)) { - audio.play_user(theme, "error"); - send_message(MessageType.ERROR, "invalid product: %s", scannerdata); - return false; - } + break; + case ScannerSessionCodeType.LOGOUT: + scannerResult = logout(); + break; + case ScannerSessionCodeType.USER: + case ScannerSessionCodeType.GUEST: + //Logout alten User und akrtikel kaufen + scannerResult = logout(); + scannerResult.nextScannerdata = scannerdata; + break; + } - string name = "unknown product"; + return scannerResult; + } - try { - id = db.ean_alias_get(id); - name = db.get_product_name(id); - } catch(IOError e) { - audio.play_user(theme, "error"); - send_message(MessageType.ERROR, "Internal Error!"); - return false; - } catch(DatabaseError e) { - if(e is DatabaseError.PRODUCT_NOT_FOUND) { - audio.play_user(theme, "error"); - var msg = "Error: unknown product: %llu".printf(id); - send_message(MessageType.ERROR, msg); - msg_overlay("Attention", msg); - } else { - audio.play_user(theme, "error"); - send_message(MessageType.ERROR, "Error: %s", e.message); - } - return false; + private ScannerResult buyShoppingCard() { + ScannerResult scannerResult = ScannerResult(); + uint8 amountOfItems = 0; + Price totalPrice = 0; + uint8 i = 0; + DetailedProduct p = DetailedProduct(); + for(i = 0; i < shoppingCard.length; i++) { + p = shoppingCard[i]; + db.buy(user, p.ean); + amountOfItems++; + Price price = p.memberprice; + if(user == 0) { + price = p.guestprice; } + totalPrice += price; + } + scannerResult.type = MessageType.INFO; + scannerResult.message = @"$name bought $amountOfItems items for $totalPrice €"; + scannerResult.audioType = AudioType.INFO; + return scannerResult; + } - if(!logged_in) { - var mprice = db.get_product_price(1, id); - var gprice = db.get_product_price(0, id); - var msg = @"article info: $name (Member: $mprice €, Guest: $gprice €)"; - audio.play_system("error.ogg"); - send_message(MessageType.INFO, msg); - send_message(MessageType.ERROR, "Login required for purchase!"); - msg_overlay("Attention", "%s\nLogin required for purchase!".printf(msg)); + private void handle_barcode(string scannerdata) { + try { + stdout.printf("scannerdata: %s\n", scannerdata); + if(interpret(scannerdata)) + dev.blink(1000); + } catch(IOError e) { + send_message(MessageType.ERROR, "IOError: %s", e.message); + } catch(DatabaseError e) { + send_message(MessageType.ERROR, "DatabaseError: %s", e.message); + } + } - return false; - } + private bool interpret(string scannerdata) throws DatabaseError, IOError { + ScannerResult scannerResult = ScannerResult(); + switch (state) { + case ScannerSessionState.READY: + scannerResult = handleReadyState(scannerdata); + break; + case ScannerSessionState.USER: + scannerResult = handleUserState(scannerdata); + break; + } - if(db.buy(user, id)) { - var price = db.get_product_price(user, id); - audio.play_user(theme, "purchase"); - send_message(MessageType.INFO, @"article bought: $name ($price €)"); - return true; - } else { - audio.play_user(theme, "error"); - send_message(MessageType.ERROR, "purchase failed!"); - return false; - } + play_audio(scannerResult.audioType); + send_message(scannerResult.type, scannerResult.message); + if(scannerResult.nextScannerdata != null){ + interpret(scannerResult.nextScannerdata); } + return true; } + + private ScannerResult logout() { + ScannerResult scannerResult = ScannerResult(); + scannerResult = buyShoppingCard(); + logged_in = false; + state = ScannerSessionState.READY; + return scannerResult; + } + + } -- cgit v1.2.3 From c70d626e473c8cbdbd87125a256ca221c0c3fa23 Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Mon, 12 Feb 2018 23:16:11 +0100 Subject: Add RFID support --- example.cfg | 3 +- sql/tables.sql | 1 + src/database/database.vala | 46 +++++++++++++++++++++++ src/database/db-interface.vala | 6 +++ src/input-device/main.vala | 13 +++++-- src/scanner-session/scannersession-interface.vala | 1 + src/scanner-session/scannersession.vala | 20 +++++++--- src/serial-device/main.vala | 6 +-- src/web/csv.vala | 10 +++++ src/web/web.vala | 1 + systemd/shopsystem-input-device-rfid.rules | 1 + templates/users/entry.html | 1 + 12 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 systemd/shopsystem-input-device-rfid.rules (limited to 'src/scanner-session/scannersession-interface.vala') diff --git a/example.cfg b/example.cfg index 65056d8..a56e074 100644 --- a/example.cfg +++ b/example.cfg @@ -6,7 +6,8 @@ spacename = Mainframe file = /path/to/shop.db [INPUT] # use ignore if you have no device (this skips the input feature) -device = /dev/input/by-id/path-to-barcode-scanner +barcodescanner = /dev/barcodescanner +rfidreader = /dev/rfidreader [MAIL] server = mail.server.example.com port = 587 diff --git a/sql/tables.sql b/sql/tables.sql index fbe4d0e..1518ef2 100644 --- a/sql/tables.sql +++ b/sql/tables.sql @@ -9,5 +9,6 @@ CREATE TABLE IF NOT EXISTS supplier(id INTEGER PRIMARY KEY AUTOINCREMENT, name T CREATE TABLE IF NOT EXISTS cashbox_diff(id INTEGER PRIMARY KEY AUTOINCREMENT, user INTEGER NOT NULL REFERENCES users, amount INTEGER NOT NULL, timestamp INTEGER NOT NULL DEFAULT 0); CREATE TABLE IF NOT EXISTS ean_aliases (id INTEGER PRIMARY KEY NOT NULL, real_ean INTEGER NOT NULL REFERENCES products); CREATE TABLE IF NOT EXISTS categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT); +CREATE TABLE IF NOT EXISTS rfid_users (rfid TEXT, user INTEGER NOT NULL REFERENCES users); CREATE INDEX IF NOT EXISTS invoiceindex ON sales (user ASC, timestamp DESC); COMMIT; diff --git a/src/database/database.vala b/src/database/database.vala index dc636b8..0ce3f87 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -138,6 +138,10 @@ public class DataBase : Object { queries["alias_ean_add"] = "INSERT OR IGNORE INTO ean_aliases (id, real_ean) VALUES (?, ?)"; queries["alias_ean_get"] = "SELECT real_ean FROM ean_aliases WHERE id = ?"; queries["alias_ean_list"] = "SELECT id, real_ean FROM ean_aliases ORDER BY id ASC"; + queries["userid_rfid"] = "SELECT user FROM rfid_users WHERE rfid = ?"; + queries["rfid_userid"] = "SELECT rfid FROM rfid_users WHERE user = ?"; + queries["rfid_insert"] = "INSERT OR REPLACE INTO rfid_users ('user','rfid') VALUES (?,?)"; + queries["rfid_delete_user"] = "DELETE FROM rfid_users WHERE user = ?"; /* compile queries into statements */ foreach(var entry in queries.entries) { @@ -632,6 +636,17 @@ public class DataBase : Object { throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc); } + statements["rfid_userid"].reset(); + statements["rfid_userid"].bind_int(1, user); + rc = statements["rfid_userid"].step(); + + string[] rfid = {}; + while(rc == Sqlite.ROW) { + rfid += statements["rfid_userid"].column_text(0); + rc = statements["rfid_userid"].step(); + } + result.rfid = rfid; + return result; } @@ -894,6 +909,21 @@ public class DataBase : Object { int rc = statements["user_replace"].step(); if(rc != Sqlite.DONE) throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc); + + statements["rfid_delete_user"].reset(); + statements["rfid_delete_user"].bind_int(1, u.id); + rc = statements["rfid_delete_user"].step(); + if(rc != Sqlite.DONE) + throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc); + + foreach (string rfid in u.rfid) { + statements["rfid_insert"].reset(); + statements["rfid_insert"].bind_int(1, u.id); + statements["rfid_insert"].bind_text(2, rfid); + rc = statements["rfid_insert"].step(); + if(rc != Sqlite.DONE) + throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc); + } } public bool user_is_disabled(int user) throws DatabaseError { @@ -1164,4 +1194,20 @@ public class DataBase : Object { return bbdlist.data; } + + public int get_userid_for_rfid(string rfid) throws IOError, DatabaseError { + statements["userid_rfid"].reset(); + statements["userid_rfid"].bind_text(1, rfid); + + int rc = statements["userid_rfid"].step(); + + switch(rc) { + case Sqlite.ROW: + return statements["userid_rfid"].column_int(0); + case Sqlite.DONE: + throw new DatabaseError.RFID_NOT_FOUND("unknown rfid: %s", rfid); + default: + throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc); + } + } } diff --git a/src/database/db-interface.vala b/src/database/db-interface.vala index de5bbc4..b6d1395 100644 --- a/src/database/db-interface.vala +++ b/src/database/db-interface.vala @@ -65,6 +65,9 @@ public interface Database : Object { public abstract uint64 ean_alias_get(uint64 ean) throws IOError; public abstract EanAlias[] ean_alias_list() throws IOError; public abstract BestBeforeEntry[] bestbeforelist() throws IOError; + public abstract int get_userid_for_rfid(string rfid) throws IOError, DatabaseError; + public abstract void addrfid(string rfid, int user) throws IOError, DatabaseError; + public abstract void delete_rfid_for_user(int user) throws IOError, DatabaseError; } public struct Category { @@ -126,6 +129,7 @@ public struct UserInfo { public bool disabled; public bool hidden; public string soundTheme; + public string[] rfid; public bool equals(UserInfo x) { if(id != x.id) return false; @@ -140,6 +144,7 @@ public struct UserInfo { if(joined_at != x.joined_at) return false; if(disabled != x.disabled) return false; if(hidden != x.hidden) return false; + if(rfid != x.rfid) return false; return true; } @@ -197,4 +202,5 @@ public errordomain DatabaseError { SESSION_NOT_FOUND, USER_NOT_FOUND, CONSTRAINT_FAILED, + RFID_NOT_FOUND, } diff --git a/src/input-device/main.vala b/src/input-device/main.vala index 8578033..30119b0 100644 --- a/src/input-device/main.vala +++ b/src/input-device/main.vala @@ -13,12 +13,14 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -Device dev; +Device devScanner; +Device devRfid; public static int main(string[] args) { try { Config cfg = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.Config", "/io/mainframe/shopsystem/config"); - dev = new Device(cfg.get_string("INPUT", "device")); + devScanner = new Device(cfg.get_string("INPUT", "barcodescanner")); + devRfid = new Device(cfg.get_string("INPUT", "rfidreader")); } catch(IOError e) { error("IOError: %s\n", e.message); } catch(KeyFileError e) { @@ -40,7 +42,12 @@ public static int main(string[] args) { void on_bus_aquired(DBusConnection con) { try { - con.register_object("/io/mainframe/shopsystem/device", dev); + con.register_object("/io/mainframe/shopsystem/device/scanner", devScanner); + } catch(IOError e) { + stderr.printf("Could not register service\n"); + } + try { + con.register_object("/io/mainframe/shopsystem/device/rfid", devRfid); } catch(IOError e) { stderr.printf("Could not register service\n"); } diff --git a/src/scanner-session/scannersession-interface.vala b/src/scanner-session/scannersession-interface.vala index ff2c2e9..c19a434 100644 --- a/src/scanner-session/scannersession-interface.vala +++ b/src/scanner-session/scannersession-interface.vala @@ -31,6 +31,7 @@ public enum ScannerSessionCodeType { UNDO, LOGOUT, EAN, + RFIDEM4100, UNKNOWN } diff --git a/src/scanner-session/scannersession.vala b/src/scanner-session/scannersession.vala index f19d94c..7cc9cc4 100644 --- a/src/scanner-session/scannersession.vala +++ b/src/scanner-session/scannersession.vala @@ -23,7 +23,8 @@ public class ScannerSessionImplementation { private Database db; private AudioPlayer audio; - private InputDevice dev; + private InputDevice devScanner; + private InputDevice devRfid; private Cli cli; private ScannerSessionState state = ScannerSessionState.READY; @@ -35,11 +36,13 @@ public class ScannerSessionImplementation { public ScannerSessionImplementation() { try { db = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.Database", "/io/mainframe/shopsystem/database"); - dev = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.InputDevice", "/io/mainframe/shopsystem/device"); + devScanner = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.InputDevice", "/io/mainframe/shopsystem/device/scanner"); + devRfid = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.InputDevice", "/io/mainframe/shopsystem/device/rfid"); cli = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.Cli", "/io/mainframe/shopsystem/cli"); audio = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.AudioPlayer", "/io/mainframe/shopsystem/audio"); - dev.received_barcode.connect(handle_barcode); + devScanner.received_barcode.connect(handle_barcode); + devRfid.received_barcode.connect(handle_barcode); cli.received_barcode.connect(handle_barcode); } catch(IOError e) { error("IOError: %s\n", e.message); @@ -85,6 +88,8 @@ public class ScannerSessionImplementation { return ScannerSessionCodeType.UNDO; } else if(scannerdata == "LOGOUT") { return ScannerSessionCodeType.LOGOUT; + } else if(scannerdata.length == 10) { + return ScannerSessionCodeType.RFIDEM4100; } else { //Handle EAN Code uint64 id = 0; @@ -184,6 +189,10 @@ public class ScannerSessionImplementation { scannerResult.audioType = AudioType.ERROR; state = ScannerSessionState.READY; return scannerResult; + case ScannerSessionCodeType.RFIDEM4100: + int user = db.get_userid_for_rfid(scannerdata); + scannerResult.nextScannerdata =@"USER $user"; + return scannerResult; default: state = ScannerSessionState.READY; return scannerResult; @@ -249,7 +258,8 @@ public class ScannerSessionImplementation { break; case ScannerSessionCodeType.USER: case ScannerSessionCodeType.GUEST: - //Logout alten User und akrtikel kaufen + case ScannerSessionCodeType.RFIDEM4100: + /* Logout old user session (and buy articles) */ scannerResult = logout(); scannerResult.nextScannerdata = scannerdata; break; @@ -284,7 +294,7 @@ public class ScannerSessionImplementation { try { stdout.printf("scannerdata: %s\n", scannerdata); if(interpret(scannerdata)) - dev.blink(1000); + devScanner.blink(1000); } catch(IOError e) { send_message(MessageType.ERROR, "IOError: %s", e.message); } catch(DatabaseError e) { diff --git a/src/serial-device/main.vala b/src/serial-device/main.vala index 0dea907..70d50e2 100644 --- a/src/serial-device/main.vala +++ b/src/serial-device/main.vala @@ -13,12 +13,12 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -Device dev; +Device scanner; public static int main(string[] args) { try { Config cfg = Bus.get_proxy_sync(BusType.SYSTEM, "io.mainframe.shopsystem.Config", "/io/mainframe/shopsystem/config"); - dev = new Device(cfg.get_string("INPUT", "device"), 9600, 8, 1); + scanner = new Device(cfg.get_string("INPUT", "barcodescanner"), 9600, 8, 1); } catch(IOError e) { error("IOError: %s\n", e.message); } catch(KeyFileError e) { @@ -40,7 +40,7 @@ public static int main(string[] args) { void on_bus_aquired(DBusConnection con) { try { - con.register_object("/io/mainframe/shopsystem/device", dev); + con.register_object("/io/mainframe/shopsystem/devicescanner", scanner); } catch(IOError e) { stderr.printf("Could not register service\n"); } diff --git a/src/web/csv.vala b/src/web/csv.vala index 299af8d..5d4daba 100644 --- a/src/web/csv.vala +++ b/src/web/csv.vala @@ -1,4 +1,5 @@ /* Copyright 2012, Sebastian Reichel + * Copyright 2017-2018, Johannes Rudolph * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -66,6 +67,15 @@ public class CSVMemberFile { m.pgp = csv_value(linedata[9]); m.hidden = int.parse(csv_value(linedata[10])) != 0; m.disabled = int.parse(csv_value(linedata[11])) != 0; + string[] rfid = {}; + if(csv_value(linedata[12]) != "") + rfid += csv_value(linedata[12]); + if(csv_value(linedata[13]) != "") + rfid += csv_value(linedata[13]); + if(csv_value(linedata[14]) != "") + rfid += csv_value(linedata[14]); + m.rfid = rfid; + m.soundTheme = ""; if(csv_value(linedata[0]) != "EXTERNEMITGLIEDSNUMMER") members += m; diff --git a/src/web/web.vala b/src/web/web.vala index 37e6edc..f4207ad 100644 --- a/src/web/web.vala +++ b/src/web/web.vala @@ -351,6 +351,7 @@ public class WebServer { t.replace("PGPKEYID", userinfo.pgp); t.replace("DISABLED", userinfo.disabled ? "true" : "false"); t.replace("HIDDEN", userinfo.hidden ? "true" : "false"); + t.replace("RFID", string.joinv("
",userinfo.rfid)); var userauth = db.get_user_auth(id); t.replace("ISSUPERUSER", userauth.superuser ? "true" : "false"); diff --git a/systemd/shopsystem-input-device-rfid.rules b/systemd/shopsystem-input-device-rfid.rules new file mode 100644 index 0000000..aebfbea --- /dev/null +++ b/systemd/shopsystem-input-device-rfid.rules @@ -0,0 +1 @@ +ACTION=="add", ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="0035", MODE="0666", SYMLINK+="rfidreader" TAG+="systemd", ENV{SYSTEMD_WANTS}="shopsystem-input-device" diff --git a/templates/users/entry.html b/templates/users/entry.html index 065c4e7..b1477c7 100644 --- a/templates/users/entry.html +++ b/templates/users/entry.html @@ -22,6 +22,7 @@ Street{{{STREET}}} PLZ{{{POSTALCODE}}} City{{{CITY}}} + RFID{{{RFID}}} Settings Sound theme -- cgit v1.2.3