Drone Monitor

- 14 mins
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define MAX_ERRORS 10

// Define structures to store drone data
typedef struct {
    float altitude;
    float speed;
    float temperature;
    bool gpsSignal;
} SensorData;

typedef struct {
    bool isFlying;
    bool isHovering;
    bool obstacleDetected;
} FlightStatus;

typedef struct {
    int batteryPercentage;
    bool chargingStatus;
    float consumptionRate;
} BatteryStatus;

typedef struct {
    int errorCode;
    char description[50];
} ErrorLog;

// Global error list
ErrorLog errorList[MAX_ERRORS];
int errorCount = 0;

// Function prototypes
void updateSensorData(SensorData *sensor);
void updateFlightStatus(FlightStatus *flight);
void updateBatteryStatus(BatteryStatus *battery);
void logError(int code, const char *desc);
void displayDroneStatus(SensorData sensor, FlightStatus flight, BatteryStatus battery);
void saveDataToFile(SensorData sensor, FlightStatus flight, BatteryStatus battery);

int main() {
    SensorData sensor = {0.0, 0.0, 25.0, true};
    FlightStatus flight = {false, false, false};
    BatteryStatus battery = {100, false, 0.5};

    // Simulate drone operation
    for (int i = 0; i < 5; i++) {
        printf("\n--- Iteration %d ---\n", i + 1);

        updateSensorData(&sensor);
        updateFlightStatus(&flight);
        updateBatteryStatus(&battery);
        displayDroneStatus(sensor, flight, battery);
        saveDataToFile(sensor, flight, battery);

        // Simulate an error
        if (i == 2) {
            logError(1, "GPS signal lost");
        }

        printf("-----------------------------\n");
    }

    return 0;
}

// Function to update sensor data
void updateSensorData(SensorData *sensor) {
    sensor->altitude = (float)(rand() % 1000);
    sensor->speed = (float)(rand() % 100);
    sensor->temperature = 20.0 + (rand() % 15);
    sensor->gpsSignal = (rand() % 5) > 0;
}

// Function to update flight status
void updateFlightStatus(FlightStatus *flight) {
    flight->isFlying = (rand() % 2) > 0;
    flight->isHovering = (rand() % 2) > 0;
    flight->obstacleDetected = (rand() % 10) < 2;
}

// Function to update battery status
void updateBatteryStatus(BatteryStatus *battery) {
    battery->batteryPercentage -= (rand() % 5);
    battery->consumptionRate = (battery->batteryPercentage < 50) ? 0.7 : 0.5;
    battery->chargingStatus = (battery->batteryPercentage < 20);
}

// Function to log errors dynamically
void logError(int code, const char *desc) {
    if (errorCount < MAX_ERRORS) {
        errorList[errorCount].errorCode = code;
        snprintf(errorList[errorCount].description, sizeof(errorList[errorCount].description), "%s", desc);
        errorCount++;
        printf("ERROR LOGGED: %s\n", desc);
    }
}

// Function to display drone status
void displayDroneStatus(SensorData sensor, FlightStatus flight, BatteryStatus battery) {
    printf("Sensor Data: Altitude: %.2f m, Speed: %.2f km/h, Temperature: %.2f°C, GPS Signal: %s\n",
           sensor.altitude, sensor.speed, sensor.temperature, sensor.gpsSignal ? "Strong" : "Weak");
    printf("Flight Status: Flying: %s, Hovering: %s, Obstacle Detected: %s\n",
           flight.isFlying ? "Yes" : "No", flight.isHovering ? "Yes" : "No",
           flight.obstacleDetected ? "Yes" : "No");
    printf("Battery Status: %d%%, Charging: %s, Consumption Rate: %.2f\n", battery.batteryPercentage,
           battery.chargingStatus ? "Yes" : "No", battery.consumptionRate);
}

// Function to log sensor data to a file
void saveDataToFile(SensorData sensor, FlightStatus flight, BatteryStatus battery) {
    FILE *file = fopen("drone_log.txt", "a");
    if (file != NULL) {
        fprintf(file, "Altitude: %.2f m, Speed: %.2f km/h, Temperature: %.2f°C, GPS Signal: %s\n",
                sensor.altitude, sensor.speed, sensor.temperature, sensor.gpsSignal ? "Strong" : "Weak");
        fprintf(file, "Flight Status: Flying: %s, Hovering: %s, Obstacle Detected: %s\n",
                flight.isFlying ? "Yes" : "No", flight.isHovering ? "Yes" : "No",
                flight.obstacleDetected ? "Yes" : "No");
        fprintf(file, "Battery Status: %d%%, Charging: %s, Consumption Rate: %.2f\n\n", battery.batteryPercentage,
                battery.chargingStatus ? "Yes" : "No", battery.consumptionRate);
        fclose(file);
    }
}

The code provides a basic drone operation monitoring system.

Understanding the Code

At its core, this program simulates drone operations by tracking sensor data, flight status, battery levels, and errors. It runs through multiple iterations, updating drone data and logging it for analysis.

1. Header Files and Constants

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAX_ERRORS 10

2. Structs: Organizing Data

Each struct represents a different aspect of the drone’s functionality.

typedef struct {
    float altitude;
    float speed;
    float temperature;
    bool gpsSignal;
} SensorData;

This struct stores sensor readings, such as altitude, speed, temperature, and GPS signal status.

typedef struct {
    bool isFlying;
    bool isHovering;
    bool obstacleDetected;
} FlightStatus;

This struct keeps track of the flight mode, whether the drone is flying, hovering, or encountering obstacles.

typedef struct {
    int batteryPercentage;
    bool chargingStatus;
    float consumptionRate;
} BatteryStatus;

The battery struct monitors charge levels and calculates power consumption rates.

typedef struct {
    int errorCode;
    char description[50];
} ErrorLog;

This struct logs errors, storing an error code and description.

3. Global Error List

ErrorLog errorList[MAX_ERRORS];
int errorCount = 0;

4. Function Prototypes

These lines declare functions that will be defined later. They ensure that the compiler knows about all functions before they are used.

void updateSensorData(SensorData *sensor);
void updateFlightStatus(FlightStatus *flight);
void updateBatteryStatus(BatteryStatus *battery);
void logError(int code, const char *desc);
void displayDroneStatus(SensorData sensor, FlightStatus flight, BatteryStatus battery);
void saveDataToFile(SensorData sensor, FlightStatus flight, BatteryStatus battery);

5. Main Function: The Heart of the Program

int main() {
    SensorData sensor = {0.0, 0.0, 25.0, true};
    FlightStatus flight = {false, false, false};
    BatteryStatus battery = {100, false, 0.5};
for (int i = 0; i < 5; i++) {
    printf("\n--- Iteration %d ---\n", i + 1);

6. Updating Sensor, Flight, and Battery Data

Each function updates relevant data using random values to mimic real-world changes.

void updateSensorData(SensorData *sensor) {
    sensor->altitude = (float)(rand() % 1000);
    sensor->speed = (float)(rand() % 100);
    sensor->temperature = 20.0 + (rand() % 15);
    sensor->gpsSignal = (rand() % 5) > 0;
}

Similar logic is applied to flight status:

void updateFlightStatus(FlightStatus *flight) {
    flight->isFlying = (rand() % 2) > 0;
    flight->isHovering = (rand() % 2) > 0;
    flight->obstacleDetected = (rand() % 10) < 2;
}

Battery behavior follows a similar pattern:

void updateBatteryStatus(BatteryStatus *battery) {
    battery->batteryPercentage -= (rand() % 5);
    battery->consumptionRate = (battery->batteryPercentage < 50) ? 0.7 : 0.5;
    battery->chargingStatus = (battery->batteryPercentage < 20);
}

7. Error Logging

Errors occur in real drones, so the code tracks them.

void logError(int code, const char *desc) {
    if (errorCount < MAX_ERRORS) {
        errorList[errorCount].errorCode = code;
        snprintf(errorList[errorCount].description, sizeof(errorList[errorCount].description), "%s", desc);
        errorCount++;
        printf("ERROR LOGGED: %s\n", desc);
    }
}

8. Displaying Drone Status

This function prints updated drone data after each iteration.

void displayDroneStatus(SensorData sensor, FlightStatus flight, BatteryStatus battery) {
    printf("Sensor Data: Altitude: %.2f m, Speed: %.2f km/h, Temperature: %.2f°C, GPS Signal: %s\n",
           sensor.altitude, sensor.speed, sensor.temperature, sensor.gpsSignal ? "Strong" : "Weak");
}

Each data point is displayed with precision formatting.

9. Logging Data to a File

void saveDataToFile(SensorData sensor, FlightStatus flight, BatteryStatus battery) {
    FILE *file = fopen("drone_log.txt", "a");
    if (file != NULL) {
        fprintf(file, "Altitude: %.2f m, Speed: %.2f km/h, Temperature: %.2f°C\n",
                sensor.altitude, sensor.speed, sensor.temperature);
        fclose(file);
    }
}

Summary

This program mimics real-world drone behavior, allowing monitoring of flight and battery status while logging errors. It demonstrates modular programming, structured data handling, and error management.