feat: add AMSC runway observations
This commit is contained in:
@@ -958,6 +958,12 @@ export interface AmosData {
|
||||
runway_obs?: {
|
||||
runway_pairs?: Array<[string, string]> | null;
|
||||
temperatures?: Array<[number | null, number | null]> | null;
|
||||
point_temperatures?: Array<{
|
||||
runway?: string | null;
|
||||
tdz_temp?: number | null;
|
||||
mid_temp?: number | null;
|
||||
end_temp?: number | null;
|
||||
}> | null;
|
||||
pressures_hpa?: Array<number | null> | null;
|
||||
wind_directions?: Array<[number, number, number] | null> | null;
|
||||
wind_speeds?: Array<[number, number, number] | null> | null;
|
||||
@@ -967,6 +973,7 @@ export interface AmosData {
|
||||
observation_source?: string | null;
|
||||
observation_source_zh?: string | null;
|
||||
observation_time?: string | null;
|
||||
observation_time_local?: string | null;
|
||||
}
|
||||
|
||||
export interface HistoryPoint {
|
||||
|
||||
@@ -31,6 +31,15 @@ const DEFAULT_SOURCE_PROFILE: SourceProfile = {
|
||||
};
|
||||
|
||||
const SOURCE_PROFILES: Record<string, SourceProfile> = {
|
||||
amsc_awos: {
|
||||
code: "amsc_awos",
|
||||
label: "AMSC AWOS",
|
||||
nativeUpdateIntervalSec: 60,
|
||||
freshWindowSec: 180,
|
||||
expectedGraceSec: 180,
|
||||
staleAfterSec: 900,
|
||||
pollIntervalSec: 60,
|
||||
},
|
||||
amos: {
|
||||
code: "amos",
|
||||
label: "AMOS",
|
||||
@@ -111,6 +120,7 @@ const SOURCE_PROFILES: Record<string, SourceProfile> = {
|
||||
function canonicalSourceCode(value?: string | null) {
|
||||
const code = normalizeObservationSourceCode(value || "metar");
|
||||
if (!code) return "metar";
|
||||
if (code.includes("amsc")) return "amsc_awos";
|
||||
if (code.includes("amos")) return "amos";
|
||||
if (code.includes("jma")) return "jma";
|
||||
if (code.includes("fmi")) return "fmi";
|
||||
@@ -207,12 +217,16 @@ export function getObservationFreshness(detail?: CityDetail | null) {
|
||||
const hasAmosRunway =
|
||||
(detail.amos?.runway_obs?.temperatures?.length || 0) > 0 ||
|
||||
(detail.amos?.runway_temps?.length || 0) > 0;
|
||||
if (hasAmosRunway || detail.amos?.source === "amos") {
|
||||
if (hasAmosRunway || detail.amos?.source === "amos" || detail.amos?.source === "amsc_awos") {
|
||||
return buildObservationFreshness({
|
||||
observedAt: detail.amos?.observation_time || null,
|
||||
observedAtLocal: detail.airport_current?.obs_time || detail.current?.obs_time || null,
|
||||
sourceCode: "amos",
|
||||
sourceLabel: detail.amos?.source_label || "AMOS",
|
||||
observedAtLocal:
|
||||
detail.amos?.observation_time_local ||
|
||||
detail.airport_current?.obs_time ||
|
||||
detail.current?.obs_time ||
|
||||
null,
|
||||
sourceCode: detail.amos?.source || "amos",
|
||||
sourceLabel: detail.amos?.source_label || (detail.amos?.source === "amsc_awos" ? "AMSC AWOS" : "AMOS"),
|
||||
});
|
||||
}
|
||||
const currentSource = canonicalSourceCode(
|
||||
|
||||
Reference in New Issue
Block a user