Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Add solar elevation calculations for WSPR paylods.
  • Loading branch information
Mark Jessop authored and Mark Jessop committed Jul 16, 2023
commit e3aea2bdcadd16313113730576975e65eb0b09c8
1 change: 1 addition & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations -
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge colour-map.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge format.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge flight_doc.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge suncalc.js >> mobile.js

#compile plot lib and config
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge _jquery.flot.js >> init_plot.js
Expand Down
22 changes: 22 additions & 0 deletions js/format.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,28 @@ function formatData(data) {
}
}

// Payload data post-processing, where we can modify / add data elements if needed.

// Determine if this payload is a WSPR payload
// We determine this through either the modulation field, or comment field.
var wspr_payload = false;
if (data[key][i].hasOwnProperty("modulation")){
if(data[key][i].modulation.includes("WSPR")){
wspr_payload = true;
}
}
if (data[key][i].hasOwnProperty("comment")){
if(data[key][i].comment.includes("WSPR")){
wspr_payload = true;
}
}

// For WSPR payloads, calculate solar elevation.
if(wspr_payload){
dataTempEntry.data['solar_elevation'] = (SunCalc.getPosition(stringToDateUTC(dataTempEntry.gps_time), dataTempEntry.gps_lat, dataTempEntry.gps_lon).altitude/rad).toFixed(1);
}


dataTemp.push(dataTempEntry);
}
}
Expand Down
78 changes: 78 additions & 0 deletions js/suncalc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Sun Position Calculations from https://github.com/mourner/suncalc

// shortcuts for easier to read formulas

var PI = Math.PI,
sin = Math.sin,
cos = Math.cos,
tan = Math.tan,
asin = Math.asin,
atan = Math.atan2,
acos = Math.acos,
rad = PI / 180;
// date/time constants and conversions

var dayMs = 1000 * 60 * 60 * 24,
J1970 = 2440588,
J2000 = 2451545;

function suncalc_toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
function suncalc_fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }
function suncalc_toDays(date) { return suncalc_toJulian(date) - J2000; }


// general calculations for position

var suncalc_e = rad * 23.4397; // obliquity of the Earth

function rightAscension(l, b) { return atan(sin(l) * cos(suncalc_e) - tan(b) * sin(suncalc_e), cos(l)); }
function declination(l, b) { return asin(sin(b) * cos(suncalc_e) + cos(b) * sin(suncalc_e) * sin(l)); }

function suncalc_azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function suncalc_altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }

function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }

// general sun calculations

function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }

function eclipticLongitude(M) {

var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
P = rad * 102.9372; // perihelion of the Earth

return M + C + P + PI;
}

function sunCoords(d) {

var M = solarMeanAnomaly(d),
L = eclipticLongitude(M);

return {
dec: declination(L, 0),
ra: rightAscension(L, 0)
};
}

var SunCalc = {};


// calculates sun position for a given date and latitude/longitude

SunCalc.getPosition = function (date, lat, lng) {

var lw = rad * -lng,
phi = rad * lat,
d = suncalc_toDays(date),

c = sunCoords(d),
H = siderealTime(d, lw) - c.ra;

return {
azimuth: suncalc_azimuth(H, phi, c.dec),
altitude: suncalc_altitude(H, phi, c.dec)
};
};