@mytec: iter1.6.1 ready for testing

This commit is contained in:
2026-01-31 13:19:36 +02:00
parent c97355f444
commit 375a78f5b9
11 changed files with 1055 additions and 4 deletions

View File

@@ -803,6 +803,118 @@ export default function App() {
</select>
</div>
)}
{/* Atmospheric absorption toggle */}
<label
className={`flex items-center gap-2 cursor-pointer text-sm ${
isCalculating
? 'text-gray-400 dark:text-dark-muted cursor-not-allowed'
: 'text-gray-700 dark:text-dark-text'
}`}
>
<input
type="checkbox"
checked={settings.use_atmospheric ?? false}
onChange={(e) => {
useCoverageStore.getState().updateSettings({
use_atmospheric: e.target.checked,
preset: undefined,
});
}}
disabled={isCalculating}
className="w-3.5 h-3.5 rounded border-gray-300 dark:border-dark-border accent-blue-600"
/>
Atmospheric Absorption
</label>
{settings.use_atmospheric && (
<div className="mt-1.5 pl-5 space-y-1.5">
<div>
<label className="text-xs text-gray-500 dark:text-dark-muted">Temperature</label>
<select
value={settings.temperature_c ?? 15}
onChange={(e) =>
useCoverageStore.getState().updateSettings({
temperature_c: Number(e.target.value),
})
}
disabled={isCalculating}
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
>
<option value={-10}>-10°C (cold)</option>
<option value={0}>0°C (freezing)</option>
<option value={15}>15°C (mild)</option>
<option value={25}>25°C (warm)</option>
<option value={35}>35°C (hot)</option>
</select>
</div>
<div>
<label className="text-xs text-gray-500 dark:text-dark-muted">Humidity</label>
<select
value={settings.humidity_percent ?? 50}
onChange={(e) =>
useCoverageStore.getState().updateSettings({
humidity_percent: Number(e.target.value),
})
}
disabled={isCalculating}
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
>
<option value={20}>20% (dry)</option>
<option value={50}>50% (normal)</option>
<option value={70}>70% (humid)</option>
<option value={90}>90% (very humid)</option>
</select>
</div>
</div>
)}
{/* Weather / Rain section */}
<div className="mt-2 pt-2 border-t border-gray-200 dark:border-dark-border">
<p className="text-[10px] font-semibold text-gray-400 dark:text-dark-muted uppercase mb-1.5">Environment</p>
<div>
<label className="text-xs text-gray-500 dark:text-dark-muted">Rain Conditions</label>
<select
value={settings.rain_rate ?? 0}
onChange={(e) =>
useCoverageStore.getState().updateSettings({
rain_rate: Number(e.target.value),
preset: undefined,
})
}
disabled={isCalculating}
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
>
<option value={0}>No Rain</option>
<option value={2.5}>Drizzle</option>
<option value={5}>Light Rain</option>
<option value={12.5}>Moderate Rain</option>
<option value={25}>Heavy Rain</option>
<option value={50}>Very Heavy Rain</option>
</select>
</div>
</div>
{/* Indoor penetration section */}
<div className="mt-1.5">
<label className="text-xs text-gray-500 dark:text-dark-muted">Indoor Coverage</label>
<select
value={settings.indoor_loss_type ?? 'none'}
onChange={(e) =>
useCoverageStore.getState().updateSettings({
indoor_loss_type: e.target.value,
preset: undefined,
})
}
disabled={isCalculating}
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
>
<option value="none">Outdoor Only</option>
<option value="light">Light Building (wood, glass)</option>
<option value="medium">Medium Building (brick)</option>
<option value="heavy">Heavy Building (concrete)</option>
<option value="vehicle">Inside Vehicle</option>
</select>
</div>
</div>
)}
</div>

View File

@@ -31,6 +31,11 @@ export interface ApiCoverageSettings {
use_water_reflection?: boolean;
use_vegetation?: boolean;
season?: 'summer' | 'winter' | 'spring' | 'autumn';
rain_rate?: number;
indoor_loss_type?: string;
use_atmospheric?: boolean;
temperature_c?: number;
humidity_percent?: number;
}
export interface CoverageRequest {
@@ -50,6 +55,9 @@ export interface ApiCoveragePoint {
building_loss: number;
reflection_gain: number;
vegetation_loss: number;
rain_loss: number;
indoor_loss: number;
atmospheric_loss: number;
}
export interface ApiCoverageStats {
@@ -61,6 +69,9 @@ export interface ApiCoverageStats {
points_with_terrain_loss: number;
points_with_reflection_gain: number;
points_with_vegetation_loss: number;
points_with_rain_loss: number;
points_with_indoor_loss: number;
points_with_atmospheric_loss: number;
}
export interface CoverageResponse {

View File

@@ -44,6 +44,14 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
use_water_reflection: false,
use_vegetation: false,
season: 'summer',
// Weather
rain_rate: 0,
// Indoor
indoor_loss_type: 'none',
// Atmospheric
use_atmospheric: false,
temperature_c: 15,
humidity_percent: 50,
},
heatmapVisible: true,
error: null,
@@ -107,6 +115,11 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
use_water_reflection: settings.use_water_reflection,
use_vegetation: settings.use_vegetation,
season: settings.season,
rain_rate: settings.rain_rate,
indoor_loss_type: settings.indoor_loss_type,
use_atmospheric: settings.use_atmospheric,
temperature_c: settings.temperature_c,
humidity_percent: settings.humidity_percent,
},
});
@@ -122,6 +135,9 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
building_loss: p.building_loss,
reflection_gain: p.reflection_gain,
vegetation_loss: p.vegetation_loss,
rain_loss: p.rain_loss,
indoor_loss: p.indoor_loss,
atmospheric_loss: p.atmospheric_loss,
})),
calculationTime: response.computation_time,
totalPoints: response.count,

View File

@@ -10,6 +10,9 @@ export interface CoveragePoint {
building_loss?: number; // dB building penetration loss
reflection_gain?: number; // dB reflection signal gain
vegetation_loss?: number; // dB vegetation attenuation
rain_loss?: number; // dB rain attenuation
indoor_loss?: number; // dB indoor penetration loss
atmospheric_loss?: number; // dB atmospheric absorption
}
export interface CoverageResult {
@@ -31,6 +34,9 @@ export interface CoverageApiStats {
points_with_terrain_loss: number;
points_with_reflection_gain: number;
points_with_vegetation_loss: number;
points_with_rain_loss: number;
points_with_indoor_loss: number;
points_with_atmospheric_loss: number;
}
export interface CoverageSettings {
@@ -50,6 +56,14 @@ export interface CoverageSettings {
use_water_reflection?: boolean;
use_vegetation?: boolean;
season?: 'summer' | 'winter' | 'spring' | 'autumn';
// Weather
rain_rate?: number; // mm/h (0=none, 5=light, 25=heavy)
// Indoor
indoor_loss_type?: string; // none, light, medium, heavy, vehicle
// Atmospheric
use_atmospheric?: boolean;
temperature_c?: number;
humidity_percent?: number;
}
export interface GridPoint {