2014-04-16 15:11:01 -07:00
/ *
2018-10-18 18:55:54 -07:00
Copyright ( c ) 2018 , Lars Brubaker , John Lewin
2014-04-16 15:11:01 -07:00
All rights reserved .
Redistribution and use in source and binary forms , with or without
2015-04-08 15:20:10 -07:00
modification , are permitted provided that the following conditions are met :
2014-04-16 15:11:01 -07:00
1. Redistributions of source code must retain the above copyright notice , this
2015-04-08 15:20:10 -07:00
list of conditions and the following disclaimer .
2014-04-16 15:11:01 -07:00
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
2015-04-08 15:20:10 -07:00
and / or other materials provided with the distribution .
2014-04-16 15:11:01 -07:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
The views and conclusions contained in the software and documentation are those
2015-04-08 15:20:10 -07:00
of the authors and should not be interpreted as representing official policies ,
2014-04-16 15:11:01 -07:00
either expressed or implied , of the FreeBSD Project .
* /
2017-07-31 17:57:10 -07:00
using System ;
2018-10-18 18:55:54 -07:00
using System.Collections.Generic ;
2017-09-11 10:54:46 -07:00
using System.Linq ;
2017-06-27 18:41:34 -07:00
using MatterHackers.Agg ;
2017-08-20 02:34:39 -07:00
using MatterHackers.Agg.Platform ;
2017-02-03 13:06:08 -08:00
using MatterHackers.Agg.UI ;
2014-04-16 15:11:01 -07:00
using MatterHackers.Localizations ;
2017-06-27 18:41:34 -07:00
using MatterHackers.MatterControl.ConfigurationPage ;
2017-09-11 10:54:46 -07:00
using MatterHackers.MatterControl.CustomWidgets ;
2014-06-11 14:52:58 -07:00
using MatterHackers.MatterControl.PrinterCommunication ;
2015-04-08 15:20:10 -07:00
using MatterHackers.MatterControl.SlicerConfiguration ;
2014-04-16 15:11:01 -07:00
namespace MatterHackers.MatterControl.ActionBar
{
2015-04-08 15:20:10 -07:00
internal class TemperatureWidgetBed : TemperatureWidgetBase
{
2017-01-23 12:38:34 -08:00
private string sliceSettingsNote = "Note: Slice Settings are applied before the print actually starts. Changes while printing will not effect the active print." . Localize ( ) ;
private string waitingForBedToHeatMessage = "The bed is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting bed temperature in SETTINGS -> Filament -> Temperatures.\n\n{1}" . Localize ( ) ;
private string waitingForBedToHeatTitle = "Waiting For Bed To Heat" . Localize ( ) ;
2018-10-18 18:55:54 -07:00
private Dictionary < string , UIField > allUiFields = new Dictionary < string , UIField > ( ) ;
2018-11-16 08:44:56 -08:00
private RunningInterval runningInterval ;
2017-01-23 12:38:34 -08:00
2018-04-12 08:42:10 -07:00
public TemperatureWidgetBed ( PrinterConfig printer , ThemeConfig theme )
: base ( printer , "150.3°" , theme )
2015-04-08 15:20:10 -07:00
{
2018-02-08 15:42:07 -08:00
this . Name = "Bed TemperatureWidget" ;
2017-06-27 18:41:34 -07:00
this . DisplayCurrentTemperature ( ) ;
this . ToolTipText = "Current bed temperature" . Localize ( ) ;
2017-07-11 16:12:08 -07:00
2018-04-12 08:42:10 -07:00
this . ImageWidget . Image = AggContext . StaticData . LoadIcon ( "bed.png" , theme . InvertIcons ) ;
2017-07-31 17:57:10 -07:00
2018-04-12 08:42:10 -07:00
this . PopupContent = this . GetPopupContent ( ApplicationController . Instance . MenuTheme ) ;
2018-04-10 14:42:13 -07:00
2018-11-16 08:44:56 -08:00
// Register listeners
printer . Connection . BedTemperatureRead + = Connection_BedTemperatureRead ;
2015-04-08 15:20:10 -07:00
}
2017-09-15 12:08:00 -07:00
protected override int ActualTemperature = > ( int ) printer . Connection . ActualBedTemperature ;
protected override int TargetTemperature = > ( int ) printer . Connection . TargetBedTemperature ;
2014-04-16 15:11:01 -07:00
2018-10-14 07:33:45 -07:00
private GuiWidget GetPopupContent ( ThemeConfig menuTheme )
2017-01-23 12:38:34 -08:00
{
2017-06-27 18:41:34 -07:00
var widget = new IgnoredPopupWidget ( )
{
Width = 300 ,
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Absolute ,
VAnchor = VAnchor . Fit ,
2018-10-14 07:33:45 -07:00
Padding = new BorderDouble ( 12 , 0 ) ,
2018-11-03 09:50:09 -07:00
BackgroundColor = menuTheme . BackgroundColor
2017-06-27 18:41:34 -07:00
} ;
var container = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Stretch ,
VAnchor = VAnchor . Fit | VAnchor . Top ,
2017-06-27 18:41:34 -07:00
} ;
widget . AddChild ( container ) ;
2017-09-11 10:54:46 -07:00
GuiWidget hotendRow ;
container . AddChild ( hotendRow = new SettingsItem (
2017-06-27 18:41:34 -07:00
"Heated Bed" . Localize ( ) ,
2018-10-14 07:33:45 -07:00
menuTheme ,
2017-06-27 18:41:34 -07:00
new SettingsItem . ToggleSwitchConfig ( )
{
Checked = false ,
ToggleAction = ( itemChecked ) = >
{
2017-09-15 12:08:00 -07:00
var goalTemp = itemChecked ? printer . Settings . GetValue < double > ( SettingsKey . bed_temperature ) : 0 ;
2017-06-27 18:41:34 -07:00
2017-09-11 10:54:46 -07:00
if ( itemChecked )
2017-06-27 18:41:34 -07:00
{
2018-01-08 18:21:30 -08:00
SetTargetTemperature ( goalTemp ) ;
2017-06-27 18:41:34 -07:00
}
else
{
2017-09-11 10:54:46 -07:00
SetTargetTemperature ( 0 ) ;
2017-06-27 18:41:34 -07:00
}
}
} ,
enforceGutter : false ) ) ;
2018-04-05 16:19:14 -07:00
var toggleWidget = hotendRow . Children . Where ( o = > o is ICheckbox ) . FirstOrDefault ( ) ;
toggleWidget . Name = "Toggle Heater" ;
heatToggle = toggleWidget as ICheckbox ;
2017-09-11 10:54:46 -07:00
2018-01-08 18:21:30 -08:00
int tabIndex = 0 ;
var settingsContext = new SettingsContext ( printer , null , NamedSettingsLayers . All ) ;
2017-07-31 17:57:10 -07:00
2018-01-13 18:54:40 -08:00
var settingsData = SettingsOrganizer . Instance . GetSettingsData ( SettingsKey . bed_temperature ) ;
2018-10-18 18:55:54 -07:00
var temperatureRow = SliceSettingsTabView . CreateItemRow ( settingsData , settingsContext , printer , menuTheme , ref tabIndex , allUiFields ) ;
2018-04-10 16:55:01 -07:00
container . AddChild ( temperatureRow ) ;
2018-01-14 10:13:42 -08:00
2018-04-10 16:55:01 -07:00
alwaysEnabled . Add ( hotendRow ) ;
2017-07-31 17:57:10 -07:00
2017-09-11 10:54:46 -07:00
// add in the temp graph
var graph = new DataViewGraph ( )
{
2018-10-18 17:57:45 -07:00
DynamicallyScaleRange = false ,
2017-09-11 10:54:46 -07:00
MinValue = 0 ,
ShowGoal = true ,
2018-10-15 18:25:53 -07:00
GoalColor = menuTheme . PrimaryAccentColor ,
2018-01-08 18:21:30 -08:00
GoalValue = printer . Settings . GetValue < double > ( SettingsKey . bed_temperature ) ,
2017-09-11 10:54:46 -07:00
MaxValue = 150 , // could come from some profile value in the future
Width = widget . Width - 20 ,
Height = 35 , // this works better if it is a common multiple of the Width
Margin = new BorderDouble ( 0 , 5 , 0 , 0 ) ,
} ;
2018-01-08 18:21:30 -08:00
2018-11-16 08:44:56 -08:00
runningInterval = UiThread . SetInterval ( ( ) = >
2017-09-11 10:54:46 -07:00
{
graph . AddData ( this . ActualTemperature ) ;
2018-04-11 17:35:34 -07:00
} , 1 ) ;
2017-09-11 10:54:46 -07:00
2018-04-10 16:55:01 -07:00
var settingsRow = temperatureRow . DescendantsAndSelf < SliceSettingsRow > ( ) . FirstOrDefault ( ) ;
2018-11-15 21:00:18 -08:00
void Printer_SettingChanged ( object s , EventArgs e )
2018-01-08 18:21:30 -08:00
{
if ( e is StringEventArgs stringEvent )
{
2018-10-18 18:55:54 -07:00
string settingsKey = stringEvent . Data ;
if ( this . allUiFields . TryGetValue ( settingsKey , out UIField uifield ) )
2018-01-08 18:21:30 -08:00
{
2018-10-18 18:55:54 -07:00
string currentValue = settingsContext . GetValue ( settingsKey ) ;
if ( uifield . Value ! = currentValue )
{
uifield . SetValue (
currentValue ,
userInitiated : false ) ;
}
}
if ( stringEvent . Data = = SettingsKey . bed_temperature )
{
var temp = printer . Settings . GetValue < double > ( SettingsKey . bed_temperature ) ;
graph . GoalValue = temp ;
2018-10-30 13:23:19 -07:00
// TODO: Why is this only when enabled? How does it get set to
2018-10-18 18:55:54 -07:00
if ( heatToggle . Checked )
{
// TODO: Why is a UI widget who is listening to model events driving this behavior? What when it's not loaded?
SetTargetTemperature ( temp ) ;
}
settingsRow . UpdateStyle ( ) ;
2018-01-08 18:21:30 -08:00
}
2018-11-12 17:20:59 -08:00
}
}
2018-11-15 21:00:18 -08:00
printer . Settings . SettingChanged + = Printer_SettingChanged ;
printer . Disposed + = ( s , e ) = > printer . Settings . SettingChanged - = Printer_SettingChanged ;
2018-01-08 18:21:30 -08:00
2017-09-11 10:54:46 -07:00
container . AddChild ( graph ) ;
2017-06-27 18:41:34 -07:00
return widget ;
2017-01-23 12:38:34 -08:00
}
2017-07-31 17:57:10 -07:00
2017-09-20 13:15:25 -07:00
public override void OnDraw ( Graphics2D graphics2D )
{
if ( heatToggle ! = null )
{
heatToggle . Checked = printer . Connection . TargetBedTemperature ! = 0 ;
}
base . OnDraw ( graphics2D ) ;
}
2018-11-16 08:44:56 -08:00
public override void OnClosed ( EventArgs e )
{
// Unregister listeners
printer . Connection . BedTemperatureRead - = Connection_BedTemperatureRead ;
UiThread . ClearInterval ( runningInterval ) ;
base . OnClosed ( e ) ;
}
2017-09-11 10:54:46 -07:00
protected override void SetTargetTemperature ( double targetTemp )
2017-07-31 17:57:10 -07:00
{
2017-09-11 10:54:46 -07:00
double goalTemp = ( int ) ( targetTemp + . 5 ) ;
2017-09-15 12:08:00 -07:00
if ( printer . Connection . PrinterIsPrinting
& & printer . Connection . DetailedPrintingState = = DetailedPrintingState . HeatingBed
& & goalTemp ! = printer . Connection . TargetBedTemperature )
2017-07-31 17:57:10 -07:00
{
2017-09-15 12:08:00 -07:00
string message = string . Format ( waitingForBedToHeatMessage , printer . Connection . TargetBedTemperature , sliceSettingsNote ) ;
2017-10-18 19:54:06 -07:00
StyledMessageBox . ShowMessageBox ( message , waitingForBedToHeatTitle ) ;
2017-09-11 10:54:46 -07:00
}
else
{
2017-09-15 12:08:00 -07:00
printer . Connection . TargetBedTemperature = ( int ) ( targetTemp + . 5 ) ;
2017-07-31 17:57:10 -07:00
}
}
2018-11-16 08:44:56 -08:00
private void Connection_BedTemperatureRead ( object s , EventArgs e )
{
DisplayCurrentTemperature ( ) ;
}
2015-04-08 15:20:10 -07:00
}
}