Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 8936bfe

Browse files
committed
Bug fixes from last push/release
Reverted changes to streaming that caused weird behavior Fixed a bug with Always On Top not being applied to all windows Started working on RtspStreamManager to support RTSP camera streams
1 parent 6692bbc commit 8936bfe

17 files changed

Lines changed: 453 additions & 137 deletions

FlashForgeUI.csproj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
<WarningLevel>4</WarningLevel>
3535
</PropertyGroup>
3636
<ItemGroup>
37+
<Reference Include="AForge, Version=2.2.5.0, Culture=neutral, PublicKeyToken=c1db6ff4eaa06aeb, processorArchitecture=MSIL">
38+
<HintPath>packages\AForge.2.2.5\lib\AForge.dll</HintPath>
39+
</Reference>
40+
<Reference Include="AForge.Video, Version=2.2.5.0, Culture=neutral, PublicKeyToken=cbfb6e07d173c401, processorArchitecture=MSIL">
41+
<HintPath>packages\AForge.Video.2.2.5\lib\AForge.Video.dll</HintPath>
42+
</Reference>
3743
<Reference Include="Costura, Version=6.0.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
3844
<HintPath>packages\Costura.Fody.6.0.0\lib\netstandard2.0\Costura.dll</HintPath>
3945
</Reference>
@@ -57,6 +63,9 @@
5763
<Reference Include="ReaLTaiizor, Version=3.8.1.1, Culture=neutral, processorArchitecture=MSIL">
5864
<HintPath>packages\ReaLTaiizor.3.8.1.1\lib\net48\ReaLTaiizor.dll</HintPath>
5965
</Reference>
66+
<Reference Include="RtspClientSharp, Version=1.3.3.0, Culture=neutral, PublicKeyToken=af963665c791e92e, processorArchitecture=MSIL">
67+
<HintPath>packages\RtspClientSharp.1.3.3\lib\netstandard2.0\RtspClientSharp.dll</HintPath>
68+
</Reference>
6069
<Reference Include="SlicerMeta">
6170
<HintPath>..\SlicerMeta\bin\Debug\SlicerMeta.dll</HintPath>
6271
</Reference>
@@ -103,7 +112,9 @@
103112
<DependentUpon>MainMenu.cs</DependentUpon>
104113
</Compile>
105114
<Compile Include="ui\main\manager\ButtonManager.cs" />
106-
<Compile Include="ui\main\manager\CameraStreamManager.cs" />
115+
<Compile Include="ui\main\manager\camera\CameraHelper.cs" />
116+
<Compile Include="ui\main\manager\camera\MjpegStreamManager.cs" />
117+
<Compile Include="ui\main\manager\camera\RtspStreamManager.cs" />
107118
<Compile Include="ui\main\manager\ConnectionManager.cs" />
108119
<Compile Include="ui\main\manager\StatusTimerManager.cs" />
109120
<Compile Include="ui\main\util\Compat.cs" />

packages.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="AForge" version="2.2.5" targetFramework="net48" />
4+
<package id="AForge.Video" version="2.2.5" targetFramework="net48" />
35
<package id="Costura.Fody" version="6.0.0" targetFramework="net48" developmentDependency="true" />
46
<package id="Discord.Webhook" version="1.0.9" targetFramework="net48" />
57
<package id="Fody" version="6.9.1" targetFramework="net48" developmentDependency="true" />
68
<package id="HttpMultipartParser" version="8.4.0" targetFramework="net48" />
79
<package id="Microsoft.IO.RecyclableMemoryStream" version="3.0.0" targetFramework="net48" />
810
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
911
<package id="ReaLTaiizor" version="3.8.1.1" targetFramework="net48" />
12+
<package id="RtspClientSharp" version="1.3.3" targetFramework="net48" />
1013
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
1114
<package id="System.IO.Compression" version="4.3.0" targetFramework="net48" />
1215
<package id="System.Memory" version="4.5.5" targetFramework="net48" />

ui/main/MainMenu.cs

Lines changed: 50 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
using System.Threading;
88
using System.Threading.Tasks;
99
using System.Windows.Forms;
10-
10+
using AForge.Video;
1111
using FiveMApi.api;
1212
using FlashForgeUI.manager;
1313
using FlashForgeUI.program.util;
1414
using FlashForgeUI.ui.main.manager;
15+
using FlashForgeUI.ui.main.manager.camera;
1516
using FlashForgeUI.ui.main.util;
1617
using FlashForgeUI.webui;
1718
using Microsoft.VisualBasic;
@@ -24,42 +25,41 @@ public partial class MainMenu : Form
2425
// and theme accordingly if we cannot get the scroll to bottom to work
2526
// it does look nicer though.
2627

27-
//internal MJPEGStream mjpegStream;
28+
internal MJPEGStream MjpegStream;
2829

29-
public FiveMClient printerClient;
30+
public FiveMClient PrinterClient;
3031

31-
internal PrinterWebServer webServer;
32+
internal PrinterWebServer WebServer;
3233

33-
internal WebhookHelper webhook;
34+
internal WebhookHelper Webhook;
3435

35-
internal Config config;
36+
internal Config Config;
3637

3738

3839
// Managers
3940
private ConnectionManager _connectionManager;
40-
internal CameraStreamManager StreamManager;
4141
private StatusTimerManager _statusTimerManager;
42+
43+
internal MjpegStreamManager MjpegStreamManager;
4244
internal ButtonManager ButtonManager;
4345

4446
private UiHelper _uiHelper;
4547

4648

47-
public CameraStreamManager GetCameraStreamManager()
49+
public MjpegStreamManager GetCameraStreamManager()
4850
{ // for WebhookHelper (sending preview image to discord)
49-
return StreamManager;
51+
return MjpegStreamManager;
5052
}
5153

5254
internal bool IsConnected;
53-
internal bool WebcamOn;
54-
55+
5556
public MainMenu()
5657
{
5758
InitializeComponent();
5859

5960
// hook form events
6061
Shown += MainMenu_Shown;
61-
//Closing += MainMenu_Closing;
62-
FormClosing += MainMenu_Closing;
62+
FormClosed += MainMenu_Closed;
6363

6464
// hook timer events
6565
timerStatusUpdate.Tick += timerStatusUpdate_Tick;
@@ -70,12 +70,12 @@ public MainMenu()
7070

7171
private void InitWebhook()
7272
{
73-
if (string.IsNullOrEmpty(config.WebhookUrl))
73+
if (string.IsNullOrEmpty(Config.WebhookUrl))
7474
{
7575
MessageBox.Show("Invalid (or missing) webhook url in config.json! Discord sync disabled");
7676
return;
7777
}
78-
webhook = new WebhookHelper(config.WebhookUrl, this);
78+
Webhook = new WebhookHelper(Config.WebhookUrl, this);
7979
}
8080

8181
private void StartTimers()
@@ -84,37 +84,33 @@ private void StartTimers()
8484
timerSyncInfo_Tick(null, null);
8585
timerStatusUpdate.Start();
8686
timerSyncInfo.Start();
87-
if (config.DiscordSync) timerSyncDiscord.Start();
88-
if (printerClient.IsPro || config.CustomCamera && !string.IsNullOrEmpty(config.CustomCameraUrl)) {
89-
StreamManager.Start();
90-
WebcamOn = true;
91-
toggleWebcamButton.Text = "Preview off";
92-
}
87+
if (Config.DiscordSync) timerSyncDiscord.Start();
88+
if (PrinterClient.IsPro || Config.CustomCamera && !string.IsNullOrEmpty(Config.CustomCameraUrl)) ButtonManager.PreviewOn();
9389
}
9490

9591
private void StartWebUi()
9692
{
97-
webServer = new PrinterWebServer(this, config);
98-
webServer.Start();
93+
WebServer = new PrinterWebServer(this, Config);
94+
WebServer.Start();
9995
}
10096

10197
private void CheckFeatures()
10298
{
103-
if (!Compat.Is313OrAbove(printerClient.FirmVer))
99+
if (!Compat.Is313OrAbove(PrinterClient.FirmVer))
104100
{
105101
AppendLog("This printer is running older firmware, some features may not be available, or work as intended. " +
106102
"Please update to the latest firmware when possible for better compatibility");
107103
clearPlatformButton.Visible = false;
108104
}
109105

110-
if (!printerClient.LedControl)
106+
if (!PrinterClient.LedControl)
111107
{
112108
AppendLog("LEDs are not equipped or properly configured on this printer.");
113109
ledOffButton.Visible = false;
114110
ledOnButton.Visible = false;
115111
}
116112

117-
if (printerClient.FiltrationControl) return;
113+
if (PrinterClient.FiltrationControl) return;
118114
AppendLog("Filtration control is not available for this printer.");
119115
filtrationPanel.Visible = false;
120116
setChamberFanButton.Visible = false;
@@ -126,14 +122,14 @@ private void CheckFeatures()
126122
private async void timerSyncDiscord_Tick(object sender, EventArgs e)
127123
{
128124
Debug.Write("Ticking SyncDiscord");
129-
await webhook.SendStatus(printerClient); // todo handle result?
125+
await Webhook.SendStatus(PrinterClient); // todo handle result?
130126
}
131127

132128
private async void timerSyncInfo_Tick(object sender, EventArgs e)
133129
{
134130
Debug.WriteLine("Ticking SyncInfo");
135-
var info = await printerClient.Info.Get();
136-
printerClient.CacheDetails(info);
131+
var info = await PrinterClient.Info.Get();
132+
PrinterClient.CacheDetails(info);
137133
}
138134

139135
private async void timerStatusUpdate_Tick(object sender, EventArgs e)
@@ -146,14 +142,8 @@ internal void AppendLog(string message)
146142
{
147143
Debug.WriteLine($"AppendLog called: {message}");
148144

149-
if (logBox.InvokeRequired)
150-
{
151-
logBox.Invoke(new Action(() => AddLogMessage(message)));
152-
}
153-
else
154-
{
155-
AddLogMessage(message);
156-
}
145+
if (logBox.InvokeRequired) logBox.Invoke(new Action(() => AddLogMessage(message)));
146+
else AddLogMessage(message);
157147
}
158148

159149
private void AddLogMessage(string message)
@@ -174,8 +164,7 @@ private void AddLogMessage(string message)
174164

175165
private async Task<bool> CheckJobReady()
176166
{
177-
var info = await printerClient.Info.Get();
178-
//if (info.DoorOpen) MessageBox.Show("Don't forget to close the printer door!", "Door ajar");
167+
var info = await PrinterClient.Info.Get();
179168
switch (info.Status)
180169
{
181170
case "ready":
@@ -206,7 +195,7 @@ internal async Task UpdateModelPreview(string currentJobFileName)
206195
_lastJobFileName = currentJobFileName;
207196

208197
// Fetch the thumbnail
209-
var thumbnailBytes = await printerClient.Files.GetGCodeThumbnail(currentJobFileName);
198+
var thumbnailBytes = await PrinterClient.Files.GetGCodeThumbnail(currentJobFileName);
210199
if (thumbnailBytes != null && thumbnailBytes.Length > 0)
211200
{
212201
using (var ms = new MemoryStream(thumbnailBytes))
@@ -296,7 +285,7 @@ public dynamic GetPrinterStatus()
296285

297286
return new
298287
{
299-
isPro = printerClient.IsPro,
288+
isPro = PrinterClient.IsPro,
300289
currentJob = currentJobLabel.Text,
301290
eta = etaLabel.Text,
302291
extruderTemp = extruderTempLabel.Text,
@@ -323,20 +312,23 @@ public dynamic GetPrinterStatus()
323312
internal async void MainMenu_Shown(object sender, EventArgs e)
324313
{
325314
// load config
326-
config = new Config().Load();
315+
Config = new Config().Load();
327316

328317
_uiHelper = new UiHelper(this);
329-
if (config.AlwaysOnTop) _uiHelper.SetOnTop();
318+
if (Config.AlwaysOnTop) _uiHelper.SetOnTop();
330319

331320
// init managers
332321
_connectionManager = new ConnectionManager(this);
333-
StreamManager = new CameraStreamManager(this);
322+
334323
_statusTimerManager = new StatusTimerManager(this, _uiHelper);
324+
325+
335326
ButtonManager = new ButtonManager(this);
327+
MjpegStreamManager = new MjpegStreamManager(this);
336328

337329

338330
// only show console window if in debug mode
339-
if (config.DebugMode) Program.AllocConsole();
331+
if (Config.DebugMode) Program.AllocConsole();
340332

341333
IsConnected = await Connect();
342334
}
@@ -346,24 +338,25 @@ internal async Task<bool> Connect()
346338
var connected = await _connectionManager.FindPrinterAndConnect();
347339
if (connected)
348340
{
349-
AppendLog($"Connected to {printerClient.PrinterName} @ {printerClient.IpAddress}");
350-
AppendLog($"Firmware version: {printerClient.FirmwareVersion}");
341+
AppendLog($"Connected to {PrinterClient.PrinterName} @ {PrinterClient.IpAddress}");
342+
AppendLog($"Firmware version: {PrinterClient.FirmwareVersion}");
351343

352344
CheckFeatures();
353345

354-
if (config.DiscordSync) InitWebhook(); // only check/enable the webhook if the user actually enabled it.
346+
if (Config.DiscordSync) InitWebhook(); // only check/enable the webhook if the user actually enabled it.
355347
StartTimers();
356-
if (config.WebUi) StartWebUi();
348+
if (Config.WebUi) StartWebUi();
357349

358350
return true;
359351
}
360352

361353
return false;
362354
}
363355

364-
internal void MainMenu_Closing(object sender, CancelEventArgs cancelEventArgs)
356+
357+
internal void MainMenu_Closed(object sender, FormClosedEventArgs e)
365358
{
366-
Application.Exit();
359+
MjpegStreamManager.Stop();
367360
}
368361

369362
private async void ledOnButton_Click(object sender, EventArgs e)
@@ -407,7 +400,7 @@ private async void homeAxesButton_Click(object sender, EventArgs e)
407400

408401
await CmdWait();
409402
AppendLog("Homing axes");
410-
var homed = await printerClient.Control.HomeAxes();
403+
var homed = await PrinterClient.Control.HomeAxes();
411404
AppendLog(homed ? "Homed." : "Error homing axes.");
412405
CmdRelease();
413406
}
@@ -432,7 +425,7 @@ private async void startLocalJobButton_Click(object sender, EventArgs e)
432425

433426
private void sendCmdButton_Click(object sender, EventArgs e)
434427
{
435-
new SendCommandWindow(printerClient.TcpClient).ShowDialog();
428+
new SendCommandWindow(PrinterClient.TcpClient, this).ShowDialog();
436429
}
437430

438431
private void toggleWebcamButton_Click(object sender, EventArgs e)
@@ -455,7 +448,7 @@ private async void setBedTempButton_Click(object sender, EventArgs e)
455448
else
456449
{
457450
await CmdWait();
458-
if (await printerClient.TempControl.SetBedTemp(temp)) AppendLog($"Bed temp set to {temp}C");
451+
if (await PrinterClient.TempControl.SetBedTemp(temp)) AppendLog($"Bed temp set to {temp}C");
459452
else AppendLog("Unable to set bed temp!!");
460453
CmdRelease();
461454
}
@@ -475,7 +468,7 @@ private async void disableBedHeatButton_Click(object sender, EventArgs e)
475468
}
476469

477470
await CmdWait();
478-
if (!await printerClient.TempControl.CancelBedTemp()) AppendLog("Unable to turn off bed heating!!");
471+
if (!await PrinterClient.TempControl.CancelBedTemp()) AppendLog("Unable to turn off bed heating!!");
479472
else AppendLog("Bed heating disabled.");
480473
CmdRelease();
481474
}
@@ -495,7 +488,7 @@ private async void setExtruderTempButton_Click(object sender, EventArgs e)
495488
else
496489
{
497490
await CmdWait();
498-
if (await printerClient.TempControl.SetExtruderTemp(temp)) AppendLog($"Extruder temp set to {temp}C");
491+
if (await PrinterClient.TempControl.SetExtruderTemp(temp)) AppendLog($"Extruder temp set to {temp}C");
499492
else AppendLog("Unable to set extruder temp!!");
500493
CmdRelease();
501494
}
@@ -515,7 +508,7 @@ private async void disableExtruderHeatButton_Click(object sender, EventArgs e)
515508
}
516509

517510
await CmdWait();
518-
if (!await printerClient.TempControl.CancelExtruderTemp()) AppendLog("Unable to turn off extruder heat!!");
511+
if (!await PrinterClient.TempControl.CancelExtruderTemp()) AppendLog("Unable to turn off extruder heat!!");
519512
else AppendLog("Extruder heating disabled.");
520513
CmdRelease();
521514
}

0 commit comments

Comments
 (0)