Dr Andrew Scott G7VAV

My photo
 
June 2025
Mo Tu We Th Fr Sa Su
26 27 28 29 30 31 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 1 2 3 4 5 6


map_to_7segment.h
001: /*
002:  * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
003:  *
004:  * This program is free software; you can redistribute it and/or
005:  * modify it under the terms of the GNU General Public License as
006:  * published by the Free Software Foundation; either version 2 of
007:  * the License, or (at your option) any later version.
008:  *
009:  * This program is distributed in the hope that it will be useful,
010:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
011:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012:  * GNU General Public License for more details.
013:  *
014:  * You should have received a copy of the GNU General Public License
015:  * along with this program; if not, write to the Free Software
016:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017:  */
018: 
019: #ifndef MAP_TO_7SEGMENT_H
020: #define MAP_TO_7SEGMENT_H
021: 
022: /* This file provides translation primitives and tables for the conversion
023:  * of (ASCII) characters to a 7-segments notation.
024:  *
025:  * The 7 segment's wikipedia notation below is used as standard.
026:  * See: http://en.wikipedia.org/wiki/Seven_segment_display
027:  *
028:  * Notation:    +-a-+
029:  *              f   b
030:  *              +-g-+
031:  *              e   c
032:  *              +-d-+
033:  *
034:  * Usage:
035:  *
036:  *   Register a map variable, and fill it with a character set:
037:  *      static SEG7_DEFAULT_MAP(map_seg7);
038:  *
039:  *
040:  *   Then use for conversion:
041:  *      seg7 = map_to_seg7(&map_seg7, some_char);
042:  *      ...
043:  *
044:  * In device drivers it is recommended, if required, to make the char map
045:  * accessible via the sysfs interface using the following scheme:
046:  *
047:  * static ssize_t show_map(struct device *dev, char *buf) {
048:  *      memcpy(buf, &map_seg7, sizeof(map_seg7));
049:  *      return sizeof(map_seg7);
050:  * }
051:  * static ssize_t store_map(struct device *dev, const char *buf, size_t cnt) {
052:  *      if(cnt != sizeof(map_seg7))
053:  *              return -EINVAL;
054:  *      memcpy(&map_seg7, buf, cnt);
055:  *      return cnt;
056:  * }
057:  * static DEVICE_ATTR(map_seg7, PERMS_RW, show_map, store_map);
058:  *
059:  * History:
060:  * 2005-05-31   RFC linux-kernel@vger.kernel.org
061:  */
062: #include <linux/errno.h>
063: 
064: 
065: #define BIT_SEG7_A              0
066: #define BIT_SEG7_B              1
067: #define BIT_SEG7_C              2
068: #define BIT_SEG7_D              3
069: #define BIT_SEG7_E              4
070: #define BIT_SEG7_F              5
071: #define BIT_SEG7_G              6
072: #define BIT_SEG7_RESERVED       7
073: 
074: struct seg7_conversion_map {
075:         unsigned char   table[128];
076: };
077: 
078: static __inline__ int map_to_seg7(struct seg7_conversion_map *map, int c)
079: {
080:         return c >= 0 && c < sizeof(map->table) ? map->table[c] : -EINVAL;
081: }
082: 
083: #define SEG7_CONVERSION_MAP(_name, _map)        \
084:         struct seg7_conversion_map _name = { .table = { _map } }
085: 
086: /*
087:  * It is recommended to use a facility that allows user space to redefine
088:  * custom character sets for LCD devices. Please use a sysfs interface
089:  * as described above.
090:  */
091: #define MAP_TO_SEG7_SYSFS_FILE  "map_seg7"
092: 
093: /*******************************************************************************
094:  * ASCII conversion table
095:  ******************************************************************************/
096: 
097: #define _SEG7(l,a,b,c,d,e,f,g)  \
098:       ( a<<BIT_SEG7_A | b<<BIT_SEG7_B | c<<BIT_SEG7_C | d<<BIT_SEG7_D | \
099:         e<<BIT_SEG7_E | f<<BIT_SEG7_F | g<<BIT_SEG7_G )
100: 
101: #define _MAP_0_32_ASCII_SEG7_NON_PRINTABLE      \
102:         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
103: 
104: #define _MAP_33_47_ASCII_SEG7_SYMBOL            \
105:  _SEG7('!',0,0,0,0,1,1,0), _SEG7('"',0,1,0,0,0,1,0), _SEG7('#',0,1,1,0,1,1,0),\
106:  _SEG7('$',1,0,1,1,0,1,1), _SEG7('%',0,0,1,0,0,1,0), _SEG7('&',1,0,1,1,1,1,1),\
107:  _SEG7('\'',0,0,0,0,0,1,0),_SEG7('(',1,0,0,1,1,1,0), _SEG7(')',1,1,1,1,0,0,0),\
108:  _SEG7('*',0,1,1,0,1,1,1), _SEG7('+',0,1,1,0,0,0,1), _SEG7(',',0,0,0,0,1,0,0),\
109:  _SEG7('-',0,0,0,0,0,0,1), _SEG7('.',0,0,0,0,1,0,0), _SEG7('/',0,1,0,0,1,0,1),
110: 
111: #define _MAP_48_57_ASCII_SEG7_NUMERIC           \
112:  _SEG7('0',1,1,1,1,1,1,0), _SEG7('1',0,1,1,0,0,0,0), _SEG7('2',1,1,0,1,1,0,1),\
113:  _SEG7('3',1,1,1,1,0,0,1), _SEG7('4',0,1,1,0,0,1,1), _SEG7('5',1,0,1,1,0,1,1),\
114:  _SEG7('6',1,0,1,1,1,1,1), _SEG7('7',1,1,1,0,0,0,0), _SEG7('8',1,1,1,1,1,1,1),\
115:  _SEG7('9',1,1,1,1,0,1,1),
116: 
117: #define _MAP_58_64_ASCII_SEG7_SYMBOL            \
118:  _SEG7(':',0,0,0,1,0,0,1), _SEG7(';',0,0,0,1,0,0,1), _SEG7('<',1,0,0,0,0,1,1),\
119:  _SEG7('=',0,0,0,1,0,0,1), _SEG7('>',1,1,0,0,0,0,1), _SEG7('?',1,1,1,0,0,1,0),\
120:  _SEG7('@',1,1,0,1,1,1,1),
121: 
122: #define _MAP_65_90_ASCII_SEG7_ALPHA_UPPR        \
123:  _SEG7('A',1,1,1,0,1,1,1), _SEG7('B',1,1,1,1,1,1,1), _SEG7('C',1,0,0,1,1,1,0),\
124:  _SEG7('D',1,1,1,1,1,1,0), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
125:  _SEG7('G',1,1,1,1,0,1,1), _SEG7('H',0,1,1,0,1,1,1), _SEG7('I',0,1,1,0,0,0,0),\
126:  _SEG7('J',0,1,1,1,0,0,0), _SEG7('K',0,1,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
127:  _SEG7('M',1,1,1,0,1,1,0), _SEG7('N',1,1,1,0,1,1,0), _SEG7('O',1,1,1,1,1,1,0),\
128:  _SEG7('P',1,1,0,0,1,1,1), _SEG7('Q',1,1,1,1,1,1,0), _SEG7('R',1,1,1,0,1,1,1),\
129:  _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('U',0,1,1,1,1,1,0),\
130:  _SEG7('V',0,1,1,1,1,1,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
131:  _SEG7('Y',0,1,1,0,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
132: 
133: #define _MAP_91_96_ASCII_SEG7_SYMBOL            \
134:  _SEG7('[',1,0,0,1,1,1,0), _SEG7('\\',0,0,1,0,0,1,1),_SEG7(']',1,1,1,1,0,0,0),\
135:  _SEG7('^',1,1,0,0,0,1,0), _SEG7('_',0,0,0,1,0,0,0), _SEG7('`',0,1,0,0,0,0,0),
136: 
137: #define _MAP_97_122_ASCII_SEG7_ALPHA_LOWER      \
138:  _SEG7('A',1,1,1,0,1,1,1), _SEG7('b',0,0,1,1,1,1,1), _SEG7('c',0,0,0,1,1,0,1),\
139:  _SEG7('d',0,1,1,1,1,0,1), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
140:  _SEG7('G',1,1,1,1,0,1,1), _SEG7('h',0,0,1,0,1,1,1), _SEG7('i',0,0,1,0,0,0,0),\
141:  _SEG7('j',0,0,1,1,0,0,0), _SEG7('k',0,0,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
142:  _SEG7('M',1,1,1,0,1,1,0), _SEG7('n',0,0,1,0,1,0,1), _SEG7('o',0,0,1,1,1,0,1),\
143:  _SEG7('P',1,1,0,0,1,1,1), _SEG7('q',1,1,1,0,0,1,1), _SEG7('r',0,0,0,0,1,0,1),\
144:  _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('u',0,0,1,1,1,0,0),\
145:  _SEG7('v',0,0,1,1,1,0,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
146:  _SEG7('y',0,1,1,1,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
147: 
148: #define _MAP_123_126_ASCII_SEG7_SYMBOL          \
149:  _SEG7('{',1,0,0,1,1,1,0), _SEG7('|',0,0,0,0,1,1,0), _SEG7('}',1,1,1,1,0,0,0),\
150:  _SEG7('~',1,0,0,0,0,0,0),
151: 
152: /* Maps */
153: 
154: /* This set tries to map as close as possible to the visible characteristics
155:  * of the ASCII symbol, lowercase and uppercase letters may differ in
156:  * presentation on the display.
157:  */
158: #define MAP_ASCII7SEG_ALPHANUM                  \
159:         _MAP_0_32_ASCII_SEG7_NON_PRINTABLE      \
160:         _MAP_33_47_ASCII_SEG7_SYMBOL            \
161:         _MAP_48_57_ASCII_SEG7_NUMERIC           \
162:         _MAP_58_64_ASCII_SEG7_SYMBOL            \
163:         _MAP_65_90_ASCII_SEG7_ALPHA_UPPR        \
164:         _MAP_91_96_ASCII_SEG7_SYMBOL            \
165:         _MAP_97_122_ASCII_SEG7_ALPHA_LOWER      \
166:         _MAP_123_126_ASCII_SEG7_SYMBOL
167: 
168: /* This set tries to map as close as possible to the symbolic characteristics
169:  * of the ASCII character for maximum discrimination.
170:  * For now this means all alpha chars are in lower case representations.
171:  * (This for example facilitates the use of hex numbers with uppercase input.)
172:  */
173: #define MAP_ASCII7SEG_ALPHANUM_LC                       \
174:         _MAP_0_32_ASCII_SEG7_NON_PRINTABLE      \
175:         _MAP_33_47_ASCII_SEG7_SYMBOL            \
176:         _MAP_48_57_ASCII_SEG7_NUMERIC           \
177:         _MAP_58_64_ASCII_SEG7_SYMBOL            \
178:         _MAP_97_122_ASCII_SEG7_ALPHA_LOWER      \
179:         _MAP_91_96_ASCII_SEG7_SYMBOL            \
180:         _MAP_97_122_ASCII_SEG7_ALPHA_LOWER      \
181:         _MAP_123_126_ASCII_SEG7_SYMBOL
182: 
183: #define SEG7_DEFAULT_MAP(_name)         \
184:         SEG7_CONVERSION_MAP(_name,MAP_ASCII7SEG_ALPHANUM)
185: 
186: #endif  /* MAP_TO_7SEGMENT_H */
187: 
188: 


for client (none)
© Andrew Scott 2006 - 2025,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/