~ruther/CTU-FEE-B0B35APO-Semestral-project

ref: 7400879a3e0ad9da11b90d637ac3392ddb1b9691 CTU-FEE-B0B35APO-Semestral-project/lib-pheripherals/src/mzapo_rgb_led.c -rw-r--r-- 2.1 KiB
7400879a — František Boháček feat: add dialog window 3 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "mzapo_rgb_led.h"
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

mzapo_rgb_led_t rgb_led_create(unsigned char *mem_base) {
  mzapo_rgb_led_t rgb_led = {
    .mem_base = (volatile rgb_led_pixel_t*)mem_base,
  };

  for (int i = 0; i < RGB_LEDS_COUNT; i++) {
    rgb_led.states[i].timeout_ms = 0;
  }

  return rgb_led;
}

void rgb_led_set(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id, uint8_t r,
                 uint8_t g, uint8_t b) {
  if (rgb_led->mem_base != NULL) {
    rgb_led->states[id].timeout_ms = 0;
    rgb_led_pixel_t *pixel = (rgb_led_pixel_t*)((void *)rgb_led->mem_base + id * 4);
    (pixel)->red = r;
    (pixel)->green = g;
    (pixel)->blue = b;
  }
}

void rgb_led_set_red(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id) {
  rgb_led_set(rgb_led, id, 255, 0, 0);
}
void rgb_led_set_green(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id) {
  rgb_led_set(rgb_led, id, 0, 255, 0);
}
void rgb_led_set_blue(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id) {
  rgb_led_set(rgb_led, id, 0, 0, 255);
}

rgb_led_pixel_t rgb_led_get(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id) {
  return *(rgb_led_pixel_t*)(((void*)rgb_led->mem_base + id * 4));
}

void rgb_led_clear(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id) {
  rgb_led_set(rgb_led, id, 0, 0, 0);
}

void rgb_led_set_timeout(mzapo_rgb_led_t *rgb_led, mzapo_rgb_leds_t id,
                         uint8_t r, uint8_t g, uint8_t b, uint32_t timeout_ms) {
  rgb_led_set(rgb_led, id, r, g, b);
  rgb_led->states[id].timeout_ms = timeout_ms;
  clock_gettime(CLOCK_MONOTONIC, &rgb_led->states[id].set_time);
}

void rgb_led_update(mzapo_rgb_led_t *rgb_led) {
  struct timespec now;
  clock_gettime(CLOCK_MONOTONIC, &now);

  for (int i = 0; i < RGB_LEDS_COUNT; i++) {
    if (rgb_led->states[i].timeout_ms != 0) {
      struct timespec set_time = rgb_led->states[i].set_time;
      uint32_t diff = (((now.tv_sec - set_time.tv_sec) * 1000) +
                       (now.tv_nsec - set_time.tv_nsec) / 1000000);
      if (diff >= rgb_led->states[i].timeout_ms) {
        rgb_led->states[i].timeout_ms = 0;
        rgb_led_clear(rgb_led, i);
      }
    }
  }
}
Do not follow this link