libyggdrasil  v1.0.0
seven_segment.hpp
Go to the documentation of this file.
1  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * _____.___. .___ .__.__ *
3  * \__ | | ____ ____ __| _/___________ _____|__| | *
4  * / | |/ ___\ / ___\ / __ |\_ __ \__ \ / ___/ | | *
5  * \____ / /_/ > /_/ > /_/ | | | \// __ \_\___ \| | |__ *
6  * / ______\___ /\___ /\____ | |__| (____ /____ >__|____/ *
7  * \/ /_____//_____/ \/ \/ \/ *
8  * - Yggdrasil - *
9  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
10  * This software can be used by students and other personal of the *
11  * Bern University of Applied Sciences under the terms of the MIT *
12  * license. *
13  * For other persons this software is under the terms of the GNU *
14  * General Public License version 2. *
15  * *
16  * Copyright © 2021, Bern University of Applied Sciences. *
17  * All rights reserved. *
18  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
26 #pragma once
27 
29 #include <cpp/common/types.hpp>
30 #include <cpp/common/utils.hpp>
31 
32 #include <cstdlib>
33 
34 namespace bsp::ygg::prph {
35 
39  class SevenSegment {
40  public:
41  SevenSegment() = delete;
42 
48  static bool init() {
49  return true;
50  }
51 
58  static void setUnsigned(u16 value) {
59  static u8 currSegment = 0;
60 
61  enableDigit(currSegment); // Enable the current segment
62 
63  switch(currSegment){
64  case 0:
65  SevenSegment::setDigit((value / 1000) % 10); // Display thousands
66  break;
67  case 1:
68  SevenSegment::setDigit((value / 100) % 10); // Display hundreds
69  break;
70  case 2:
71  SevenSegment::setDigit((value / 10) % 10); // Display tens
72  break;
73  case 3:
74  SevenSegment::setDigit((value / 1) % 10); // Display ones
75  break;
76  }
77  currSegment = (currSegment + 1) % 4; // Increment current segment
78  }
79 
86  static void setSigned(i16 value) {
87  static u8 currSegment = 0;
88 
89  enableDigit(currSegment); // Enable the current segment
90 
91  switch(currSegment) {
92  case 0:
93  if(value < 0) SevenSegment::setDigit('-'); // Display the minus
94  else SevenSegment::setDigit(' ');
95  break;
96  case 1:
97  SevenSegment::setDigit((std::abs(value) / 100) % 10); // Display hundreds
98  break;
99  case 2:
100  SevenSegment::setDigit((std::abs(value) / 10) % 10); // Display tens
101  break;
102  case 3:
103  SevenSegment::setDigit((std::abs(value) / 1) % 10); // Display ones
104  break;
105  }
106  currSegment = (currSegment + 1) % 4; // Increment current segment
107  }
108 
115  static void setHexadecimal(u16 value) {
116  static u8 currSegment = 0;
117 
118  enableDigit(currSegment); // Enable the current segment
119 
120  switch(currSegment){
121  case 0:
122  SevenSegment::setDigit((value / 0x1000) % 0x10);
123  break;
124  case 1:
125  SevenSegment::setDigit((value / 0x100) % 0x10);
126  break;
127  case 2:
128  SevenSegment::setDigit((value / 0x10) % 0x10);
129  break;
130  case 3:
131  SevenSegment::setDigit((value / 0x1) % 0x10);
132  break;
133  }
134  currSegment = (currSegment + 1) % 4; // Increment current segment
135  }
136 
143  static void setFloatingPoint(float value) {
144  static u8 currSegment = 0;
145 
146  enableDigit(currSegment);
147  switch(currSegment){
148  case 0:
149  if(value < 0) SevenSegment::setDigit('-'); // Display the minus
150  else SevenSegment::setDigit(' ');
151  break;
152  case 1:
153  if(std::abs(value) >= 10) SevenSegment::setDigit(static_cast<u8>(std::abs(value) / 10) % 10); // Display tens
154  else {
155  SevenSegment::setDigit(static_cast<u8>(std::abs(value) / 1) % 10); // Display ones
156  seven_segment::DP = true;
157  }
158  break;
159  case 2:
160  if(std::abs(value) >= 10) {
161  SevenSegment::setDigit(static_cast<u8>(std::abs(value) / 1) % 10); // Display ones
162  seven_segment::DP = true;
163  }
164  else SevenSegment::setDigit(static_cast<u8>(std::abs(value) * 10) % 10); // Display tenth
165 
166  break;
167  case 3:
168  if(std::abs(value) >= 10) SevenSegment::setDigit(static_cast<u8>(std::abs(value) * 10) % 10); // Display tenth
169  else SevenSegment::setDigit(static_cast<u8>(std::abs(value) * 100) % 10); // Display hundredth
170  break;
171  }
172 
173  currSegment = (currSegment + 1) % 4; // Increment current segment
174  }
175 
182  static void setDigit(char value){
183  switch(value){
184  case 0: seven_segment::All = 0x3F; break;
185  case 1: seven_segment::All = 0x06; break;
186  case 2: seven_segment::All = 0x5B; break;
187  case 3: seven_segment::All = 0x4F; break;
188  case 4: seven_segment::All = 0x66; break;
189  case 5: seven_segment::All = 0x6D; break;
190  case 6: seven_segment::All = 0x7D; break;
191  case 7: seven_segment::All = 0x07; break;
192  case 8: seven_segment::All = 0x7F; break;
193  case 9: seven_segment::All = 0x6F; break;
194  case 0x0A: seven_segment::All = 0x77; break;
195  case 0x0B: seven_segment::All = 0x7C; break;
196  case 0x0C: seven_segment::All = 0x39; break;
197  case 0x0D: seven_segment::All = 0x5E; break;
198  case 0x0E: seven_segment::All = 0x79; break;
199  case 0x0F: seven_segment::All = 0x71; break;
200  case '-': seven_segment::All = 0x40; break;
201  case ' ': seven_segment::All = 0x00; break;
202  }
203  }
204 
210  static void enableDigit(u8 number){
211  switch(number){
212  case 0: seven_segment::SelectAll = 0x01; break;
213  case 1: seven_segment::SelectAll = 0x02; break;
214  case 2: seven_segment::SelectAll = 0x04; break;
215  case 3: seven_segment::SelectAll = 0x08; break;
216  default: seven_segment::SelectAll = 0x00; break;
217  }
218  }
219 
223  static void disable(){
224  setDigit(' ');
225  enableDigit(0xFF); // Some value higher than 3 will shut down all
226  }
227 
228  };
229 
230 }
bsp::ygg::prph::SevenSegment::setDigit
static void setDigit(char value)
Set the segments to the given value, supports hexadecimal, '-' for minus and ' ' for an empty segment...
Definition: seven_segment.hpp:182
u16
uint16_t u16
Definition: types.h:37
utils.hpp
Commonly used helper functions.
u8
uint8_t u8
Unsigned integer definitions.
Definition: types.h:36
i16
int16_t i16
Definition: types.h:47
types.hpp
Commonly used type definitions and helper templates.
bsp::ygg::prph::SevenSegment::setHexadecimal
static void setHexadecimal(u16 value)
Display a unsigned value from 0 to 0xFFFF in hexadecimal on the 7 segments.
Definition: seven_segment.hpp:115
bsp::ygg::prph::SevenSegment::disable
static void disable()
Disable all segments.
Definition: seven_segment.hpp:223
bsp::ygg::prph::SevenSegment::setSigned
static void setSigned(i16 value)
Display a signed value from -999 to 999 on the 7 segments.
Definition: seven_segment.hpp:86
bsp::ygg::prph::SevenSegment::setFloatingPoint
static void setFloatingPoint(float value)
Display a floating point value from -99.9 to 99.9 on the 7 segments, the function will show as many d...
Definition: seven_segment.hpp:143
attributes.hpp
Commonly used C++ and GNU attributes.
bsp::ygg::prph::SevenSegment::enableDigit
static void enableDigit(u8 number)
Enable one single segment.
Definition: seven_segment.hpp:210
bsp::ygg::prph::SevenSegment
Sevensegment driver.
Definition: seven_segment.hpp:39
bsp::ygg::prph
Definition: color_sensor.hpp:32
bsp::ygg::prph::SevenSegment::init
static bool init()
Initialization function.
Definition: seven_segment.hpp:48
bsp::ygg::prph::SevenSegment::setUnsigned
static void setUnsigned(u16 value)
Display a unsigned value from 0 to 9999 on the 7 segments.
Definition: seven_segment.hpp:58
bsp::ygg::prph::SevenSegment::SevenSegment
SevenSegment()=delete