/* alarm_task: raises the alarm */ void alarm_task(void) { /* local copy of Clock.alarm_enabled */ int alarm_enabled = 1; while(1) { /* wait for alarm time */ si_sem_wait(&Clock.start_alarm); /* update local copy of Clock.alarm_enabled */ si_sem_wait(&Clock.mutex); alarm_enabled = Clock.alarm_enabled; si_sem_signal(&Clock.mutex); while(alarm_enabled) { /* trigger the alarm */ display_alarm_text(); /* wait one second */ si_wait_n_ms(10000); /* update local copy of Clock.alarm_enabled */ si_sem_wait(&Clock.mutex); alarm_enabled = Clock.alarm_enabled; si_sem_signal(&Clock.mutex); } } }
/* increment_time: increments the current time with one second */ void increment_time(void) { /* reserve clock variables */ si_sem_wait(&Clock.mutex); /* increment time */ Clock.time.seconds++; if (Clock.time.seconds > 59) { Clock.time.seconds = 0; Clock.time.minutes++; if (Clock.time.minutes > 59) { Clock.time.minutes = 0; Clock.time.hours++; if (Clock.time.hours > 23) { Clock.time.hours = 0; } } } /* release clock variables */ si_sem_signal(&Clock.mutex); }
/* increment_time: increments the current time with one second */ void increment_time(void) { /* reserve clock variables */ si_sem_wait(&Mutex); /* increment time */ Seconds++; if (Seconds > 59) { Seconds = 0; Minutes++; if (Minutes > 59) { Minutes = 0; Hours++; if (Hours > 11) { Hours = 0; } } } /* release clock variables */ si_sem_signal(&Mutex); }
/* get_number: gets the value of Number, together with the value of Even_Number, which indicates if Number is even or odd */ void get_number( int *number_value, int *even_number_value) { si_sem_wait(&Mutex); *number_value = Number; *even_number_value = Even_Number; si_sem_signal(&Mutex); }
void check_alarm_time(void) { si_sem_wait(&Clock.mutex); if (Clock.time.seconds >= Clock.alarm_time.seconds && Clock.time.minutes >= Clock.alarm_time.minutes && Clock.time.hours >= Clock.alarm_time.hours && Clock.alarm_enabled == 1) { si_sem_signal(&Clock.start_alarm); } si_sem_signal(&Clock.mutex); }
/* The shall be one task for each person. All person tasks shall be implemented by the same C function, called passenger_task. */ void passenger_task(void) { //printf("blaba\n"); int id; int length; int send_task_id; int current; int from; int to; /* receive id */ si_message_receive((char *) &id, &length, &send_task_id); current = random_level(); while (1) { from = current; to = random_level(); si_sem_wait(&mainlift->mutex); enter_floor(mainlift,id, current);//spawna si_sem_signal(&mainlift->mutex); printf("Passenger %d starting journey from %d to %d.\n", id, from, to); lift_travel(mainlift, id, from, to);//res current = to; printf("Passenger %d arrived at %d.\n", id, current); si_sem_wait(&mainlift->mutex); leave_floor(mainlift, id, current);//ta bort från våning si_sem_signal(&mainlift->mutex); si_wait_n_ms(TIME_TO_NEW_JOURNEY); } }
/* clock_set_time: set current time to hours, minutes and seconds */ void clock_set_time(int hours, int minutes, int seconds) { si_sem_wait(&Clock.mutex); Clock.time.hours = hours; Clock.time.minutes = minutes; Clock.time.seconds = seconds; si_sem_signal(&Clock.mutex); }
/* clock_reset_alarm: */ void clock_reset_alarm(void) { si_sem_wait(&Clock.mutex); Clock.alarm_enabled = 0; erase_alarm_time(); erase_alarm_text(); si_sem_signal(&Clock.mutex); }
/* get_time: read time from common clock variables */ void get_time(int *hours, int *minutes, int *seconds) { /* reserve clock variables */ si_sem_wait(&Clock.mutex); /* read values */ *hours = Clock.time.hours; *minutes = Clock.time.minutes; *seconds = Clock.time.seconds; /* release clock variables */ si_sem_signal(&Clock.mutex); }
/* get_time: read time from common clock variables */ void get_time(int *hours, int *minutes, int *seconds) { /* reserve clock variables */ si_sem_wait(&Mutex); /* read values */ *hours = Hours; *minutes = Minutes; *seconds = Seconds; /* release clock variables */ si_sem_signal(&Mutex); }
/* set_time: set time to hours, minutes and seconds */ void set_time(int hours, int minutes, int seconds) { /* reserve clock variables */ si_sem_wait(&Mutex); /* assign values */ Hours = hours; Minutes = minutes; Seconds = seconds; /* release clock variables */ si_sem_signal(&Mutex); }
/* clock_set_alarm: set current time to hours, minutes and seconds */ void clock_set_alarm(int hours, int minutes, int seconds) { si_sem_wait(&Clock.mutex); Clock.alarm_time.hours = hours; Clock.alarm_time.minutes = minutes; Clock.alarm_time.seconds = seconds; Clock.alarm_enabled = 1; display_alarm_time(hours, minutes, seconds); si_sem_signal(&Clock.mutex); }
/* set_number: sets Number and updates Even_Number */ void set_number(int new_number) { si_sem_wait(&Mutex); Number = new_number; if (Number % 2 == 0) { Even_Number = 1; } else { Even_Number = 0; } si_sem_signal(&Mutex); }
/* decrement_number: decrements Number with dec_value, and updates Even_Number */ void decrement_number(int dec_value) { si_sem_wait(&Mutex); Number -= dec_value; if (Number % 2 == 0) { Even_Number = 1; } else { Even_Number = 0; } si_sem_signal(&Mutex); }
/* increment_number: increments Number by adding inc_value to Number, and updates Even_Number */ void increment_number(int inc_value) { si_sem_wait(&Mutex); /* fig_begin number_inc_value */ Number += inc_value; long_calculation(); /* fig_end number_inc_value */ if (Number % 2 == 0) { Even_Number = 1; } else { Even_Number = 0; } si_sem_signal(&Mutex); }
void stop_task(void) { si_sem_wait(&Task_Stop_Sem); }