~ruther/avr-guess-the-number

ref: c98387472d899ba28d0030cae54bdb794feeb823 avr-guess-the-number/firmware/src/filled_seven_segment.rs -rw-r--r-- 2.5 KiB
c9838747 — František Boháček chore: move firmware files to firmware/ folder 1 year, 9 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
use super::seven_segment;
use super::filled_sipo;

pub struct FilledSevenSegment {
    seven_segment: seven_segment::SevenSegment,
    sipo: filled_sipo::FilledSipo,
    digits: [Option<u8>; 4],
    hide: u8,
    update_step: usize
}

impl FilledSevenSegment {
    pub fn create(seven_segment: seven_segment::SevenSegment, sipo: filled_sipo::FilledSipo) -> FilledSevenSegment {
        FilledSevenSegment {
            seven_segment,
            sipo,
            digits: [None, None, None, None],
            hide: 0,
            update_step: 0
        }
    }

    #[inline]
    pub fn hide_digit(&mut self, digit_index: usize) {
        self.hide |= 1 << digit_index;
    }

    #[inline]
    pub fn show_digit(&mut self, digit_index: usize) {
        self.hide &= !(1 << digit_index);
    }

    #[inline]
    pub fn hide_all_digits(&mut self) {
        self.hide = 0xFF;
    }

    #[inline]
    pub fn show_all_digits(&mut self) {
        self.hide = 0;
    }

    pub fn set_digit(&mut self, digit_index: usize, digit: Option<u8>) {
        if digit_index < 4 {
            self.digits[digit_index] = digit;
        }
    }

    pub fn set_number(&mut self, number: [u8; 4]) {
        for (i, digit) in number.iter().enumerate() {
            self.digits[i] = Some(*digit);
        }
    }

    #[inline]
    pub fn show_number_block(&mut self) {
        while !self.step() {}
    }

    fn fill_digit(&mut self, digit_index: usize) {
        if digit_index > 3 {
            return
        }

        if (self.hide & (1 << digit_index)) != 0 {
            self.sipo.clear();
            return
        }

        if let Some(digit) = self.digits[digit_index] {
            self.seven_segment.fill_digit(&mut self.sipo, digit, digit_index);
        } else {
            self.sipo.clear();
        }
    }

    pub fn step(&mut self) -> bool {
        if self.update_step == 0 {
            self.fill_digit(0);
            self.update_step = 1;
        }

        if self.sipo.step() {
            self.update_step += 1;

            if self.update_step <= self.seven_segment.digits().into() {
                self.fill_digit(self.update_step - 1);
            }
        }

        if self.update_step > self.seven_segment.digits().into() {
            self.update_step = 0;
            return true;
        }

        return false;
    }

    #[inline]
    pub fn reset(&mut self) {
        self.update_step = 0;
    }

    #[inline]
    pub fn clear(&mut self) {
        self.digits = [None, None, None, None];
    }
}
Do not follow this link