diff --git a/com.neil-enns.trackaudio.sdPlugin/manifest.json b/com.neil-enns.trackaudio.sdPlugin/manifest.json index f5df6f2..1e5b789 100644 --- a/com.neil-enns.trackaudio.sdPlugin/manifest.json +++ b/com.neil-enns.trackaudio.sdPlugin/manifest.json @@ -130,6 +130,10 @@ ] } ], + "ApplicationsToMonitor": { + "mac": ["com.vatsim.trackaudio"], + "windows": ["trackaudio.exe"] + }, "Category": "TrackAudio", "CategoryIcon": "images/plugin/categoryIcon", "CodePath": "bin/plugin.js", diff --git a/src/events/action/actionAdded.ts b/src/events/action/actionAdded.ts deleted file mode 100644 index 5d222f4..0000000 --- a/src/events/action/actionAdded.ts +++ /dev/null @@ -1,13 +0,0 @@ -import actionManager from "@managers/action"; -import trackAudioManager from "@managers/trackAudio"; - -export const handleActionAdded = () => { - // If this is the first button added then connect to TrackAudio. That will - // also cause a dump of the current state of all stations in TrackAudio. - if ( - actionManager.getActions().length === 1 && - !trackAudioManager.isConnected - ) { - trackAudioManager.connect(); - } -}; diff --git a/src/events/action/removed.ts b/src/events/action/removed.ts index c46fb68..9393fce 100644 --- a/src/events/action/removed.ts +++ b/src/events/action/removed.ts @@ -1,11 +1,9 @@ import actionManager from "@managers/action"; import vatsimManager from "@managers/vatsim"; import svgManager from "@managers/svg"; -import trackAudioManager from "@managers/trackAudio"; export const handleRemoved = (count: number) => { if (count === 0) { - trackAudioManager.disconnect(); svgManager.reset(); } @@ -13,9 +11,4 @@ export const handleRemoved = (count: number) => { if (actionManager.getAtisLetterControllers().length === 0) { vatsimManager.stop(); } - - // If there are no more actions at all stop trying to connect to TrackAudio - if (actionManager.getActions().length === 0) { - trackAudioManager.disconnect(); - } }; diff --git a/src/events/streamDeck/applicationDidLaunch.ts b/src/events/streamDeck/applicationDidLaunch.ts new file mode 100644 index 0000000..248927f --- /dev/null +++ b/src/events/streamDeck/applicationDidLaunch.ts @@ -0,0 +1,11 @@ +import { ApplicationDidLaunchEvent } from "@elgato/streamdeck"; +import trackAudioManager from "@managers/trackAudio"; +import mainLogger from "@utils/logger"; + +export const handleOnApplicationDidLaunch = (ev: ApplicationDidLaunchEvent) => { + const logger = mainLogger.child({ service: "applicationDidLaunch" }); + + logger.info("Received applicationDidLaunch event", ev.application); + trackAudioManager.isAppRunning = true; + trackAudioManager.connect(); +}; diff --git a/src/events/streamDeck/applicationDidTerminate.ts b/src/events/streamDeck/applicationDidTerminate.ts new file mode 100644 index 0000000..3f23cdd --- /dev/null +++ b/src/events/streamDeck/applicationDidTerminate.ts @@ -0,0 +1,17 @@ +import { ApplicationDidTerminateEvent } from "@elgato/streamdeck"; +import mainLogger from "@utils/logger"; +import trackAudioManager from "@managers/trackAudio"; +import vatsimManager from "@managers/vatsim"; + +export const handleOnApplicationDidTerminate = ( + ev: ApplicationDidTerminateEvent +) => { + const logger = mainLogger.child({ + service: "handleOnApplicationDidTerminate", + }); + + logger.info("Received applicationDidTerminate event", ev.application); + trackAudioManager.isAppRunning = false; + trackAudioManager.disconnect(); + vatsimManager.stop(); +}; diff --git a/src/events/streamDeck/atisLetter/addAtisLetter.ts b/src/events/streamDeck/atisLetter/addAtisLetter.ts index 5ec6e51..55ed7e1 100644 --- a/src/events/streamDeck/atisLetter/addAtisLetter.ts +++ b/src/events/streamDeck/atisLetter/addAtisLetter.ts @@ -17,5 +17,4 @@ export const handleAddAtisLetter = ( actionManager.add(controller); actionManager.emit("atisLetterAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/hotline/addHotline.ts b/src/events/streamDeck/hotline/addHotline.ts index d11c6b5..403485a 100644 --- a/src/events/streamDeck/hotline/addHotline.ts +++ b/src/events/streamDeck/hotline/addHotline.ts @@ -18,5 +18,4 @@ export const handleAddHotline = ( // Force buttons to refresh so the newly added button shows the correct state. actionManager.add(controller); actionManager.emit("hotlineAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/mainVolume/addMainVolume.ts b/src/events/streamDeck/mainVolume/addMainVolume.ts index e80ec3e..3d43777 100644 --- a/src/events/streamDeck/mainVolume/addMainVolume.ts +++ b/src/events/streamDeck/mainVolume/addMainVolume.ts @@ -17,5 +17,4 @@ export const handleAddMainVolume = ( actionManager.add(controller); actionManager.emit("mainVolumeAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/pushToTalk/addPushToTalk.ts b/src/events/streamDeck/pushToTalk/addPushToTalk.ts index 6b6c9ea..3bbc64e 100644 --- a/src/events/streamDeck/pushToTalk/addPushToTalk.ts +++ b/src/events/streamDeck/pushToTalk/addPushToTalk.ts @@ -15,5 +15,4 @@ import actionManager from "@managers/action"; actionManager.add(controller); actionManager.emit("pushToTalkAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/stationStatus/addStation.ts b/src/events/streamDeck/stationStatus/addStation.ts index 53fb359..67db193 100644 --- a/src/events/streamDeck/stationStatus/addStation.ts +++ b/src/events/streamDeck/stationStatus/addStation.ts @@ -17,5 +17,4 @@ export const handleAddStation = ( actionManager.add(controller); actionManager.emit("stationStatusAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/stationVolume/addStationVolume.ts b/src/events/streamDeck/stationVolume/addStationVolume.ts index 4b0a707..28c7775 100644 --- a/src/events/streamDeck/stationVolume/addStationVolume.ts +++ b/src/events/streamDeck/stationVolume/addStationVolume.ts @@ -17,5 +17,4 @@ export const handleAddStationVolume = ( actionManager.add(controller); actionManager.emit("stationVolumeAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/events/streamDeck/systemDidWakeUp.ts b/src/events/streamDeck/systemDidWakeUp.ts new file mode 100644 index 0000000..0f841a5 --- /dev/null +++ b/src/events/streamDeck/systemDidWakeUp.ts @@ -0,0 +1,14 @@ +import trackAudioManager from "@managers/trackAudio"; +import mainLogger from "@utils/logger"; + +export const handleOnSystemDidWakeUp = () => { + const logger = mainLogger.child({ service: "systemDidWakeUp" }); + + logger.info("Received systemDidWakeUp event"); + + // This ensures reconnection to the TrackAudio manager if somehow the websocket + // connection doesn't automatically start back up after a system wake. + if (trackAudioManager.isAppRunning) { + trackAudioManager.connect(); + } +}; diff --git a/src/events/streamDeck/trackAudioStatus/addTrackAudioStatus.ts b/src/events/streamDeck/trackAudioStatus/addTrackAudioStatus.ts index c705fd0..fdb1f75 100644 --- a/src/events/streamDeck/trackAudioStatus/addTrackAudioStatus.ts +++ b/src/events/streamDeck/trackAudioStatus/addTrackAudioStatus.ts @@ -17,5 +17,4 @@ export const handleAddTrackAudioStatus = ( actionManager.add(controller); actionManager.emit("trackAudioStatusAdded", controller); - actionManager.emit("actionAdded", controller); }; diff --git a/src/managers/action.ts b/src/managers/action.ts index 9461b50..ba4a091 100644 --- a/src/managers/action.ts +++ b/src/managers/action.ts @@ -279,7 +279,6 @@ class ActionManager extends EventEmitter { */ public add(controller: Controller): void { this.actions.push(controller); - this.emit("actionAdded", controller); } /** diff --git a/src/managers/trackAudio.ts b/src/managers/trackAudio.ts index 537397f..e163dac 100644 --- a/src/managers/trackAudio.ts +++ b/src/managers/trackAudio.ts @@ -29,6 +29,7 @@ class TrackAudioManager extends EventEmitter { private reconnectTimer: NodeJS.Timeout | null = null; private _isVoiceConnected = false; + private _isAppRunning = false; //#region Constructor and instance management private constructor() { @@ -47,6 +48,22 @@ class TrackAudioManager extends EventEmitter { } //#endregion + /** + * Gets whether the TrackAudio application was detected as running by Stream Deck. + * @returns {boolean} True if running. + */ + public get isAppRunning(): boolean { + return this._isAppRunning; + } + + /** + * Sets whether the TrackAudio application is running. + * @params newValue True if running. + */ + public set isAppRunning(newValue: boolean) { + this._isAppRunning = newValue; + } + /** * Sets the connection URL for TrackAudio. * @param url The URL for the TrackAudio instance diff --git a/src/plugin.ts b/src/plugin.ts index e8c6119..1a25534 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -18,31 +18,33 @@ import { StationVolume } from "@actions/stationVolume"; import { TrackAudioStatus } from "@actions/trackAudioStatus"; // Event handlers -import { MainVolume } from "@actions/mainVolume"; -import { handleActionAdded } from "@events/action/actionAdded"; import { handleAtisLetterAdded } from "@events/action/atisLetterAdded"; import { handleAtisLetterUpdated } from "@events/action/atisLetterUpdated"; -import { handleHotlineSettingsUpdated } from "@events/action/hotlineSettingsUpdated"; -import { handleMainVolumeAdded } from "@events/action/mainVolumeAdded"; -import { handleRemoved } from "@events/action/removed"; -import { handleStationStatusAdded } from "@events/action/stationStatusAdded"; -import { handleStationStatusSettingsUpdated } from "@events/action/stationStatusSettingsUpdated"; -import { handleStationVolumeAdded } from "@events/action/stationVolumeAdded"; -import { handleTrackAudioStatusAdded } from "@events/action/trackAudioStatusAdded"; -import { handleImageChanged } from "@events/svg/imageChanged"; import { handleConnected } from "@events/trackAudio/connected"; import { handleDisconnected } from "@events/trackAudio/disconnected"; import { handleFrequencyRemoved } from "@events/trackAudio/frequencyRemoved"; +import { handleHotlineSettingsUpdated } from "@events/action/hotlineSettingsUpdated"; +import { handleImageChanged } from "@events/svg/imageChanged"; +import { handleMainVolumeAdded } from "@events/action/mainVolumeAdded"; import { handleMainVolumeChange } from "@events/trackAudio/mainVolumeChange"; +import { handleOnApplicationDidLaunch } from "@events/streamDeck/applicationDidLaunch"; +import { handleOnApplicationDidTerminate } from "@events/streamDeck/applicationDidTerminate"; +import { handleOnSystemDidWakeUp } from "@events/streamDeck/systemDidWakeUp"; +import { handleRemoved } from "@events/action/removed"; import { handleRxBegin } from "@events/trackAudio/rxBegin"; import { handleRxEnd } from "@events/trackAudio/rxEnd"; import { handleStationAdded } from "@events/trackAudio/stationAdded"; import { handleStationStates } from "@events/trackAudio/stationStates"; import { handleStationStateUpdate } from "@events/trackAudio/stationStateUpdate"; +import { handleStationStatusAdded } from "@events/action/stationStatusAdded"; +import { handleStationStatusSettingsUpdated } from "@events/action/stationStatusSettingsUpdated"; +import { handleStationVolumeAdded } from "@events/action/stationVolumeAdded"; +import { handleTrackAudioStatusAdded } from "@events/action/trackAudioStatusAdded"; import { handleTxBegin } from "@events/trackAudio/txBegin"; import { handleTxEnd } from "@events/trackAudio/txEnd"; -import { handleVoiceConnectedState } from "@events/trackAudio/voiceConnectedState"; import { handleVatsimDataReceived } from "@events/vatsim/vatsimDataReceived"; +import { handleVoiceConnectedState } from "@events/trackAudio/voiceConnectedState"; +import { MainVolume } from "@actions/mainVolume"; const logger = mainLogger.child({ service: "plugin" }); @@ -54,7 +56,7 @@ process.on("uncaughtException", (error) => { logger.error("Uncaught Exception:", error); }); -// Register all the event handlers +// Register all the actions streamDeck.actions.registerAction(new AtisLetter()); streamDeck.actions.registerAction(new Hotline()); streamDeck.actions.registerAction(new PushToTalk()); @@ -63,6 +65,11 @@ streamDeck.actions.registerAction(new TrackAudioStatus()); streamDeck.actions.registerAction(new StationVolume()); streamDeck.actions.registerAction(new MainVolume()); +// Register the event handlers +streamDeck.system.onApplicationDidLaunch(handleOnApplicationDidLaunch); +streamDeck.system.onApplicationDidTerminate(handleOnApplicationDidTerminate); +streamDeck.system.onSystemDidWakeUp(handleOnSystemDidWakeUp); + trackAudioManager.on("connected", () => { disconnectHandled = false; handleConnected(); @@ -99,7 +106,6 @@ actionManager.on("trackAudioStatusAdded", handleTrackAudioStatusAdded); actionManager.on("trackAudioStatusUpdated", handleTrackAudioStatusAdded); actionManager.on("atisLetterAdded", handleAtisLetterAdded); actionManager.on("atisLetterUpdated", handleAtisLetterUpdated); -actionManager.on("actionAdded", handleActionAdded); actionManager.on("stationVolumeAdded", handleStationVolumeAdded); actionManager.on("mainVolumeAdded", handleMainVolumeAdded);