257 lines
7.4 KiB
C
257 lines
7.4 KiB
C
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
/*---------------------------------------------------------------*/
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MIN_SPEED (27)
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MAX_SPEED (30)
|
|
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MIN_POWER (150)
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MAX_POWER (200)
|
|
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MIN_HEART_RATE (130)
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MAX_HEART_RATE (140)
|
|
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MIN_CADENCE (88)
|
|
#define BIKE_COMPUTER_SIMULATOR_VALUE_MAX_CADENCE (98)
|
|
|
|
#define BIKE_STORE_MAX_NUMBER_MEASUREMENTS (32)
|
|
|
|
typedef enum {
|
|
BIKE_SPEED,
|
|
BIKE_HEART_RATE,
|
|
BIKE_CADENCE,
|
|
BIKE_POWER
|
|
} bike_data_type;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t speed;
|
|
uint16_t heart_rate;
|
|
uint16_t cadence;
|
|
uint16_t power;
|
|
} bike_store_measurement;
|
|
|
|
bike_store_measurement bike_store_array[BIKE_STORE_MAX_NUMBER_MEASUREMENTS] = {
|
|
{ 0, },
|
|
};
|
|
uint16_t bike_store_number_of_measurements_present = 0;
|
|
|
|
/*---------------------------------------------------------------*/
|
|
uint16_t
|
|
bike_computer_simulator_get_random_value(uint16_t min_range, uint16_t max_range)
|
|
{
|
|
uint16_t range = (max_range - min_range);
|
|
|
|
uint16_t random_value = min_range + (rand() % range);
|
|
|
|
return random_value;
|
|
}
|
|
|
|
uint16_t bike_measure_speed_in_kmh()
|
|
{
|
|
return bike_computer_simulator_get_random_value(
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MIN_SPEED,
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MAX_SPEED);
|
|
}
|
|
|
|
uint16_t bike_measure_power_in_watt()
|
|
{
|
|
return bike_computer_simulator_get_random_value(
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MIN_POWER,
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MAX_POWER);
|
|
}
|
|
|
|
uint16_t bike_measure_cadence_in_rpm()
|
|
{
|
|
return bike_computer_simulator_get_random_value(
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MIN_CADENCE,
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MAX_CADENCE);
|
|
}
|
|
|
|
uint16_t bike_measure_heart_rate_in_bpm()
|
|
{
|
|
return bike_computer_simulator_get_random_value(
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MIN_HEART_RATE,
|
|
BIKE_COMPUTER_SIMULATOR_VALUE_MAX_HEART_RATE);
|
|
}
|
|
|
|
/*---------------------------------------------------------------*/
|
|
uint16_t bike_store_get_maximum_bike_store_size()
|
|
{
|
|
return BIKE_STORE_MAX_NUMBER_MEASUREMENTS;
|
|
}
|
|
|
|
void bike_store_add_measurement(bike_store_measurement value)
|
|
{
|
|
if (bike_store_number_of_measurements_present >=
|
|
bike_store_get_maximum_bike_store_size())
|
|
{
|
|
bike_store_number_of_measurements_present = 0;
|
|
}
|
|
|
|
bike_store_array[bike_store_number_of_measurements_present] = value;
|
|
bike_store_number_of_measurements_present++;
|
|
}
|
|
|
|
uint16_t bike_store_get_number_of_measurements_present()
|
|
{
|
|
return bike_store_number_of_measurements_present;
|
|
}
|
|
|
|
bike_store_measurement bike_store_get_measurement(uint16_t index_position)
|
|
{
|
|
bike_store_measurement value = bike_store_array[index_position];
|
|
|
|
return value;
|
|
}
|
|
|
|
/*---------------------------------------------------------------*/
|
|
uint16_t bike_math_get_value_for_data_type(
|
|
bike_store_measurement measurement, bike_data_type data_type)
|
|
{
|
|
uint16_t value = 0;
|
|
|
|
if (data_type == BIKE_CADENCE)
|
|
{
|
|
value = measurement.cadence;
|
|
}
|
|
else if (data_type == BIKE_SPEED)
|
|
{
|
|
value = measurement.speed;
|
|
}
|
|
else if (data_type == BIKE_HEART_RATE)
|
|
{
|
|
value = measurement.heart_rate;
|
|
}
|
|
else if (data_type == BIKE_POWER)
|
|
{
|
|
value = measurement.power;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
uint16_t bike_math_calculate_min_value(bike_data_type data_type)
|
|
{
|
|
uint16_t number_of_measurements =
|
|
bike_store_get_number_of_measurements_present();
|
|
|
|
uint16_t min_value = UINT16_MAX;
|
|
|
|
for (uint16_t index_position = 0; index_position < number_of_measurements;
|
|
index_position++)
|
|
{
|
|
bike_store_measurement measurement =
|
|
bike_store_get_measurement(index_position);
|
|
uint16_t value =
|
|
bike_math_get_value_for_data_type(measurement, data_type);
|
|
if (value < min_value)
|
|
{
|
|
min_value = value;
|
|
}
|
|
}
|
|
|
|
return min_value;
|
|
}
|
|
|
|
uint16_t bike_math_calculate_max_value(bike_data_type data_type)
|
|
{
|
|
uint16_t number_of_measurements =
|
|
bike_store_get_number_of_measurements_present();
|
|
|
|
uint16_t max_value = 0;
|
|
|
|
for (uint16_t index_position = 0; index_position < number_of_measurements;
|
|
index_position++)
|
|
{
|
|
bike_store_measurement measurement =
|
|
bike_store_get_measurement(index_position);
|
|
uint16_t value =
|
|
bike_math_get_value_for_data_type(measurement, data_type);
|
|
if (value > max_value)
|
|
{
|
|
max_value = value;
|
|
}
|
|
}
|
|
|
|
return max_value;
|
|
}
|
|
|
|
uint16_t bike_math_calculate_average_value(bike_data_type data_type)
|
|
{
|
|
uint16_t number_of_measurements =
|
|
bike_store_get_number_of_measurements_present();
|
|
|
|
if (number_of_measurements == 0)
|
|
return 0;
|
|
|
|
uint16_t average = 0;
|
|
uint32_t sum = 0;
|
|
|
|
for (uint16_t index_position = 0; index_position < number_of_measurements;
|
|
index_position++)
|
|
{
|
|
bike_store_measurement measurement =
|
|
bike_store_get_measurement(index_position);
|
|
uint16_t value =
|
|
bike_math_get_value_for_data_type(measurement, data_type);
|
|
sum += value;
|
|
}
|
|
|
|
average = sum / number_of_measurements;
|
|
|
|
return average;
|
|
}
|
|
|
|
/*---------------------------------------------------------------*/
|
|
int main(int argc, char* argv[])
|
|
{
|
|
bike_store_measurement measurement;
|
|
uint16_t min = 0, max = 0, average = 0;
|
|
bike_data_type data_type;
|
|
|
|
while (true)
|
|
{
|
|
measurement.speed = bike_measure_speed_in_kmh();
|
|
measurement.cadence = bike_measure_cadence_in_rpm();
|
|
measurement.heart_rate = bike_measure_heart_rate_in_bpm();
|
|
measurement.power = bike_measure_power_in_watt();
|
|
|
|
bike_store_add_measurement(measurement);
|
|
|
|
data_type = BIKE_SPEED;
|
|
min = bike_math_calculate_min_value(data_type);
|
|
max = bike_math_calculate_max_value(data_type);
|
|
average = bike_math_calculate_average_value(data_type);
|
|
printf("SPEED:\t\t%d, average = %d, min = %d, max = %d [km/h]\n",
|
|
measurement.speed, average, min, max);
|
|
|
|
data_type = BIKE_CADENCE;
|
|
min = bike_math_calculate_min_value(data_type);
|
|
max = bike_math_calculate_max_value(data_type);
|
|
average = bike_math_calculate_average_value(data_type);
|
|
printf("CADENCE:\t%d, average = %d, min = %d, max = %d [rpm]\n",
|
|
measurement.cadence, average, min, max);
|
|
|
|
data_type = BIKE_HEART_RATE;
|
|
min = bike_math_calculate_min_value(data_type);
|
|
max = bike_math_calculate_max_value(data_type);
|
|
average = bike_math_calculate_average_value(data_type);
|
|
printf("HEART-RATE:\t%d, average = %d, min = %d, max = %d [hrm]\n",
|
|
measurement.heart_rate, average, min, max);
|
|
|
|
data_type = BIKE_POWER;
|
|
min = bike_math_calculate_min_value(data_type);
|
|
max = bike_math_calculate_max_value(data_type);
|
|
average = bike_math_calculate_average_value(data_type);
|
|
printf("POWER:\t\t%d, average = %d, min = %d, max = %d [watt]\n",
|
|
measurement.power, average, min, max);
|
|
printf("\n");
|
|
|
|
sleep(1);
|
|
}
|
|
}
|