~ruther/uni-mam-arm

ref: bb6a58a376bbc65e6c168ecc698421164363bb38 uni-mam-arm/arm07/src/spi_matrix.c -rw-r--r-- 3.1 KiB
bb6a58a3 — Rutherther feat(arm07): implement few commands 3 months 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "spi_matrix.h"

#define DIGITS 8

void matrix_init(matrix_t *matrix, buffered_transceiver_t *transceiver,
                 uint32_t shift_period) {
  matrix->transceiver = transceiver;
  matrix->shift_period = shift_period;
  matrix->slot = MATRIX_SLOT0;
  matrix->state = MATRIX_OFF;

  matrix->state_cycle = 0;
  matrix->cycle = 0;

  matrix->intensity = 1;
}

void matrix_setup(matrix_t *matrix) {
  matrix->state = MATRIX_OFF;
  matrix->slot = MATRIX_SLOT0;
}

void matrix_enable(matrix_t *matrix, bool enable) {
  matrix->state = MATRIX_STABLE;
  matrix->slot = MATRIX_SLOT0;

  matrix_send(matrix, MATRIX_REG_SHUTDOWN, enable ? 1 : 0);
  matrix_send(matrix, MATRIX_REG_DECODE_MODE, 0);
  matrix_send(matrix, MATRIX_REG_INTENSITY, matrix->intensity);
  matrix_send(matrix, MATRIX_REG_SCAN_LIMIT, 0x7);
}

void matrix_increase_intensity(matrix_t *matrix) {
  if (matrix->intensity < 0xF) {
    matrix->intensity++;
  }

  matrix_send(matrix, MATRIX_REG_INTENSITY, matrix->intensity);
}

void matrix_decrease_intensity(matrix_t *matrix) {
  if (matrix->intensity > 0x0) {
    matrix->intensity--;
  }

  matrix_send(matrix, MATRIX_REG_INTENSITY, matrix->intensity);
}

void matrix_send(matrix_t *matrix, matrix_register_t reg, uint8_t value) {
  uint16_t data = (((uint16_t)reg) << 8) | (uint16_t)value;
  buffered_transceiver_transmit(matrix->transceiver, (void*)&data, 1);
}

void matrix_set_buffer(matrix_t *matrix, matrix_slot_t slot, uint8_t *buffer) {
  if (slot == MATRIX_SLOT_OTHER) {

    if (matrix->slot == MATRIX_SLOT0) {
      slot = MATRIX_SLOT1;
    } else {
      slot = MATRIX_SLOT0;
    }
  }

  matrix->buffers[slot] = buffer;
}

void matrix_swap(matrix_t *matrix) {
  if (matrix->slot == MATRIX_SLOT0) {
    matrix->slot = MATRIX_SLOT1;
  } else {
    matrix->slot = MATRIX_SLOT0;
  }
}

void matrix_animate_swap(matrix_t *matrix) {
  matrix->state_cycle = 0;
  matrix->cycle = 0;
  matrix->state = MATRIX_ANIMATING;
}

void matrix_update(matrix_t *matrix, buffered_transceiver_t *transceiver) {
  uint8_t* buffer = matrix->buffers[matrix->slot];
  uint8_t* other_buffer = matrix->buffers[1 - matrix->slot];

  switch (matrix->state) {
  case MATRIX_OFF:
    // all digits 0
    for (uint8_t digit = 0; digit < DIGITS; digit++) {
      matrix_send(matrix, MATRIX_REG_DIGIT0 + digit, 0);
    }
    break;
  case MATRIX_STABLE:
    // send all digits
    for (uint8_t digit = 0; digit < DIGITS; digit++) {
      matrix_send(matrix, MATRIX_REG_DIGIT0 + digit, buffer[digit]);
    }
    break;
  case MATRIX_ANIMATING:
    // update the cycle
    matrix->cycle++;
    if (matrix->cycle >= matrix->shift_period) {
      matrix->cycle = 0;
      matrix->state_cycle++;
    }

    if (matrix->state_cycle == DIGITS) {
      matrix->state = MATRIX_STABLE;
      matrix_swap(matrix);
    }

    for (uint8_t digit = 0; digit < DIGITS - matrix->state_cycle; digit++) {
      matrix_send(matrix, MATRIX_REG_DIGIT0 + digit, buffer[digit + matrix->state_cycle]);
    }

    for (uint8_t digit = DIGITS - matrix->state_cycle; digit < DIGITS; digit++) {
      matrix_send(matrix, MATRIX_REG_DIGIT0 + digit, other_buffer[digit - (DIGITS - matrix->state_cycle)]);
    }
    break;
  }
}
Do not follow this link