V0.2.2.0: Work-in progress. Load/Save routines done, ToDo: integrate triggerform into app

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5617 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
gbamber
2017-01-10 05:39:06 +00:00
parent a6ba417169
commit fe93b37050
6 changed files with 268 additions and 151 deletions

View File

@ -52,6 +52,13 @@ const
// Used in Trigger functions
C_HIGH = 0;
C_LOW = 1;
// Sensor recommended levels
REC_PM = 25;
REC_TMP = 23;
REC_HUM = 60;
REC_CO2 = 1300;
REC_VOC = 300;
REC_ALLPOLLU = 50;
type
TDataFetchType = (dfLast, dfStartEnd); // FetchFoobotData
@ -67,6 +74,8 @@ type
AlertType: Integer;
AlertValue: variant;
end;
var
RecommendedLevelsArray:Array[C_PM..C_ALLPOLLU] of Double;
function EncodeStringBase64(const s: string): string;
function FetchAuthenticationKey(aUsername, aUserPassword: string): boolean;
@ -99,7 +108,8 @@ function SaveHighLows: boolean;
function LoadHighLows: boolean;
function SaveTriggers: boolean;
function LoadTriggers: boolean;
function SaveRecommendedLevels:boolean;
function LoadRecommendedLevels:boolean;
var
// Used to fetch server data
HttpClient: TFPHTTPClient;
@ -230,6 +240,68 @@ begin
end;
end;
function SaveRecommendedLevels:boolean;
var
sFoobotName: string;
begin
Result:=FALSE; // assume failure
if FoobotIdentityObject.FoobotIdentityList.Count = 0 then Exit(FALSE);
sFoobotName := FoobotIdentityObject.FoobotIdentityList[TheCurrentFoobot].Name;
if (sFoobotName = '') then
Exit(False);
if not Assigned(HLINI) then
HLINI := TIniFile.Create(ChangeFileExt(GetAppConfigFile(False), '.ini'));
// Make sure the High-Lows are for the current Foobot
if (HLINI.ReadString('Foobot', 'CurrentFoobotName', 'unknown') <> sFoobotName) then
Exit(False);
try
// Save current Foobot recommended levels
with HLINI do
begin
WriteFloat(sFoobotName,'RecPM',RecommendedLevelsArray[C_PM]);
WriteFloat(sFoobotName,'RecTMP',RecommendedLevelsArray[C_TMP]);
WriteFloat(sFoobotName,'RecHUM',RecommendedLevelsArray[C_HUM]);
WriteFloat(sFoobotName,'RecCO2',RecommendedLevelsArray[C_CO2]);
WriteFloat(sFoobotName,'RecVOC',RecommendedLevelsArray[C_VOC]);
WriteFloat(sFoobotName,'RecALLPOLLU',RecommendedLevelsArray[C_ALLPOLLU]);
end;
Result := True;
except
raise Exception.Create('Could not save recommended levels for ' + sFoobotName);
end;
end;
function LoadRecommendedLevels:boolean;
var
sFoobotName: string;
begin
Result:=FALSE; // assume failure
if FoobotIdentityObject.FoobotIdentityList.Count = 0 then Exit(FALSE);
sFoobotName := FoobotIdentityObject.FoobotIdentityList[TheCurrentFoobot].Name;
if (sFoobotName = '') then
Exit(False);
if not Assigned(HLINI) then
HLINI := TIniFile.Create(ChangeFileExt(GetAppConfigFile(False), '.ini'));
// Make sure the High-Lows are for the current Foobot
if (HLINI.ReadString('Foobot', 'CurrentFoobotName', 'unknown') <> sFoobotName) then
Exit(False);
try
// Load current Foobot recommended levels
with HLINI do
begin
RecommendedLevelsArray[C_PM]:=ReadFloat(sFoobotName,'RecPM',REC_PM);
RecommendedLevelsArray[C_TMP]:=ReadFloat(sFoobotName,'RecTMP',REC_TMP);
RecommendedLevelsArray[C_HUM]:=ReadFloat(sFoobotName,'RecHUM',REC_HUM);
RecommendedLevelsArray[C_CO2]:=ReadFloat(sFoobotName,'RecCO2',REC_CO2);
RecommendedLevelsArray[C_VOC]:=ReadFloat(sFoobotName,'RecVOC',REC_VOC);
RecommendedLevelsArray[C_ALLPOLLU]:=ReadFloat(sFoobotName,'RecALLPOLLU',REC_ALLPOLLU);
end;
Result := True;
except
raise Exception.Create('Could not load recommended levels for ' + sFoobotName);
end;
end;
function SaveHighLows: boolean;
// Save values to an INI data file
// To foobotmonitor.ini

View File

@ -3,14 +3,14 @@
<ProjectSession>
<PathDelim Value="\"/>
<Version Value="10"/>
<BuildModes Active="win32"/>
<BuildModes Active="win64"/>
<Units Count="34">
<Unit0>
<Filename Value="foobotmonitor.lpr"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="12"/>
<CursorPos Y="35"/>
<UsageCount Value="127"/>
<UsageCount Value="148"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
@ -19,9 +19,9 @@
<ComponentName Value="mainform"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<TopLine Value="774"/>
<CursorPos X="66" Y="776"/>
<UsageCount Value="127"/>
<TopLine Value="511"/>
<CursorPos X="25" Y="516"/>
<UsageCount Value="148"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
@ -34,7 +34,7 @@
<EditorIndex Value="7"/>
<TopLine Value="33"/>
<CursorPos X="41" Y="45"/>
<UsageCount Value="117"/>
<UsageCount Value="138"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit2>
@ -44,7 +44,7 @@
<EditorIndex Value="1"/>
<TopLine Value="13"/>
<CursorPos X="49" Y="20"/>
<UsageCount Value="109"/>
<UsageCount Value="130"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
@ -54,15 +54,15 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="109"/>
<UsageCount Value="130"/>
</Unit4>
<Unit5>
<Filename Value="..\foobot_utility.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="9"/>
<TopLine Value="129"/>
<CursorPos X="49" Y="212"/>
<UsageCount Value="127"/>
<TopLine Value="241"/>
<CursorPos X="31" Y="243"/>
<UsageCount Value="148"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
@ -72,7 +72,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="109"/>
<UsageCount Value="130"/>
</Unit6>
<Unit7>
<Filename Value="foobot_sensors.pas"/>
@ -80,7 +80,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="299"/>
<CursorPos X="14" Y="321"/>
<UsageCount Value="61"/>
<UsageCount Value="82"/>
</Unit7>
<Unit8>
<Filename Value="usplash.pas"/>
@ -90,7 +90,7 @@
<ResourceBaseClass Value="Form"/>
<EditorIndex Value="3"/>
<CursorPos X="48" Y="37"/>
<UsageCount Value="56"/>
<UsageCount Value="77"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit8>
@ -102,9 +102,9 @@
<ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="2"/>
<TopLine Value="137"/>
<CursorPos X="45" Y="139"/>
<UsageCount Value="47"/>
<TopLine Value="151"/>
<CursorPos X="44" Y="165"/>
<UsageCount Value="68"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit9>
@ -113,7 +113,7 @@
<EditorIndex Value="8"/>
<TopLine Value="43"/>
<CursorPos X="47" Y="13"/>
<UsageCount Value="78"/>
<UsageCount Value="89"/>
<Loaded Value="True"/>
</Unit10>
<Unit11>
@ -121,7 +121,7 @@
<EditorIndex Value="11"/>
<TopLine Value="141"/>
<CursorPos X="31" Y="148"/>
<UsageCount Value="78"/>
<UsageCount Value="89"/>
<Loaded Value="True"/>
</Unit11>
<Unit12>
@ -130,12 +130,12 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="33"/>
<UsageCount Value="31"/>
</Unit12>
<Unit13>
<Filename Value="..\latest_stable\umainform.lfm"/>
<EditorIndex Value="-1"/>
<UsageCount Value="5"/>
<UsageCount Value="3"/>
<DefaultSyntaxHighlighter Value="LFM"/>
</Unit13>
<Unit14>
@ -143,21 +143,21 @@
<EditorIndex Value="-1"/>
<TopLine Value="10"/>
<CursorPos X="57" Y="36"/>
<UsageCount Value="5"/>
<UsageCount Value="3"/>
</Unit14>
<Unit15>
<Filename Value="..\udataform.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="74"/>
<CursorPos Y="96"/>
<UsageCount Value="13"/>
<UsageCount Value="11"/>
</Unit15>
<Unit16>
<Filename Value="..\umainform.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="145"/>
<CursorPos X="81" Y="158"/>
<UsageCount Value="41"/>
<UsageCount Value="39"/>
</Unit16>
<Unit17>
<Filename Value="C:\trunklatest\lazarus\lcl\lclmessageglue.pas"/>
@ -165,26 +165,26 @@
<EditorIndex Value="-1"/>
<TopLine Value="93"/>
<CursorPos Y="114"/>
<UsageCount Value="5"/>
<UsageCount Value="3"/>
</Unit17>
<Unit18>
<Filename Value="..\ulogin.pas"/>
<EditorIndex Value="-1"/>
<CursorPos Y="108"/>
<UsageCount Value="8"/>
<UsageCount Value="6"/>
</Unit18>
<Unit19>
<Filename Value="..\..\..\components\cryptini\latest_stable\ucryptini.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="906"/>
<CursorPos X="8" Y="939"/>
<UsageCount Value="6"/>
<UsageCount Value="4"/>
</Unit19>
<Unit20>
<Filename Value="..\backup\foobot_utility.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="7"/>
<UsageCount Value="5"/>
<UsageCount Value="3"/>
</Unit20>
<Unit21>
<Filename Value="C:\trunklatest\lazarus\ide\lazarus.pp"/>
@ -192,7 +192,7 @@
<EditorIndex Value="5"/>
<TopLine Value="101"/>
<CursorPos Y="154"/>
<UsageCount Value="29"/>
<UsageCount Value="40"/>
<Loaded Value="True"/>
</Unit21>
<Unit22>
@ -200,35 +200,35 @@
<EditorIndex Value="-1"/>
<TopLine Value="11"/>
<CursorPos X="8" Y="33"/>
<UsageCount Value="6"/>
<UsageCount Value="4"/>
</Unit22>
<Unit23>
<Filename Value="D:\Lazarusprojects\healthmonitor\svn\healthanalysis\healthanalysis\umainform.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="540"/>
<CursorPos X="55" Y="593"/>
<UsageCount Value="6"/>
<UsageCount Value="4"/>
</Unit23>
<Unit24>
<Filename Value="C:\trunklatest\fpc\rtl\objpas\sysutils\datih.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="109"/>
<CursorPos X="10" Y="128"/>
<UsageCount Value="5"/>
<UsageCount Value="3"/>
</Unit24>
<Unit25>
<Filename Value="C:\trunklatest\fpc\packages\rtl-objpas\src\inc\dateutil.inc"/>
<EditorIndex Value="10"/>
<TopLine Value="381"/>
<CursorPos X="13" Y="384"/>
<UsageCount Value="47"/>
<UsageCount Value="58"/>
<Loaded Value="True"/>
</Unit25>
<Unit26>
<Filename Value="..\latest_stable\udataform.pas"/>
<EditorIndex Value="6"/>
<TopLine Value="70"/>
<UsageCount Value="47"/>
<UsageCount Value="58"/>
<Loaded Value="True"/>
</Unit26>
<Unit27>
@ -236,20 +236,20 @@
<EditorIndex Value="-1"/>
<TopLine Value="781"/>
<CursorPos X="28" Y="795"/>
<UsageCount Value="20"/>
<UsageCount Value="18"/>
</Unit27>
<Unit28>
<Filename Value="C:\trunklatest\fpc\packages\fcl-base\src\fileinfo.pp"/>
<EditorIndex Value="-1"/>
<TopLine Value="43"/>
<CursorPos X="19" Y="51"/>
<UsageCount Value="9"/>
<UsageCount Value="7"/>
</Unit28>
<Unit29>
<Filename Value="C:\trunklatest\lazarus\components\IndustrialStuff\industrial.pas"/>
<EditorIndex Value="-1"/>
<CursorPos X="18" Y="11"/>
<UsageCount Value="7"/>
<UsageCount Value="5"/>
</Unit29>
<Unit30>
<Filename Value="..\..\..\components\poweredby\latest_stable\upoweredby.pas"/>
@ -257,14 +257,14 @@
<EditorIndex Value="-1"/>
<TopLine Value="190"/>
<CursorPos X="33" Y="205"/>
<UsageCount Value="17"/>
<UsageCount Value="15"/>
</Unit30>
<Unit31>
<Filename Value="C:\trunklatest\lazarus\lcl\include\customform.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="2228"/>
<CursorPos X="14" Y="2239"/>
<UsageCount Value="7"/>
<UsageCount Value="5"/>
</Unit31>
<Unit32>
<Filename Value="C:\trunklatest\lazarus\lcl\graphics.pp"/>
@ -272,7 +272,7 @@
<EditorIndex Value="4"/>
<TopLine Value="1811"/>
<CursorPos X="13" Y="1834"/>
<UsageCount Value="25"/>
<UsageCount Value="36"/>
<Loaded Value="True"/>
</Unit32>
<Unit33>
@ -280,130 +280,130 @@
<EditorIndex Value="-1"/>
<TopLine Value="119"/>
<CursorPos Y="151"/>
<UsageCount Value="9"/>
<UsageCount Value="7"/>
<DefaultSyntaxHighlighter Value="LFM"/>
</Unit33>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="utriggersform.pas"/>
<Caret Line="133" Column="34" TopLine="89"/>
<Caret Line="229" TopLine="178"/>
</Position1>
<Position2>
<Filename Value="utriggersform.pas"/>
<Caret Line="134" Column="34" TopLine="90"/>
<Filename Value="umainform.pas"/>
<Caret Line="362" Column="22" TopLine="349"/>
</Position2>
<Position3>
<Filename Value="utriggersform.pas"/>
<Caret Line="135" Column="34" TopLine="91"/>
<Filename Value="umainform.pas"/>
<Caret Line="539" Column="42" TopLine="524"/>
</Position3>
<Position4>
<Filename Value="utriggersform.pas"/>
<Caret Line="136" Column="34" TopLine="92"/>
<Caret Line="14" Column="5"/>
</Position4>
<Position5>
<Filename Value="utriggersform.pas"/>
<Caret Line="139" Column="34" TopLine="95"/>
<Caret Line="12" Column="15"/>
</Position5>
<Position6>
<Filename Value="utriggersform.pas"/>
<Caret Line="142" Column="34" TopLine="98"/>
<Caret Line="13" Column="26"/>
</Position6>
<Position7>
<Filename Value="utriggersform.pas"/>
<Caret Line="145" Column="34" TopLine="101"/>
<Caret Line="21" Column="18"/>
</Position7>
<Position8>
<Filename Value="utriggersform.pas"/>
<Caret Line="148" Column="34" TopLine="104"/>
<Caret Line="153" Column="20" TopLine="130"/>
</Position8>
<Position9>
<Filename Value="utriggersform.pas"/>
<Caret Line="151" Column="34" TopLine="107"/>
<Caret Line="92" Column="20" TopLine="90"/>
</Position9>
<Position10>
<Filename Value="utriggersform.pas"/>
<Caret Line="18" Column="18" TopLine="11"/>
<Filename Value="umainform.pas"/>
<Caret Line="397" Column="17" TopLine="378"/>
</Position10>
<Position11>
<Filename Value="utriggersform.pas"/>
<Caret Line="124" Column="6" TopLine="83"/>
<Filename Value="umainform.pas"/>
<Caret Line="745" Column="44" TopLine="698"/>
</Position11>
<Position12>
<Filename Value="utriggersform.pas"/>
<Caret Line="101" Column="26" TopLine="74"/>
<Filename Value="umainform.pas"/>
<Caret Line="832" Column="44" TopLine="785"/>
</Position12>
<Position13>
<Filename Value="utriggersform.pas"/>
<Caret Line="192" Column="36" TopLine="165"/>
<Caret Line="138" TopLine="103"/>
</Position13>
<Position14>
<Filename Value="utriggersform.pas"/>
<Caret Line="229" TopLine="178"/>
<Caret Line="137" Column="52" TopLine="110"/>
</Position14>
<Position15>
<Filename Value="umainform.pas"/>
<Caret Line="362" Column="22" TopLine="349"/>
<Filename Value="utriggersform.pas"/>
<Caret Line="123" Column="8" TopLine="105"/>
</Position15>
<Position16>
<Filename Value="umainform.pas"/>
<Caret Line="539" Column="42" TopLine="524"/>
<Caret Line="279" Column="11" TopLine="261"/>
</Position16>
<Position17>
<Filename Value="utriggersform.pas"/>
<Caret Line="14" Column="5"/>
<Caret Line="153" Column="43" TopLine="134"/>
</Position17>
<Position18>
<Filename Value="utriggersform.pas"/>
<Caret Line="12" Column="15"/>
<Filename Value="umainform.pas"/>
<Caret Line="78" Column="9" TopLine="45"/>
</Position18>
<Position19>
<Filename Value="utriggersform.pas"/>
<Caret Line="13" Column="26"/>
<Filename Value="umainform.pas"/>
<Caret Line="417" Column="39" TopLine="370"/>
</Position19>
<Position20>
<Filename Value="utriggersform.pas"/>
<Caret Line="21" Column="18"/>
<Filename Value="umainform.pas"/>
<Caret Line="419" Column="39" TopLine="372"/>
</Position20>
<Position21>
<Filename Value="utriggersform.pas"/>
<Caret Line="153" Column="20" TopLine="130"/>
<Filename Value="umainform.pas"/>
<Caret Line="884" Column="32" TopLine="837"/>
</Position21>
<Position22>
<Filename Value="utriggersform.pas"/>
<Caret Line="92" Column="20" TopLine="90"/>
<Filename Value="umainform.pas"/>
<Caret Line="1062" Column="28" TopLine="1015"/>
</Position22>
<Position23>
<Filename Value="umainform.pas"/>
<Caret Line="397" Column="17" TopLine="378"/>
<Caret Line="77" TopLine="51"/>
</Position23>
<Position24>
<Filename Value="umainform.pas"/>
<Caret Line="745" Column="44" TopLine="698"/>
<Caret Line="3" Column="7"/>
</Position24>
<Position25>
<Filename Value="umainform.pas"/>
<Caret Line="832" Column="44" TopLine="785"/>
<Caret Line="30" Column="20" TopLine="28"/>
</Position25>
<Position26>
<Filename Value="utriggersform.pas"/>
<Caret Line="138" TopLine="103"/>
<Filename Value="umainform.pas"/>
<Caret Line="883" Column="65" TopLine="852"/>
</Position26>
<Position27>
<Filename Value="utriggersform.pas"/>
<Caret Line="137" Column="52" TopLine="110"/>
<Filename Value="umainform.pas"/>
<Caret Line="1080" Column="61" TopLine="1036"/>
</Position27>
<Position28>
<Filename Value="utriggersform.pas"/>
<Caret Line="123" Column="8" TopLine="105"/>
<Filename Value="..\foobot_utility.pas"/>
<Caret Line="277" TopLine="241"/>
</Position28>
<Position29>
<Filename Value="umainform.pas"/>
<Caret Line="279" Column="11" TopLine="261"/>
<Caret Line="476" Column="65" TopLine="457"/>
</Position29>
<Position30>
<Filename Value="utriggersform.pas"/>
<Caret Line="153" Column="43" TopLine="134"/>
<Filename Value="umainform.pas"/>
<Caret Line="448" Column="8" TopLine="445"/>
</Position30>
</JumpHistory>
</ProjectSession>

View File

@ -808,7 +808,7 @@ object mainform: Tmainform
Caption = 'Display...'
object mnu_optionsDisplayGuagesOnly: TMenuItem
AutoCheck = True
Caption = 'Guages only'
Caption = 'Minimal view'
OnClick = mnu_optionsDisplayGuagesOnlyClick
end
object mnu_optionsDisplayYellowLines: TMenuItem

View File

@ -74,13 +74,6 @@ const
MIN_ALLPOLLU = 0;
MAX_ALLPOLLU = 700;
// Sensor recommended levels
REC_PM = 25;
REC_TMP = 23;
REC_HUM = 60;
REC_CO2 = 1300;
REC_VOC = 300;
REC_ALLPOLLU = 50;
type
@ -343,6 +336,7 @@ begin
LoadTriggers; // This can only be done if we have a Foobot Identity
// as each Foobot has its own trigger values
SetMinMaxTriggers; // Adjust if necesarry for preset Guage High/Low limits
LoadRecommendedLevels; // into RecommendedLevelsArray
for iCount := C_PM to C_ALLPOLLU do
SetTrafficLightStats(iCount, C_HIGH);
Show;
@ -414,9 +408,9 @@ begin
Format('< %.1f %s', [double(FooBotTriggerArray[C_LOW, C_PM]),
FoobotDataObject.Units[C_PM]]);
lbl_yellowlightpm.Caption :=
Format('> %.1f %s', [double(REC_PM), FoobotDataObject.Units[C_PM]]);
Format('> %.1f %s', [RecommendedLevelsArray[C_PM], FoobotDataObject.Units[C_PM]]);
lbl_greenlightpm.Caption :=
Format('< %.1f %s', [double(REC_PM), FoobotDataObject.Units[C_PM]]);
Format('< %.1f %s', [RecommendedLevelsArray[C_PM], FoobotDataObject.Units[C_PM]]);
if iSensorNum = C_TMP then
if (HIGHLOW = C_HIGH) then
@ -428,9 +422,9 @@ begin
Format('< %.1f %s', [double(FooBotTriggerArray[C_LOW, C_TMP]),
FoobotDataObject.Units[C_TMP]]);
lbl_yellowlighttmp.Caption :=
Format('> %.1f %s', [double(REC_TMP), FoobotDataObject.Units[C_TMP]]);
Format('> %.1f %s', [RecommendedLevelsArray[C_TMP], FoobotDataObject.Units[C_TMP]]);
lbl_greenlighttmp.Caption :=
Format('< %.1f %s', [double(REC_TMP), FoobotDataObject.Units[C_TMP]]);
Format('< %.1f %s', [RecommendedLevelsArray[C_TMP], FoobotDataObject.Units[C_TMP]]);
if iSensorNum = C_HUM then
if (HIGHLOW = C_HIGH) then
@ -442,9 +436,9 @@ begin
Format('< %.1f %s', [double(FooBotTriggerArray[C_LOW, C_HUM]),
FoobotDataObject.Units[C_HUM]]);
lbl_yellowlighthum.Caption :=
Format('> %.1f %s', [double(REC_HUM), FoobotDataObject.Units[C_HUM]]);
Format('> %.1f %s', [RecommendedLevelsArray[C_HUM], FoobotDataObject.Units[C_HUM]]);
lbl_greenlighthum.Caption :=
Format('< %.1f %s', [double(REC_HUM), FoobotDataObject.Units[C_HUM]]);
Format('< %.1f %s', [RecommendedLevelsArray[C_HUM], FoobotDataObject.Units[C_HUM]]);
if iSensorNum = C_CO2 then
if (HIGHLOW = C_HIGH) then
@ -456,9 +450,9 @@ begin
Format('< %.0f %s', [double(FooBotTriggerArray[C_LOW, C_CO2]),
FoobotDataObject.Units[C_CO2]]);
lbl_yellowlightco2.Caption :=
Format('> %.0f %s', [double(REC_CO2), FoobotDataObject.Units[C_CO2]]);
Format('> %.0f %s', [RecommendedLevelsArray[C_CO2], FoobotDataObject.Units[C_CO2]]);
lbl_greenlightco2.Caption :=
Format('< %.0f %s', [double(REC_CO2), FoobotDataObject.Units[C_CO2]]);
Format('< %.0f %s', [RecommendedLevelsArray[C_CO2], FoobotDataObject.Units[C_CO2]]);
if iSensorNum = C_VOC then
if (HIGHLOW = C_HIGH) then
@ -470,9 +464,9 @@ begin
Format('< %.0f %s', [double(FooBotTriggerArray[C_LOW, C_VOC]),
FoobotDataObject.Units[C_VOC]]);
lbl_yellowlightvoc.Caption :=
Format('> %.0f %s', [double(REC_VOC), FoobotDataObject.Units[C_VOC]]);
Format('> %.0f %s', [RecommendedLevelsArray[C_VOC], FoobotDataObject.Units[C_VOC]]);
lbl_greenlightvoc.Caption :=
Format('< %.0f %s', [double(REC_VOC), FoobotDataObject.Units[C_VOC]]);
Format('< %.0f %s', [RecommendedLevelsArray[C_VOC], FoobotDataObject.Units[C_VOC]]);
if iSensorNum = C_ALLPOLLU then
if (HIGHLOW = C_HIGH) then
@ -484,9 +478,9 @@ begin
Format('< %.1f %s', [double(FooBotTriggerArray[C_LOW, C_ALLPOLLU]),
FoobotDataObject.Units[C_ALLPOLLU]]);
lbl_yellowlightallpollu.Caption :=
Format('> %.1f %s', [double(REC_ALLPOLLU), FoobotDataObject.Units[C_ALLPOLLU]]);
Format('> %.1f %s', [RecommendedLevelsArray[C_ALLPOLLU], FoobotDataObject.Units[C_ALLPOLLU]]);
lbl_greenlightallpollu.Caption :=
Format('< %.1f %s', [double(REC_ALLPOLLU), FoobotDataObject.Units[C_ALLPOLLU]]);
Format('< %.1f %s', [RecommendedLevelsArray[C_ALLPOLLU], FoobotDataObject.Units[C_ALLPOLLU]]);
end;
procedure Tmainform.PopulateFoobotMenu;
@ -519,6 +513,7 @@ begin
SaveConfig; // to .cfg file
if UseTriggers then
SaveTriggers; // To .ini file
SaveRecommendedLevels;
CloseAction := caFree;
end;
@ -881,12 +876,12 @@ procedure Tmainform.SetYellowRecommendedLevels;
begin
if bDisplayYellowLines = True then
begin
as_pm.ValueYellow := REC_PM;
as_tmp.ValueYellow := REC_TMP;
as_hum.ValueYellow := REC_HUM;
as_co2.ValueYellow := REC_CO2;
as_voc.ValueYellow := REC_VOC;
as_allpollu.ValueYellow := REC_ALLPOLLU;
as_pm.ValueYellow := RecommendedLevelsArray[C_PM];
as_tmp.ValueYellow := RecommendedLevelsArray[C_TMP];
as_hum.ValueYellow := RecommendedLevelsArray[C_HUM];
as_co2.ValueYellow := RecommendedLevelsArray[C_CO2];
as_voc.ValueYellow := RecommendedLevelsArray[C_VOC];
as_allpollu.ValueYellow := RecommendedLevelsArray[C_ALLPOLLU];
end
else
begin
@ -1059,32 +1054,32 @@ end;
procedure Tmainform.UpdateHealth;
begin
if (as_pm.Value >= REC_PM) then
if (as_pm.Value >= RecommendedLevelsArray[C_PM]) then
sls_pm.State := slYELLOW
else
sls_pm.State := slGREEN;
if (as_tmp.Value >= REC_TMP) then
if (as_tmp.Value >= RecommendedLevelsArray[C_TMP]) then
sls_tmp.State := slYELLOW
else
sls_tmp.State := slGREEN;
if (as_hum.Value >= REC_HUM) then
if (as_hum.Value >= RecommendedLevelsArray[C_HUM]) then
sls_hum.State := slYELLOW
else
sls_hum.State := slGREEN;
if (as_co2.Value >= REC_CO2) then
if (as_co2.Value >= RecommendedLevelsArray[C_CO2]) then
sls_co2.State := slYELLOW
else
sls_co2.State := slGREEN;
if (as_voc.Value >= REC_VOC) then
if (as_voc.Value >= RecommendedLevelsArray[C_VOC]) then
sls_voc.State := slYELLOW
else
sls_voc.State := slGREEN;
if (as_allpollu.Value >= REC_ALLPOLLU) then
if (as_allpollu.Value >= RecommendedLevelsArray[C_ALLPOLLU]) then
sls_allpollu.State := slYELLOW
else
sls_allpollu.State := slGREEN;

View File

@ -1,7 +1,7 @@
object triggersform: Ttriggersform
Left = 478
Left = 808
Height = 565
Top = 162
Top = 146
Width = 794
ActiveControl = edt_newrec_pm
BorderIcons = [biSystemMenu]
@ -114,7 +114,7 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 0
Text = '0.00'
@ -125,7 +125,7 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 1
Text = '0.00'
@ -136,7 +136,7 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 2
Text = '0.00'
@ -251,7 +251,7 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 0
Text = '0.00'
@ -262,7 +262,7 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 1
Text = '0.00'
@ -273,7 +273,7 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 2
Text = '0.00'
@ -388,10 +388,10 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 0
Text = '0.00'
Text = '0'
end
object edt_newhightrigger_voc: TEdit
Left = 504
@ -399,10 +399,10 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 1
Text = '0.00'
Text = '0'
end
object edt_newlowtrigger_voc: TEdit
Left = 504
@ -410,10 +410,10 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 2
Text = '0.00'
Text = '0'
end
object lbl_currentrecunits_voc: TLabel
Left = 584
@ -525,10 +525,10 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 0
Text = '0.00'
Text = '0'
end
object edt_newhightrigger_co2: TEdit
Left = 504
@ -536,10 +536,10 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 1
Text = '0.00'
Text = '0'
end
object edt_newlowtrigger_co2: TEdit
Left = 504
@ -547,10 +547,10 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressInteger
ParentFont = False
TabOrder = 2
Text = '0.00'
Text = '0'
end
object lbl_currentrecunits_co2: TLabel
Left = 584
@ -662,7 +662,7 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 0
Text = '0.00'
@ -673,7 +673,7 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 1
Text = '0.00'
@ -684,7 +684,7 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 2
Text = '0.00'
@ -799,7 +799,7 @@ object triggersform: Ttriggersform
Top = 0
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 0
Text = '0.00'
@ -810,7 +810,7 @@ object triggersform: Ttriggersform
Top = 20
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 1
Text = '0.00'
@ -821,7 +821,7 @@ object triggersform: Ttriggersform
Top = 40
Width = 72
BorderStyle = bsNone
OnKeyPress = OnlyNumericKeyPress
OnKeyPress = OnlyNumericKeyPressFloat
ParentFont = False
TabOrder = 2
Text = '0.00'

View File

@ -98,11 +98,14 @@ type
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure OnlyNumericKeyPress(Sender: TObject; var Key: char);
procedure OnlyNumericKeyPressFloat(Sender: TObject; var Key: char);
procedure OnlyNumericKeyPressInteger(Sender: TObject; var Key: char);
private
ErrorList:TStrings;
procedure DisplayCurrentValues;
procedure SetUpUnits;
function AssignAndSaveTriggers:boolean;
function AssignAndSaveRecommendedLevels:boolean;
public
end;
@ -137,9 +140,15 @@ end;
procedure Ttriggersform.cmd_OKClick(Sender: TObject);
begin
// VerifyEveryThing then Save to inifiles;
AssignAndSaveTriggers;
end;
procedure Ttriggersform.OnlyNumericKeyPress(Sender: TObject; var Key: char);
procedure Ttriggersform.OnlyNumericKeyPressInteger(Sender: TObject; var Key: char);
begin
if not (Key in ['0'..'9', #8, #9]) then Key := #0;
end;
procedure Ttriggersform.OnlyNumericKeyPressFloat(Sender: TObject; var Key: char);
begin
if not (Key in ['0'..'9', '.', #8, #9]) then Key := #0;
end;
@ -152,6 +161,47 @@ begin
ErrorList.Clear;
Update;
end;
function Ttriggersform.AssignAndSaveTriggers:boolean;
begin
Result:=FALSE;
TRY
FooBotTriggerArray[C_HIGH, C_PM]:=StrToFloat(edt_newhightrigger_pm.text);
FooBotTriggerArray[C_LOW, C_PM]:=StrToFloat(edt_newlowtrigger_pm.text);
FooBotTriggerArray[C_HIGH, C_TMP]:=StrToFloat(edt_newhightrigger_tmp.text);
FooBotTriggerArray[C_LOW, C_TMP]:=StrToFloat(edt_newlowtrigger_tmp.text);
FooBotTriggerArray[C_HIGH, C_HUM]:=StrToFloat(edt_newhightrigger_hum.text);
FooBotTriggerArray[C_LOW, C_HUM]:=StrToFloat(edt_newlowtrigger_hum.text);
FooBotTriggerArray[C_HIGH, C_CO2]:=StrToInt(edt_newhightrigger_co2.text);
FooBotTriggerArray[C_LOW, C_CO2]:=StrToInt(edt_newlowtrigger_co2.text);
FooBotTriggerArray[C_HIGH, C_VOC]:=StrToInt(edt_newhightrigger_voc.text);
FooBotTriggerArray[C_LOW, C_VOC]:=StrToInt(edt_newlowtrigger_voc.text);
FooBotTriggerArray[C_HIGH, C_ALLPOLLU]:=StrToFloat(edt_newhightrigger_allpollu.text);
FooBotTriggerArray[C_LOW, C_ALLPOLLU]:=StrToFloat(edt_newlowtrigger_allpollu.text);
except
raise exception.create('Error in AssignAndSaveTriggers');
Exit;
end;
If NOT SaveTriggers then ErrorList.Add('Unable to save new triggers to disk')
else Result:=TRUE;
end;
function Ttriggersform.AssignAndSaveRecommendedLevels:boolean;
begin
Result:=FALSE;
TRY
RecommendedLevelsArray[C_PM]:=StrToFloat(edt_newrec_pm.Text);
RecommendedLevelsArray[C_TMP]:=StrToFloat(edt_newrec_tmp.Text);
RecommendedLevelsArray[C_HUM]:=StrToFloat(edt_newrec_hum.Text);
RecommendedLevelsArray[C_CO2]:=StrToFloat(edt_newrec_co2.Text);
RecommendedLevelsArray[C_VOC]:=StrToFloat(edt_newrec_voc.Text);
RecommendedLevelsArray[C_ALLPOLLU]:=StrToFloat(edt_newrec_allpollu.Text);
except
raise exception.create('Error in AssignAndSaveRecommendedLevels');
Exit;
end;
If NOT SaveRecommendedLevels then ErrorList.Add('Unable to save new recommended levels to disk')
else Result:=TRUE;
end;
procedure Ttriggersform.DisplayCurrentValues;
begin
@ -188,10 +238,10 @@ begin
Format('Current high trigger: %.1f %s',
[double(FooBotTriggerArray[C_HIGH, C_HUM]), FoobotDataObject.Units[C_HUM]]);
lbl_currenthightrigger_co2.Caption :=
Format('Current high trigger: %.1f %s',
Format('Current high trigger: %.0f %s',
[double(FooBotTriggerArray[C_HIGH, C_CO2]), FoobotDataObject.Units[C_CO2]]);
lbl_currenthightrigger_voc.Caption :=
Format('Current high trigger: %.1f %s',
Format('Current high trigger: %.0f %s',
[double(FooBotTriggerArray[C_HIGH, C_VOC]), FoobotDataObject.Units[C_VOC]]);
lbl_currenthightrigger_allpollu.Caption :=
Format('Current high trigger: %.1f %s',
@ -208,10 +258,10 @@ begin
Format('Current low trigger: %.1f %s',
[double(FooBotTriggerArray[C_LOW, C_HUM]), FoobotDataObject.Units[C_HUM]]);
lbl_currentlowtrigger_co2.Caption :=
Format('Current low trigger: %.1f %s',
Format('Current low trigger: %.0f %s',
[double(FooBotTriggerArray[C_LOW, C_CO2]), FoobotDataObject.Units[C_CO2]]);
lbl_currentlowtrigger_voc.Caption :=
Format('Current low trigger: %.1f %s',
Format('Current low trigger: %.0f %s',
[double(FooBotTriggerArray[C_LOW, C_VOC]), FoobotDataObject.Units[C_VOC]]);
lbl_currentlowtrigger_allpollu.Caption :=
Format('Current low trigger: %.1f %s',