Project

General

Profile

Statistics
| Revision:

root / lab2 / lab2.c @ 143

History | View | Annotate | Download (2.5 KB)

1 4 up20180655
#include <lcom/lcf.h>
2
#include <lcom/lab2.h>
3
4
#include <stdbool.h>
5
#include <stdint.h>
6
7
int main(int argc, char *argv[]) {
8
  // sets the language of LCF messages (can be either EN-US or PT-PT)
9
  lcf_set_language("EN-US");
10
11
  // enables to log function invocations that are being "wrapped" by LCF
12
  // [comment this out if you don't want/need it]
13
  lcf_trace_calls("/home/lcom/labs/lab2/trace.txt");
14
15
  // enables to save the output of printf function calls on a file
16
  // [comment this out if you don't want/need it]
17
  lcf_log_output("/home/lcom/labs/lab2/output.txt");
18
19
  // handles control over to LCF
20
  // [LCF handles command line arguments and invokes the right function]
21
  if (lcf_start(argc, argv))
22
    return 1;
23
24
  // LCF clean up tasks
25
  // [must be the last statement before return]
26
  lcf_cleanup();
27
28
  return 0;
29
}
30
31 6 up20180642
int(timer_test_read_config)(uint8_t timer, enum timer_status_field field){
32 5 up20180642
    uint8_t state = 0;
33
    if(timer_get_conf(timer, &state)) return 1;
34 6 up20180642
    if(timer_display_conf(timer, state, field)) return 1;
35 5 up20180642
    return 0;
36 4 up20180655
}
37
38
int(timer_test_time_base)(uint8_t timer, uint32_t freq) {
39 15 up20180655
    if (timer_set_frequency(timer, freq)) return 1;
40 29 up20180655
    return 0;
41 4 up20180655
}
42
43 26 up20180642
extern int no_interrupts;
44 25 up20180655
45 4 up20180655
int(timer_test_int)(uint8_t time) {
46 29 up20180655
    const int frequency = 60; // Frequency asummed at 60Hz
47 20 up20180655
    int ipc_status, r;
48
    message msg;
49 46 up20180642
    uint8_t timer_id = 0;
50 23 up20180655
    no_interrupts = 0;
51 63 up20180642
    if (timer_subscribe_int(&timer_id)) return 1;
52
    int irq_set = BIT(timer_id);
53 23 up20180655
    while (time) {
54 20 up20180655
        /* Get a request message. */
55
        if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) {
56
            printf("driver_receive failed with %d", r);
57
            continue;
58
        }
59
        if (is_ipc_notify(ipc_status)) { /* received notification */
60
            switch (_ENDPOINT_P(msg.m_source)) {
61
                case HARDWARE: /* hardware interrupt notification */
62
                    if (msg.m_notify.interrupts & irq_set) { /* subscribed interrupt */
63
                        timer_int_handler();
64 29 up20180655
                        if (!(no_interrupts % frequency)) { /* second elapsed */
65 25 up20180655
                            timer_print_elapsed_time();
66
                            time--;
67
                        }
68 20 up20180655
                    }
69
                    break;
70
                default:
71
                    break; /* no other notifications expected: do nothing */
72
            }
73
        } else { /* received standart message, not a notification */
74
            /* no standart message expected: do nothing */
75
        }
76
    }
77 29 up20180655
    if (timer_unsubscribe_int()) return 1;
78
    return 0;
79 4 up20180655
}