Bug fix for onRuntimeInitialized

This commit is contained in:
Ali Camarata 2023-04-04 17:54:56 -04:00
parent cc8b0299b2
commit 4dc4b3004c
2 changed files with 52 additions and 44 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "solar-spa", "name": "solar-spa",
"version": "1.2.1", "version": "1.2.2",
"description": "NREL Solar Position Algorithm (SPA) in WebAssembly", "description": "NREL Solar Position Algorithm (SPA) in WebAssembly",
"main": "solar-spa.js", "main": "solar-spa.js",
"types": "index.d.ts", "types": "index.d.ts",

View file

@ -1,6 +1,11 @@
// solar-spa.js
const spaModule = require('./spa.js'); const spaModule = require('./spa.js');
let isRuntimeInitialized = false;
spaModule.onRuntimeInitialized = function () {
isRuntimeInitialized = true;
};
module.exports = function spa( module.exports = function spa(
date, date,
latitude, latitude,
@ -10,53 +15,56 @@ module.exports = function spa(
pressure = 1013.25, pressure = 1013.25,
refraction = 0.5667 refraction = 0.5667
) { ) {
return new Promise((resolve) => { return new Promise((resolve, reject) => {
spaModule.onRuntimeInitialized = function () { if (!isRuntimeInitialized) {
const spa_calculate = spaModule.cwrap( reject(new Error('Emscripten runtime is not initialized.'));
'spa_calculate_wrapper', return;
'number', }
[
'number', 'number', 'number', 'number', 'number',
'number', 'number', 'number', 'number', 'number',
'number', 'number', 'number', 'number', 'number'
]
);
const spa_free_result = spaModule.cwrap( const spa_calculate = spaModule.cwrap(
'spa_free_result', 'spa_calculate_wrapper',
null, 'number',
['number'] [
); 'number', 'number', 'number', 'number', 'number',
'number', 'number', 'number', 'number', 'number',
'number', 'number', 'number', 'number', 'number'
]
);
const year = date.getFullYear(); const spa_free_result = spaModule.cwrap(
const month = date.getMonth() + 1; 'spa_free_result',
const day = date.getDate(); null,
const hour = date.getHours(); ['number']
const minute = date.getMinutes(); );
const second = date.getSeconds();
const timezone = -date.getTimezoneOffset() / 60;
const slope = 0;
const azm_rotation = 0;
const resultPtr = spa_calculate( const year = date.getFullYear();
year, month, day, hour, minute, second, timezone, const month = date.getMonth() + 1;
latitude, longitude, elevation, pressure, temperature, const day = date.getDate();
slope, azm_rotation, refraction const hour = date.getHours();
); const minute = date.getMinutes();
const second = date.getSeconds();
const timezone = -date.getTimezoneOffset() / 60;
const slope = 0;
const azm_rotation = 0;
const result = { const resultPtr = spa_calculate(
zenith: spaModule.getValue(resultPtr, 'double'), year, month, day, hour, minute, second, timezone,
azimuth: spaModule.getValue(resultPtr + 8, 'double'), latitude, longitude, elevation, pressure, temperature,
incidence: spaModule.getValue(resultPtr + 16, 'double'), slope, azm_rotation, refraction
sunrise: spaModule.getValue(resultPtr + 24, 'double'), );
sunset: spaModule.getValue(resultPtr + 32, 'double'),
solar_noon: spaModule.getValue(resultPtr + 40, 'double'),
sun_transit_alt: spaModule.getValue(resultPtr + 48, 'double'),
};
spa_free_result(resultPtr); const result = {
zenith: spaModule.getValue(resultPtr, 'double'),
resolve(result); azimuth: spaModule.getValue(resultPtr + 8, 'double'),
incidence: spaModule.getValue(resultPtr + 16, 'double'),
sunrise: spaModule.getValue(resultPtr + 24, 'double'),
sunset: spaModule.getValue(resultPtr + 32, 'double'),
solar_noon: spaModule.getValue(resultPtr + 40, 'double'),
sun_transit_alt: spaModule.getValue(resultPtr + 48, 'double'),
}; };
spa_free_result(resultPtr);
resolve(result);
}); });
}; };