import fs from 'node:fs'; import path from 'node:path'; // Aseguramos que el directorio de logs exista en cualquier sistema operativo if (!fs.existsSync('logs')) { fs.mkdirSync('logs', { recursive: true }); } /** * 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("Línea de datos: " + 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.warn('No se ha podido convertir la línea de datos, es posible que se hayan perdido parte de los datos, por lo que esta línea será ignorada'); //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} */ async function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } const fechaHoraActual = new Date(); async function saveDataInFile(data) { fs.writeFile( path.join('logs', `${fechaHoraActual.toISOString().replace(/:/g, '-')}.json`), JSON.stringify(data) + ',\n', { flag: 'a' }, 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, altitudSegunPresion: data.altitudSegunPresion, altitudMetros: data.altitudMetros, velocidadKmph: data.velocidadKmph, numSatelites: data.numSatelites, }, geometry: { type: "Point", coordinates: [data.longitud, data.latitud] } }); geoJSONData.features[0].geometry.coordinates.push([data.longitud, data.latitud]); fs.writeFile( path.join('logs', `${fechaHoraActual.toISOString().replace(/:/g, '-')}.geojson`), JSON.stringify(geoJSONData), { flag: 'w+' }, 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.writeFile( path.join('logs', `${fechaHoraActual.toISOString().replace(/:/g, '-')}.csv`), data + '\n', { flag: 'a' }, 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 }