/*---------------------------------------------------------- * HTBLA-Leonding * --------------------------------------------------------- * Author: Marc Tismonar * ---------------------------------------------------------- * Description: * Implementation of car.h. * ---------------------------------------------------------- */ #include "car.h" struct CarData { CarType type; Color color; double fill_level; double acceleration_rate; double speed; }; static struct CarData aixam = {AIXAM, RED, 16.0, 0.0, -1}; static struct CarData fiat_multipla_green = {FIAT_MULTIPLA, GREEN, 65.0, 0.0, -1}; static struct CarData fiat_multipla_blue = {FIAT_MULTIPLA, BLUE, 65.0, 0.0, -1}; static struct CarData fiat_multipla_orange = {FIAT_MULTIPLA, ORANGE, 65.0, 0.0, -1}; static struct CarData jeep_silver = {JEEP, SILVER, 80.0, 0.0, -1}; static struct CarData jeep_black = {JEEP, BLACK, 80.0, 0.0, -1}; // Create a local array car_park to store all cars static struct CarData* car_park[] = { &aixam, &fiat_multipla_green, &fiat_multipla_blue, &fiat_multipla_orange, &jeep_silver, &jeep_black }; #define TOTAL_CARS (sizeof(car_park) / sizeof(car_park[0])) Car get_car(CarType carType) { for (int i = 0; i < TOTAL_CARS; i++) { if (car_park[i]->type == carType && car_park[i]->speed == -1) { car_park[i]->speed = 0; return car_park[i]; } } return 0; } CarType get_type(Car car) { return car->type; } Color get_color(Car car) { return car->color; } double get_fill_level(Car car) { return car->fill_level; } double get_acceleration_rate(Car car) { return car->acceleration_rate; } int get_speed(Car car) { if (car->speed - (int)car->speed >= 0.5) { return (int)car->speed + 1; } return (int)car->speed; } void set_acceleration_rate(Car car, double acceleration_rate) { double max_accel; double min_accel = -8.0; switch (get_type(car)) { case AIXAM: max_accel = 1.0; break; case FIAT_MULTIPLA: max_accel = 2.26; break; case JEEP: max_accel = 3.14; break; default: max_accel = 0.0; break; } if (acceleration_rate > max_accel) { car->acceleration_rate = max_accel; } else if (acceleration_rate < min_accel) { car->acceleration_rate = min_accel; } else { car->acceleration_rate = acceleration_rate; } } void accelerate(Car car) { if (car->speed == -1) { return; } double max_speed; switch(get_type(car)) { case AIXAM: max_speed = 45; break; case FIAT_MULTIPLA: max_speed = 170; break; case JEEP: max_speed = 196; break; default: max_speed = 0; break; } double calc_speed = car->speed + car->acceleration_rate * 3.6061946903; if (calc_speed >= max_speed) { car->speed = max_speed; return; } car->speed = calc_speed; } void init() { for (int i = 0; i < TOTAL_CARS; i++) { car_park[i]->speed = -1; car_park[i]->acceleration_rate = 0.0; } }