160 lines
5.6 KiB
JavaScript
160 lines
5.6 KiB
JavaScript
// Global variable to store the current floor
|
|
let currentFloor = 1;
|
|
|
|
// Fallback data in case API fails
|
|
const fallbackSensors = {
|
|
1: [
|
|
{ id: 1, x: 100, y: 100, floor: 1, location: "Room A", value: "22°C" },
|
|
{ id: 2, x: 200, y: 200, floor: 1, location: "Room B", value: "24°C" },
|
|
],
|
|
2: [
|
|
{ id: 3, x: 150, y: 150, floor: 2, location: "Living Room", value: "23°C" },
|
|
{ id: 4, x: 250, y: 250, floor: 2, location: "Kitchen", value: "21°C" },
|
|
],
|
|
3: [
|
|
{ id: 5, x: 120, y: 120, floor: 3, location: "Hallway", value: "22°C" },
|
|
{ id: 6, x: 220, y: 220, floor: 3, location: "Bathroom", value: "23°C" },
|
|
]
|
|
};
|
|
|
|
// Function to fetch sensors from the API
|
|
async function fetchSensors() {
|
|
try {
|
|
const response = await fetch('/api/sensors');
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
const data = await response.json();
|
|
console.log("Fetched sensors:", data);
|
|
|
|
if (data.length === 0) {
|
|
console.warn("No sensors returned from API, using fallback data");
|
|
return fallbackSensors[currentFloor];
|
|
}
|
|
|
|
return data;
|
|
} catch (error) {
|
|
console.error("Could not fetch sensors:", error);
|
|
console.warn("Using fallback sensor data due to API error");
|
|
return fallbackSensors[currentFloor];
|
|
}
|
|
}
|
|
|
|
// Function to display the map for the corresponding floor
|
|
function showFloor(floor) {
|
|
console.log(`Showing floor ${floor}`);
|
|
currentFloor = floor;
|
|
const map = document.getElementById('map');
|
|
map.src = `images/floor${floor}.png`;
|
|
|
|
// Fetch and display sensors for this floor
|
|
fetchSensors().then(sensors => {
|
|
// Filter sensors for the current floor
|
|
const floorSensors = sensors.filter(sensor => parseInt(sensor.floor) === parseInt(floor));
|
|
console.log(`Sensors for floor ${floor}:`, floorSensors);
|
|
|
|
if (floorSensors.length === 0) {
|
|
console.warn(`No sensors found for floor ${floor}, adding test sensors`);
|
|
// Add test sensors if none found
|
|
addTestSensors();
|
|
} else {
|
|
addSensorsToMap(floorSensors);
|
|
}
|
|
|
|
// Clear the sensor data table
|
|
const table = document.getElementById('sensor-data');
|
|
table.innerHTML = `
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Location</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
`;
|
|
});
|
|
}
|
|
|
|
// Add sensor points to the map
|
|
function addSensorsToMap(floorSensors) {
|
|
// First clear all previous points
|
|
const mapContainer = document.getElementById('map-container');
|
|
const existingPoints = document.querySelectorAll('.sensor');
|
|
existingPoints.forEach(point => point.remove());
|
|
|
|
console.log("Map container:", mapContainer);
|
|
|
|
// Check if we have sensors to display
|
|
if (!floorSensors || floorSensors.length === 0) {
|
|
console.warn("No sensors found for this floor");
|
|
return;
|
|
}
|
|
|
|
// Create new points
|
|
floorSensors.forEach(sensor => {
|
|
console.log(`Creating sensor point at x:${sensor.x}, y:${sensor.y}`);
|
|
const sensorPoint = document.createElement('div');
|
|
sensorPoint.classList.add('sensor');
|
|
sensorPoint.style.position = 'absolute';
|
|
sensorPoint.style.left = `${sensor.x}px`;
|
|
sensorPoint.style.top = `${sensor.y}px`;
|
|
sensorPoint.style.width = '15px';
|
|
sensorPoint.style.height = '15px';
|
|
sensorPoint.style.borderRadius = '50%';
|
|
sensorPoint.style.backgroundColor = 'red';
|
|
sensorPoint.style.border = '2px solid black';
|
|
sensorPoint.style.zIndex = '1000';
|
|
sensorPoint.setAttribute('data-id', sensor.id);
|
|
sensorPoint.addEventListener('click', () => showSensorData(sensor));
|
|
|
|
mapContainer.appendChild(sensorPoint);
|
|
});
|
|
}
|
|
|
|
// Add test sensors if API sensors aren't working
|
|
function addTestSensors() {
|
|
const testSensors = fallbackSensors[currentFloor];
|
|
addSensorsToMap(testSensors);
|
|
}
|
|
|
|
// Display sensor data in the dashboard
|
|
function showSensorData(sensor) {
|
|
const table = document.getElementById('sensor-data');
|
|
|
|
// Clear the table
|
|
table.innerHTML = `
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Location</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
`;
|
|
|
|
// Add a new row with sensor data
|
|
const row = table.insertRow(1);
|
|
row.insertCell(0).textContent = sensor.id;
|
|
row.insertCell(1).textContent = sensor.location;
|
|
row.insertCell(2).textContent = sensor.value;
|
|
}
|
|
|
|
// Initialize the app by showing floor 1 when the page loads
|
|
window.onload = function() {
|
|
console.log("Page loaded, initializing app...");
|
|
showFloor(1);
|
|
|
|
// Add additional test sensor directly to verify positioning
|
|
setTimeout(() => {
|
|
const mapContainer = document.getElementById('map-container');
|
|
const testPoint = document.createElement('div');
|
|
testPoint.style.position = 'absolute';
|
|
testPoint.style.left = '300px';
|
|
testPoint.style.top = '300px';
|
|
testPoint.style.width = '20px';
|
|
testPoint.style.height = '20px';
|
|
testPoint.style.borderRadius = '50%';
|
|
testPoint.style.backgroundColor = 'blue';
|
|
testPoint.style.border = '3px solid yellow';
|
|
testPoint.style.zIndex = '9999';
|
|
|
|
mapContainer.appendChild(testPoint);
|
|
console.log("Test point added to verify positioning");
|
|
}, 3000);
|
|
}; |