83 lines
5.1 KiB
JavaScript
83 lines
5.1 KiB
JavaScript
// Application Detail Model - stores parsed GPS and application data from SatLoc logs
|
|
const mongoose = require('mongoose'),
|
|
Schema = mongoose.Schema;
|
|
|
|
const schema = new Schema({
|
|
appId: { type: Schema.Types.ObjectId, ref: 'Application', required: false }, // TODO: to be removed later
|
|
fileId: { type: Schema.Types.ObjectId, ref: 'AppFile', required: true },
|
|
|
|
/* Stored in Unix timestamp in seconds since epoch
|
|
AG-NAV: Use Date from the AgNav file name and GPS Time in seconds of day from recorded data n*t or shape files
|
|
SatLoc: converted from SatLoc local time using GMT offset in the GMT Offset field of System Setup (100) record in the log file
|
|
*/
|
|
gpsTime: { type: Number, default: 0 },
|
|
lat: { type: Number, required: true }, // Latitude in decimal degrees
|
|
lon: { type: Number, required: true }, // Longitude in decimal degrees
|
|
tslu: { type: Number, default: 0 }, // Time since last update in seconds for GPS differential correction
|
|
llnum: { type: Number, default: 0 }, // Lock/Spray line number
|
|
xTrack: { type: Number, default: 0 }, // Cross track error in meters
|
|
grSpeed: { type: Number, default: 0 }, // Ground speed in m/s
|
|
alt: { type: Number, default: 0 }, // Altitude (above sea level) in meters
|
|
timeAdv: { type: Number, default: 0 }, // In secs to compensate GPS & system lag
|
|
utmX: { type: Number, default: 0 }, // X in meter, UTM coordinates
|
|
utmY: { type: Number, default: 0 }, // Y in meter, UTM coordinates
|
|
swath: { type: Number, default: 0 }, // Swath width in meters
|
|
noAC: { type: Number, default: 0 }, // Aircraft Number in a fleet mission. Not use
|
|
sprayStat: { type: Number, alias: 'spray', default: 0 }, // 0 = Spray off, 1 = Spray on, 2 = Spray on (alt flag), 3 = Spray segment START marker (anchors prevUTM_X/Y for next distance/area calc; not actual application data)
|
|
head: { type: Number, default: 0 }, // GPS Heading in degrees
|
|
stdHdop: { type: Number, default: 0 }, // Standard HDOP
|
|
satsIn: { type: Number, default: 0 }, // Satellites in view & AC position
|
|
lminApp: { type: Number, default: 0 }, // Litre/minute Applied Rate
|
|
lminReq: { type: Number, default: 0 }, // Litre/minute Required Rate
|
|
lhaReq: { type: Number, default: 0 }, // Litre/ha or Kg/ha Required Rate
|
|
sens: { type: Number, default: 0 }, // Flow sensor or Flow controller type. i.e.: 107 is AgFlow
|
|
calcodeFreq: { type: Number, default: 0 }, // Calibration code for spray offset
|
|
// fmId: { type: Number, default: 0 },
|
|
sprayHeight: { type: Number, default: 0 }, // Flight Master (FM), Spray height in meters
|
|
windSpd: { type: Number, default: 0 }, // Wind speed in m/s
|
|
windDir: { type: Number, default: 0 }, // Wind direction in degrees
|
|
temp: { type: Number, default: 0 }, // Temperature in Celsius
|
|
humid: { type: Number, default: 0 }, // Humidity in percentage
|
|
driftX: { type: Number, default: 0 }, // FM, Drift offset in X direction (meters)
|
|
driftY: { type: Number, default: 0 }, // FM, Drift offset in Y direction (meters)
|
|
depositX: { type: Number, default: 0 }, // FM, Deposit offset in X direction (meters)
|
|
depositY: { type: Number, default: 0 }, // FM, Deposit offset in Y direction (meters)
|
|
|
|
// Data from RPM 3rd-byte-header 06 records
|
|
applicRate: { type: Number, default: 0 },
|
|
rpm: { type: [Number] }, // For RPM values from Granular FC (FBFB-06 RPM record)
|
|
psi: { type: Number, default: 0 }, // Booms pressure (psi) when using a pressure sensor
|
|
gpsAlt: { type: Number, default: 0 },
|
|
radarAlt: { type: Number, default: 0 },
|
|
raserAlt: { type: Number, default: 0 },
|
|
weight: { type: Number, default: 0 }, // Kg
|
|
|
|
// Sept 2025, added after reviewing & matching SatLoc log data
|
|
valvePos: { type: Number, default: 0 }, // Valve position (in percentage ?)
|
|
satCount: { type: Number, default: 0 }, // Number of satellites tracked
|
|
baroPsi: { type: Number, default: 0 }, // Barometric pressure (psi) in kPa
|
|
tachTime: { type: Number, default: 0 }, // Engine current hours, Tachometer
|
|
tachTotalTime: { type: Number, default: 0 }, // Engine total hours, Tachometer
|
|
gmtOffset: { type: Number, default: 0 }, // GMT Offset in minutes
|
|
|
|
windOffsetDir: { type: Number, default: 0 }, // AgDisp Wind offset direction in degrees
|
|
appWindOffset: { type: Number, default: 0 }, // AgDisp Applied offset in meters
|
|
gdop: { type: Number, default: 0 } // GDOP value from GPS status
|
|
|
|
// Note: createdDate removed - use _id.getTimestamp() for creation time
|
|
// Saves 8GB+ storage on billion+ documents and eliminates redundant index (14+GB on billion+ documents)
|
|
});
|
|
|
|
// Optimized indexes for billion+ document scale
|
|
// Primary index - covers 95% of queries: find by fileId, fileId $in operations
|
|
schema.index({ fileId: 1 }, { background: true });
|
|
|
|
// Note: Removed createdDate index since time-based queries use _id ranges
|
|
// Use createObjectIdFromDate() for time-based filtering by _id
|
|
|
|
// Note:
|
|
// The fileId index alone covers most queries efficiently
|
|
// For time-based queries, use _id ranges with ObjectId.createFromTime()
|
|
|
|
module.exports = mongoose.model('Application_Detail', schema);
|