@mytec: iter1.6.1 ready for testing
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user