158 lines
4.3 KiB
JavaScript
158 lines
4.3 KiB
JavaScript
// Set the API endpoint and parameters
|
|
const nominatimApi = 'https://nominatim.openstreetmap.org';
|
|
const locale = require('locale');
|
|
let lang = locale.name;
|
|
|
|
if (lang.toLowerCase() === 'system') {
|
|
lang = 'en';
|
|
} else {
|
|
lang = lang.substring(0, 2);
|
|
}
|
|
|
|
const params = {
|
|
format: 'json',
|
|
addressdetails: 1,
|
|
zoom: 18,
|
|
extratags: 1
|
|
};
|
|
|
|
// Function to break a string into lines
|
|
function breakStringIntoLines(str, maxWidth) {
|
|
const words = str.split(' ');
|
|
const lines = [];
|
|
let currentLine = '';
|
|
for (const word of words) {
|
|
if (currentLine.length + word.length + 1 > maxWidth) {
|
|
lines.push(currentLine);
|
|
currentLine = word;
|
|
} else {
|
|
if (currentLine!== '') {
|
|
currentLine +=' ';
|
|
}
|
|
currentLine += word;
|
|
}
|
|
}
|
|
lines.push(currentLine);
|
|
return lines;
|
|
}
|
|
|
|
// Function to clear the screen and display a message
|
|
function showMessage(address, error, dir) {
|
|
g.clear();
|
|
g.reset();
|
|
g.setFontVector(16);
|
|
const addressLines = breakStringIntoLines(address, 20);
|
|
let y = 20;
|
|
for (const line of addressLines) {
|
|
g.drawString(line, 10, y);
|
|
y += 20;
|
|
}
|
|
if (error) {
|
|
y += 10;
|
|
const errorLines = breakStringIntoLines(error, 20);
|
|
for (const line of errorLines) {
|
|
g.drawString(line, 10, y);
|
|
y += 20;
|
|
}
|
|
}
|
|
g.drawString(`Direction: ${dir}`, 10, 150);
|
|
g.flip();
|
|
}
|
|
|
|
// Function to get the compass direction
|
|
function getCompassDirection() {
|
|
const compass = Bangle.getCompass();
|
|
if (compass && compass.heading) {
|
|
const direction = Math.floor(compass.heading);
|
|
const directions = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'];
|
|
const index = Math.floor(((direction % 360) + 22.5) / 45) % 8;
|
|
if (index >= 0 && index < directions.length) {
|
|
return directions[index];
|
|
} else {
|
|
return 'Invalid index';
|
|
}
|
|
} else {
|
|
return 'No compass data';
|
|
}
|
|
}
|
|
|
|
// Variable to store the current address and error
|
|
let currentAddress = 'Getting address...';
|
|
let currentError = '';
|
|
let lastUpdateTime = 0;
|
|
|
|
// Function to get the current location
|
|
function getCurrentLocation() {
|
|
Bangle.setGPSPower(1);
|
|
Bangle.setCompassPower(1);
|
|
Bangle.on('GPS', (gps) => {
|
|
if (gps.fix) {
|
|
const now = Date.now();
|
|
if (now - lastUpdateTime < 30000) return;
|
|
lastUpdateTime = now;
|
|
getStreetAndHouseNumber(gps.lat, gps.lon);
|
|
} else {
|
|
currentAddress = 'No GPS signal';
|
|
currentError = `Sats: ${gps.satellites}`;
|
|
showMessage(currentAddress, currentError, getCompassDirection());
|
|
}
|
|
});
|
|
}
|
|
|
|
// Function to get the street and house number
|
|
function getStreetAndHouseNumber(lat, lon) {
|
|
const url = `${nominatimApi}/reverse`;
|
|
const paramsStr = Object.keys(params).map(key => `${key}=${encodeURIComponent(params[key])}`).join('&');
|
|
const fullUrl = `${url}?${paramsStr}&lat=${lat}&lon=${lon}&accept-language=${lang}&format=json`;
|
|
|
|
Bangle.http(fullUrl).then(data => {
|
|
try {
|
|
const jsonData = JSON.parse(data.resp);
|
|
if (jsonData && jsonData.address) {
|
|
let street = jsonData.address.road;
|
|
if (street.includes('Straße')) {
|
|
street = street.replace('Straße', 'Str.');
|
|
} else if (street.includes('Street')) {
|
|
street = street.replace('Street', 'St.');
|
|
}
|
|
const houseNumber = jsonData.address.house_number;
|
|
const newAddress = `${street} ${houseNumber}`;
|
|
if (newAddress!== currentAddress) {
|
|
currentAddress = newAddress;
|
|
currentError = '';
|
|
}
|
|
} else {
|
|
const newAddress = 'No address';
|
|
if (newAddress!== currentAddress) {
|
|
currentAddress = newAddress;
|
|
currentError = '';
|
|
}
|
|
}
|
|
} catch (err) {
|
|
const newError = `Error: ${err}`;
|
|
if (newError!== currentError) {
|
|
currentError = newError;
|
|
}
|
|
}
|
|
showMessage(currentAddress, currentError, getCompassDirection());
|
|
}).catch(err => {
|
|
const newError = `Error: ${err}`;
|
|
if (newError!== currentError) {
|
|
currentError = newError;
|
|
}
|
|
showMessage(currentAddress, currentError, getCompassDirection());
|
|
});
|
|
}
|
|
|
|
// Main function
|
|
function main() {
|
|
showMessage('Getting address...', '', getCompassDirection());
|
|
getCurrentLocation();
|
|
setInterval(() => {
|
|
showMessage(currentAddress, currentError, getCompassDirection());
|
|
}, 1000);
|
|
}
|
|
|
|
// Call the main function
|
|
main();
|