diff --git a/src/IPCHandler.ts b/src/IPCMainHandler.ts similarity index 91% rename from src/IPCHandler.ts rename to src/IPCMainHandler.ts index aa50d17..3543931 100644 --- a/src/IPCHandler.ts +++ b/src/IPCMainHandler.ts @@ -19,5 +19,7 @@ export const IPCSend = ( message: IPCAnswer, ...args: any ): void => { + console.log("Sending ", message, " to " + channel); + global.mainWebContents.send(channel, message, ...args); }; \ No newline at end of file diff --git a/src/NFCHandler.ts b/src/NFCHandler.ts index 5e10f74..454629d 100644 --- a/src/NFCHandler.ts +++ b/src/NFCHandler.ts @@ -1,5 +1,5 @@ import {NFC} from "nfc-pcsc"; -import {IPCSend} from "./IPCHandler"; +import {IPCSend} from "./IPCMainHandler"; import { IPCListenChannels, NFCAccountCard, @@ -54,7 +54,6 @@ export default class NFCHandler { reader.on('end', () => { console.log(`${reader.name} device removed`); }); - }); nfc.on('error', err => { @@ -66,7 +65,7 @@ export default class NFCHandler { fs.watchFile(path.resolve(process.cwd(), "nfc.test"), (curr, prev) => { let contents = fs.readFileSync(path.resolve(process.cwd(), "nfc.test")).toString("utf-8"); let parsed = this.formClass("xyz", contents); - if (parsed) + if (parsed.isComplete) IPCSend(IPCListenChannels.NFC_CARD, {status: true, data: parsed.card}); IPCSend(IPCListenChannels.NFC_RAW, {status: parsed.isComplete, data: parsed.card}); @@ -82,6 +81,8 @@ export default class NFCHandler { * @param raw */ public static formClass(uid: string, raw: string): formClassReturn | null { + raw = Buffer.from(raw, "base64").toString("utf-8"); + /* NFC-Card FULL diff --git a/src/RawConstants.ts b/src/RawConstants.ts index be921a7..2f46de3 100644 --- a/src/RawConstants.ts +++ b/src/RawConstants.ts @@ -93,8 +93,28 @@ export interface NFCCard { raw?: string } +export enum AccountSymbols { + HAT= "Hut", + CAT= "Katze", + SHOE= "Schuh", + SHIP= "Kriegsschiff", + RACE_CAR = "Rennauto", + THIMBLE= "Fingerhut", + WHEELBARROW= "Schubkarre", + DOG = "Hund", + IRON = "Bügeleisen", + BATTLESHIP = "Schlachtschiff", + TOP_HAT = "Zylinder", + CANNON = "Kanone", + TREX = "T-Rex", + RUBBER_DUCK = "Gummiente", + PENGUIN = "Pinguin", + + PLAYTYPUS= "Schnabeltier" +} + export interface NFCAccountCard extends NFCCard { - symbol: string, + symbol: AccountSymbols, nickname: string, pin: number } @@ -144,14 +164,13 @@ export interface NFCPropertyCard extends NFCCard { specialProperties: NFCPropertyCardSpecialProperties|"", } -export type TaskType = - "GET_FROM_BANK" - | "GET_FROM_ALL_PLAYERS" - | "PAY_TO_BANK" - | "PAY_TO_ALL_PLAYERS" - | "PAY_FOR_PROPS" - | "ESCAPE_JAIl"; - +export enum TaskType { + GET_FROM_BANK= "GET_FROM_BANK", // 1 val + PAY_TO_BANK= "PAY_TO_BANK", // 1 val + PAY_TO_ALL_PLAYERS= "PAY_TO_ALL_PLAYERS", // 1 val + PAY_FOR_PROPS= "PAY_FOR_PROPS", // 2 val + ESCAPE_JAIL= "ESCAPE_JAIL" // 0 val +} /** * NFC Task Card @@ -161,4 +180,5 @@ export interface NFCTaskCard extends NFCCard { type: TaskType amount?: number, amount2?: number -} \ No newline at end of file +} + diff --git a/src/SmartMonopoly.ts b/src/SmartMonopoly.ts index 6f126df..ee08c33 100644 --- a/src/SmartMonopoly.ts +++ b/src/SmartMonopoly.ts @@ -1,4 +1,4 @@ -import {IPCHandle} from "./IPCHandler"; +import {IPCHandle} from "./IPCMainHandler"; import {FunctionTest, GameRules} from "./RawConstants"; import OSHandler from "./OSHandler"; import CloudHandler from "./CloudHandler"; @@ -55,9 +55,9 @@ export default class SmartMonopoly { IPCHandle("CLOUD_CONNECT", async (e, request) => { try { await CloudHandler.connect(); - return {status: true} + return {status: true}; } catch (e) { - return {status: false, data: e}; + return {status: false, data: e.toString()}; } }); diff --git a/src/preload.ts b/src/preload.ts index ea2d3aa..02dcde9 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -9,8 +9,7 @@ contextBridge.exposeInMainWorld('api', { request: (channel: IPCChannel, request: IPCRequest, ...args: any): Promise => { return ipcRenderer.invoke(channel, request, ...args); }, - receive: (channel: IPCChannel, func: (event: IpcRendererEvent, message: IPCAnswer, ...args: any) => void) => { - console.log("preload-receive called. args: "); + listen: (channel: IPCChannel, func: (event: IpcRendererEvent, message: IPCAnswer, ...args: any) => void) => { ipcRenderer.on(channel, (event, message: IPCAnswer, ...args: any) => func(event, message, ...args)); }, }) \ No newline at end of file diff --git a/src/web/App.tsx b/src/web/App.tsx index dfeefc6..3622573 100644 --- a/src/web/App.tsx +++ b/src/web/App.tsx @@ -6,6 +6,7 @@ import Game from "./Game"; import GameSetup from "./GameSetup"; import GameEnd from "./GameEnd"; import Setup from "./Setup"; +import IPCRendererListener from "./IPCRendererListener"; const root = createRoot(document.getElementById("root")); @@ -35,6 +36,7 @@ export class App extends Component<{}, AppState> { currentPage: PAGE.SETUP, showWiFi: false, } + IPCRendererListener.initialAttach(); } toggleWiFiSettings = (state: boolean) => { diff --git a/src/web/CardSetup.tsx b/src/web/CardSetup.tsx index 8de6a60..8e4098f 100644 --- a/src/web/CardSetup.tsx +++ b/src/web/CardSetup.tsx @@ -1,4 +1,5 @@ import { + AccountSymbols, NFCAccountCard, NFCCard, NFCCardType, @@ -29,13 +30,10 @@ import { } from "@mui/material"; type AccountValues = keyof NFCAccountCard; - type PropertyValues = keyof NFCPropertyCard; - type TaskValues = keyof NFCTaskCard; interface CardSetupState { - validNFCCard: boolean, NFCCardType: NFCCardType, accountValues: { [key in AccountValues]?: string | number }, @@ -54,9 +52,15 @@ export default class CardSetup extends Component super(props); let defaultType = NFCCardType.ACCOUNT; - let accountValues: { [key in AccountValues]?: string | number } = {}; - let propertyValues: { [key in PropertyValues]?: string | number | boolean } = {}; - let taskValues: { [key in TaskValues]?: string | TaskType | number } = {}; + let accountValues: { [key in AccountValues]?: string | number } = { + symbol: "pleaseSelect" + }; + let propertyValues: { [key in PropertyValues]?: string | number | boolean } = { + color: "pleaseSelect" + }; + let taskValues: { [key in TaskValues]?: string | TaskType | number } = { + type: "pleaseSelect" + }; if (props.card) { defaultType = props.card.cardType as NFCCardType; @@ -84,7 +88,6 @@ export default class CardSetup extends Component } this.state = { - validNFCCard: false, NFCCardType: defaultType, accountValues: accountValues, @@ -106,7 +109,7 @@ export default class CardSetup extends Component left: '50%', transform: 'translate(-50%, -50%)', width: 700, - maxHeight: '80%', + maxHeight: '85%', overflowY: 'scroll', height: 'auto', display: 'block', @@ -116,7 +119,7 @@ export default class CardSetup extends Component p: 4, }; - changeAccountState(prop: AccountValues, ev: React.ChangeEvent, useUpperCase = false) { + changeAccountState(prop: AccountValues, ev: any, useUpperCase = false) { this.setState(prevState => ({ ...prevState, accountValues: { @@ -147,12 +150,12 @@ export default class CardSetup extends Component })) } - changeTaskState(prop: TaskValues, ev: React.ChangeEvent) { + changeTaskState(prop: TaskValues, ev: any) { this.setState(prevState => ({ ...prevState, taskValues: { ...prevState.taskValues, - prop: ev.target.value + [prop]: ev.target.value } })) } @@ -160,12 +163,20 @@ export default class CardSetup extends Component insertInputsPerType = () => { if (this.state.NFCCardType == NFCCardType.ACCOUNT) { return ( - this.changeAccountState("symbol", ev)} - /> + Symbol + onChange={(ev) => this.changePropertyState("specialProperties", ev)} > } label="Keine"/> - } label="Bahnhof"/> - } label="Versorgungswerk"/> + } label="Bahnhof"/> + } label="Versorgungswerk"/> } label="Gefängnis"/> @@ -334,30 +345,46 @@ export default class CardSetup extends Component } if (this.state.NFCCardType == NFCCardType.TASK) { + /** + * type: TaskType + * amount?: number, + * amount2?: number + */ return ( + Typ + this.changeAccountState("symbol", ev)} - /> - this.changeAccountState("nickname", ev)} + helperText={this.state.taskValues["type"] == "PAY_FOR_PROPS" ? "Preis pro Haus" : "Geldbetrag"} /> this.changeAccountState("pin", ev)} + helperText={"gfs. Preis pro Hotel"} /> - ) } - return (
Typ selektieren um fortzufahren.
) + return (
Bitte einen Typ selektieren um fortzufahren.
) } render() { @@ -382,7 +409,7 @@ export default class CardSetup extends Component NFC-Karte konfigurieren - {this.state.validNFCCard ? "Es wurde eine gültige Spielkarte erkannt." : "Es wurde eine ungültige NFC-Karte erkannt."} + {this.props.validCard ? "Es wurde eine gültige Spielkarte erkannt." : "Es wurde eine ungültige NFC-Karte erkannt."}

Karten-Typ @@ -397,9 +424,8 @@ export default class CardSetup extends Component } > {Object.values(NFCCardType).map(e => { - return ( - {(e)} + {(e == NFCCardType.INVALID ? "Bitte wählen" : e)} ) })} diff --git a/src/web/GameHandler.ts b/src/web/GameHandler.ts index b5a4510..12e5194 100644 --- a/src/web/GameHandler.ts +++ b/src/web/GameHandler.ts @@ -1,6 +1,6 @@ import {PAGE} from "./App"; import {IPCListenChannels, NFCCard} from "../RawConstants"; -import IPCListener from "./IPCListener"; +import IPCRendererListener from "./IPCRendererListener"; export enum GAME_STATE { NOT_STARTED, @@ -31,8 +31,8 @@ export default class GameHandler { static attachNFCHandler(cb: (card: NFCCard) => void) { - IPCListener.detach(this.attachedNFCHandler); - this.attachedNFCHandler = IPCListener.attach(IPCListenChannels.NFC_CARD, (ipcMsg) => { + IPCRendererListener.detach(this.attachedNFCHandler); + this.attachedNFCHandler = IPCRendererListener.attach(IPCListenChannels.NFC_CARD, (ipcMsg) => { if(ipcMsg.status) cb(ipcMsg.data as NFCCard); }); @@ -40,7 +40,7 @@ export default class GameHandler { static detachNFCHandler() { - IPCListener.detach(this.attachedNFCHandler); + IPCRendererListener.detach(this.attachedNFCHandler); } static async requestPreparing(useCloud: boolean) diff --git a/src/web/GameSetup.tsx b/src/web/GameSetup.tsx index da88814..99cff7a 100644 --- a/src/web/GameSetup.tsx +++ b/src/web/GameSetup.tsx @@ -8,18 +8,17 @@ import { Grid, ListItemAvatar, Snackbar, Typography, - Avatar, ListItemText, ListItem, List + Avatar, ListItemText, ListItem, List, Chip } from "@mui/material"; import NfcIcon from '@mui/icons-material/Nfc'; import AddCardIcon from '@mui/icons-material/AddCard'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; -import PersonRemoveIcon from '@mui/icons-material/PersonRemove'; -import ImageIcon from '@mui/icons-material/Image'; -import WorkIcon from '@mui/icons-material/Work'; -import BeachAccessIcon from '@mui/icons-material/BeachAccess'; + import GameHandler from "./GameHandler"; import {NFCCard} from "../RawConstants"; +import {Person as PersonIcon, QrCode, RemoveDone} from "@mui/icons-material"; +import CloudIcon from "@mui/icons-material/Cloud"; interface GameState { snackMsg: string, @@ -58,7 +57,7 @@ export default class GameSetup extends Component<{}, GameState> { return
{ this.setState(prevState => ({ ...prevState, @@ -97,35 +96,57 @@ export default class GameSetup extends Component<{}, GameState> { + {this.setState(prevState => ({ + ...prevState, + helpDialog: true + }))}} + label="?" color="info" + variant="outlined"/> - Wer spielt mit? - - + Wer spielt mit? + {this.setState(prevState => ({ + ...prevState, + snackMsg: "Um einen Spieler hinzuzufügen, lege eine NFC-Karte auf den leser!" + }))}} + label={
NFC
} color="secondary" + variant="outlined"/> + + - + - + - + {console.log("connect?")}}/> + + + - + - + {}}/> + + + - + - + {}}/> + + + diff --git a/src/web/IPCListener.ts b/src/web/IPCRendererListener.ts similarity index 95% rename from src/web/IPCListener.ts rename to src/web/IPCRendererListener.ts index c562ab1..1bde27f 100644 --- a/src/web/IPCListener.ts +++ b/src/web/IPCRendererListener.ts @@ -5,7 +5,7 @@ type IPCListen = { fn: (message: IPCAnswer, ...args: any) => void, } -export default class IPCListener { +export default class IPCRendererListener { private static attachments: Map = new Map(); private static uID = 99; diff --git a/src/web/Player.ts b/src/web/Player.ts new file mode 100644 index 0000000..55fc558 --- /dev/null +++ b/src/web/Player.ts @@ -0,0 +1,4 @@ +export default class Player { + private nickname: string; + private figure: string; +} \ No newline at end of file diff --git a/src/web/Setup.tsx b/src/web/Setup.tsx index 4f2aed2..6096240 100644 --- a/src/web/Setup.tsx +++ b/src/web/Setup.tsx @@ -29,7 +29,7 @@ import { PropertyColor } from "../RawConstants"; import NfcIcon from "@mui/icons-material/Nfc"; -import IPCListener from "./IPCListener"; +import IPCRendererListener from "./IPCRendererListener"; import CardSetup from "./CardSetup"; @@ -297,19 +297,22 @@ export default class Setup extends Component<{}, InitialSetupState> { nfcCard: card, validCard: isComplete })); + console.log(card); } private rawNFCListener: number = 0; componentDidMount() { - this.getSettings().then(); - this.rawNFCListener = IPCListener.attach(IPCListenChannels.NFC_RAW, (message) => { + + this.rawNFCListener = IPCRendererListener.attach(IPCListenChannels.NFC_RAW, (message) => { this.onNFCRawEvent(message.data, message.status); + console.log("Got an raw nfc event") }) + this.getSettings().then(); } componentWillUnmount() { - IPCListener.detach(this.rawNFCListener); + IPCRendererListener.detach(this.rawNFCListener); } handleClose = () => { diff --git a/src/web/Startup.tsx b/src/web/Startup.tsx index bb97b25..da3ac9b 100644 --- a/src/web/Startup.tsx +++ b/src/web/Startup.tsx @@ -74,13 +74,17 @@ export default class Startup extends Component { let response = await window.api.request("CLOUD_CONNECT", {}); this.setState((prevState) => ({ ...prevState, - snackErrorMsg: response.data.toString(), + snackErrorMsg: "Fehler:" + response.data.toString(), isCloudConnected: response.status, isConnectionIssue: !response.status, })); console.log(response) return response.status; } catch (e) { + this.setState((prevState) => ({ + ...prevState, + snackErrorMsg: "Ein unerwarteter Fehler ist aufgetreten.", + })); return false; } } diff --git a/src/web/components.css b/src/web/components.css index 652cfb7..47a69b9 100644 --- a/src/web/components.css +++ b/src/web/components.css @@ -12,7 +12,7 @@ } .animationBreathe { - animation: breathing 3s ease-out infinite normal; + animation: breathing 2.5s ease-out infinite normal; -webkit-font-smoothing: antialiased; } @@ -25,9 +25,9 @@ } 25% { - -webkit-transform: scale(1.1); - -ms-transform: scale(1.1); - transform: scale(1.1); + -webkit-transform: scale(1.2); + -ms-transform: scale(1.2); + transform: scale(1.2); } 80% {