parent
b2202cf5ad
commit
a607571eed
|
|
@ -0,0 +1,148 @@
|
|||
// Set the API endpoint and parameters
|
||||
const nominatimApi = 'https://nominatim.openstreetmap.org';
|
||||
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=de&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();
|
||||
Loading…
Reference in New Issue