Files
CanSat/libs/utils.js

127 lines
3.9 KiB
JavaScript

import fs from 'node:fs';
/**
* Convierte una línea de datos en un objeto
* @param {string} line Línea de datos para convertir a objeto
* @returns {object} Objeto con los datos convertidos
*/
function dataLineToObject(line) {
//Separamos nuestra línea en diferentes trozos usando como separador el ';'
const lineArray = line.split(";");
console.log(line);
saveDataInCSVFile(line);
//Devolvemos un objeto con sus propiedades convertidas
//Usamos el trim() para eliminar los espacios delante y detrás de los valores
//Usamos el parseFloat para convertir esos valores a decimales, ya que son cadenas de texto
//Usamos el parseInt para convertir esos valores a enteros, ya que son cadenas de texto
try {
return {
paquetes: parseInt(lineArray[0].trim()),
temperatura: parseFloat(lineArray[1].trim()),
presion: parseFloat(lineArray[2].trim()),
altitudSegunPresion: parseFloat(lineArray[3].trim()),
nombreEstacion: lineArray[4].trim(),
latitud: parseFloat(lineArray[5].trim()),
longitud: parseFloat(lineArray[6].trim()),
altitudMetros: parseFloat(lineArray[7].trim()),
velocidadKmph: parseFloat(lineArray[8].trim()),
direccionNorte: parseFloat(lineArray[9].trim()),
numSatelites: parseInt(lineArray[10].trim()),
datetimeGPS: new Date(lineArray[11].trim().replace("Date/Time: ", "")),
datetime: new Date().toISOString() // Obtenemos la fecha/hora actual
};
} catch (error) {
console.error('Error al convertir los datos:', error);
return null;
}
}
/**
* Espera un cierto tiempo, esto sirve para crear temporizadores
* @param {number} ms Milisegundos que hay que esperar
* @returns {Promise<void>}
*/
async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
const fechaHoraActual = new Date();
async function saveDataInFile(data) {
fs.appendFile(`logs/${fechaHoraActual.toISOString().replace(/:/g, '-')}.json`, JSON.stringify(data) + ',\n', err => {
if (err) {
console.error(err);
} else {
//console.log('Datos guardados correctamente');
}
});
saveDataInGeoJSONFile(data);
}
var geoJSONData = {
type: "FeatureCollection",
features: [
{
"type": "Feature",
"properties": {},
"geometry": {
"coordinates": [],
"type": "LineString"
}
}
]
}
async function saveDataInGeoJSONFile(data) {
if (data.latitud === null || data.longitud === null) {
return;
}
geoJSONData.features.push({
type: "Feature",
properties: {
numPaquete: data.paquetes,
temperatura: data.temperatura
},
geometry: {
type: "Point",
coordinates: [data.longitud, data.latitud]
}
});
geoJSONData.features[0].geometry.coordinates.push([data.longitud, data.latitud]);
fs.writeFile(`logs/${fechaHoraActual.toISOString().replace(/:/g, '-')}.geojson`, JSON.stringify(geoJSONData), err => {
if (err) {
console.error(err);
} else {
// file written successfully
}
});
}
saveDataInCSVFile("Nº Paquete; Temperatura; Presión; Altitud según presión; Latitud; Longitud; Altitud (m); Velocidad (Km/h); Dirección/Norte; Número de Satelites; Fecha/Hora GPS; Fecha/Hora del Sistema");
async function saveDataInCSVFile(data) {
fs.appendFile(`logs/${fechaHoraActual.toISOString().replace(/:/g, '-')}.csv`, data + '\n', err => {
if (err) {
console.error(err);
} else {
//console.log('Datos guardados correctamente');
}
});
}
// Exportamos las funciones para poder usarlas en otras partes del programa
export {
dataLineToObject,
sleep,
saveDataInFile
}