diff --git a/build.sh b/build.sh index a00a31b..cd5f84c 100755 --- a/build.sh +++ b/build.sh @@ -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 diff --git a/js/format.js b/js/format.js index 547c5b7..b8e2b8f 100644 --- a/js/format.js +++ b/js/format.js @@ -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); } } diff --git a/js/suncalc.js b/js/suncalc.js new file mode 100644 index 0000000..fec2ec3 --- /dev/null +++ b/js/suncalc.js @@ -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) + }; +}; +