Mercurial > public > ostc4
annotate Discovery/Src/display.c @ 471:73da921869d9 fix-bat-2
bugfix: implement battery charge percentage in dive header
This commit is (much) less trivial than the related 919e5cb51c92.
First, rename the CCRmode attribute (corresponding to byte Ox59) of
the SLogbookHeaderOSTC3. This byte (according to the hwOS interface
document) does not contain any CCR related value, but it contains
"battery information". Already since 2017, this byte is used from
libdivecomputer to interface the charge percentage. So, its
renamed from CCRmode to batteryCharge, to reflect its true purpose.
Now, simply add a batteryCharge attribute to the SLogbookHeader
(and see below why that is possible, without breaking things).
The remaining changes are trivial to implement battery charge
percentage in dive header.
Caveat: do not get confused by the exact role of the individual
logbook header types. SLogbookHeaderOSTC3 is the formal type of
the logbook format that the OSTC4 produces. This format is
supposed to identical to the format, as is used in hwOS for the
series of small OSTCs. Only some values of attributes are different.
For example, the OSTC4 supports VPM, so byte 0x79 (deco model used
for this dive) also has a value for VPM. But the SLogbookHeader
type, despite its name and structure, is *not* a true logbook
header, as it includes attributes that are not available in the
SLogbookHeaderOSTC3 formal header type.
Signed-off-by: Jan Mulder <jan@jlmulder.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Wed, 22 Apr 2020 13:08:57 +0200 |
parents | 5ca177d2df5d |
children | f7318457df4d |
rev | line source |
---|---|
38 | 1 |
2 #include "stm32f4xx_hal.h" /* for HAL_Delay() */ | |
3 #include "ostc.h" | |
4 #include "display.h" | |
5 | |
6 #define ENABLE_EXTENDED_COMMANDS 0xB9 | |
7 #define SET_POWER 0xB1 | |
8 #define SLEEP_OUT 0x11 | |
9 #define DISPLAY_INVERSION_OFF 0x20 | |
10 #define MEMORY_ACCESS_ONTROL 0x36 | |
11 #define INTERFACE_PIXEL_FORMAT 0x3A | |
12 #define SET_RGB_INTERFACE_RELATED 0xB3 | |
13 #define SET_DISPLAY_WAVEFORM 0xB4 | |
14 #define SET_PANEL 0xCC | |
15 #define SET_GAMMA_CURVE_RELATED 0xE0 | |
16 #define DISPLAY_ON 0x29 | |
17 #define DISPLAY_OFF 0x28 | |
18 #define SLEEP_IN 0x10 | |
19 | |
20 | |
21 static void Display_Error_Handler(void); | |
22 | |
23 void display_power_on__1_of_2__pre_RGB(void) | |
24 { | |
25 /* reset system */ | |
26 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select | |
27 | |
28 HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_RESET); | |
29 HAL_Delay(10); | |
30 HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_SET); | |
31 HAL_Delay(10); | |
32 | |
33 /* RGB signals should be now for 2 frames or more (datasheet) */ | |
34 } | |
35 | |
36 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
37 static void send(uint8_t *pData, uint16_t inputlength) |
38 | 38 { |
39 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_RESET); // chip select | |
40 | |
41 if(HAL_SPI_Transmit(&hspiDisplay,(uint8_t*)pData, inputlength, 10000) != HAL_OK) | |
42 Display_Error_Handler(); | |
43 | |
44 while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) | |
45 { | |
46 } | |
47 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select | |
48 } | |
49 | |
50 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
51 static uint16_t convert8to9to8(uint8_t *pInput, uint8_t *pOutput,uint16_t inputlength) |
38 | 52 { |
53 uint16_t outputlength; | |
54 uint8_t readbit = 0x80;//0b1000000; | |
55 uint8_t writebit = 0x40;//0b0100000; | |
56 uint16_t i,j,k; | |
57 | |
58 outputlength = ((inputlength+7)/8)*9; | |
59 | |
60 for(i=0;i<outputlength;i++) | |
61 pOutput[i] = 0; | |
62 | |
63 k = 0; | |
64 for(i=0;i<inputlength;i++) | |
65 { | |
66 if(i != 0) | |
67 { | |
68 pOutput[k] |= writebit; // 9. bit | |
69 writebit = writebit >> 1; | |
70 if(writebit == 0) | |
71 { | |
72 writebit = 0x80; | |
73 k++; | |
74 } | |
75 } | |
76 for(j=0;j<8;j++) | |
77 { | |
78 if((pInput[i] & readbit) != 0) | |
79 { | |
80 pOutput[k] |= writebit; | |
81 } | |
82 readbit = readbit >> 1; | |
83 if(readbit == 0) | |
84 readbit = 0x80; | |
85 writebit = writebit >> 1; | |
86 if(writebit == 0) | |
87 { | |
88 writebit = 0x80; | |
89 k++; | |
90 } | |
91 } | |
92 } | |
93 return outputlength; | |
94 } | |
95 | |
96 void display_power_on__2_of_2__post_RGB(void) | |
97 { | |
98 uint8_t aTxBuffer[32]; | |
99 uint8_t bTxBuffer[36]; | |
100 uint16_t i,length; | |
101 | |
102 for(i=0;i<32;i++) | |
103 aTxBuffer[i] = 0; | |
104 for(i=0;i<36;i++) | |
105 bTxBuffer[i] = 0; | |
106 | |
107 aTxBuffer[0] = ENABLE_EXTENDED_COMMANDS; | |
108 aTxBuffer[1] = 0xFF; | |
109 aTxBuffer[2] = 0x83; | |
110 aTxBuffer[3] = 0x63; | |
111 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,4); | |
112 send((uint8_t*)bTxBuffer, length); | |
113 | |
114 aTxBuffer[0] = SET_POWER; | |
115 aTxBuffer[1] = 0x81; | |
116 aTxBuffer[2] = 0x24; | |
117 aTxBuffer[3] = 0x04; | |
118 aTxBuffer[4] = 0x02; | |
119 aTxBuffer[5] = 0x02; | |
120 aTxBuffer[6] = 0x03; | |
121 aTxBuffer[7] = 0x10; | |
122 aTxBuffer[8] = 0x10; | |
123 aTxBuffer[9] = 0x34; | |
124 aTxBuffer[10] = 0x3C; | |
125 aTxBuffer[11] = 0x3F; | |
126 aTxBuffer[12] = 0x3F; | |
127 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13); | |
128 send((uint8_t*)bTxBuffer, length); | |
129 | |
130 aTxBuffer[0] = SLEEP_OUT; | |
131 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); | |
132 send((uint8_t*)bTxBuffer, length); | |
133 HAL_Delay(5+1); | |
134 | |
135 aTxBuffer[0] = DISPLAY_INVERSION_OFF; | |
136 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); | |
137 send((uint8_t*)bTxBuffer, length); | |
138 | |
139 aTxBuffer[0] = MEMORY_ACCESS_ONTROL; | |
140 aTxBuffer[1] = 0x00; | |
141 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); | |
142 send((uint8_t*)bTxBuffer, length); | |
143 | |
144 aTxBuffer[0] = INTERFACE_PIXEL_FORMAT; | |
145 aTxBuffer[1] = 0x70; | |
146 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); | |
147 send((uint8_t*)bTxBuffer, length); | |
148 HAL_Delay(120+20); | |
149 | |
150 aTxBuffer[0] = SET_POWER; | |
151 aTxBuffer[1] = 0x78; | |
152 aTxBuffer[2] = 0x24; | |
153 aTxBuffer[3] = 0x04, | |
154 aTxBuffer[4] = 0x02; | |
155 aTxBuffer[5] = 0x02; | |
156 aTxBuffer[6] = 0x03; | |
157 aTxBuffer[7] = 0x10; | |
158 aTxBuffer[8] = 0x10; | |
159 aTxBuffer[9] = 0x34; | |
160 aTxBuffer[10] = 0x3C; | |
161 aTxBuffer[11] = 0x3F; | |
162 aTxBuffer[12] = 0x3F; | |
163 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13); | |
164 send((uint8_t*)bTxBuffer, length); | |
165 | |
166 aTxBuffer[0] = SET_RGB_INTERFACE_RELATED; | |
167 aTxBuffer[1] = 0x01; | |
168 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); | |
169 send((uint8_t*)bTxBuffer, length); | |
170 | |
171 aTxBuffer[0] = SET_DISPLAY_WAVEFORM; | |
172 aTxBuffer[1] = 0x00; | |
173 aTxBuffer[2] = 0x08; | |
174 aTxBuffer[3] = 0x56; | |
175 aTxBuffer[4] = 0x07; | |
176 aTxBuffer[5] = 0x01; | |
177 aTxBuffer[6] = 0x01; | |
178 aTxBuffer[7] = 0x4D; | |
179 aTxBuffer[8] = 0x01; | |
180 aTxBuffer[9] = 0x42; | |
181 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,10); | |
182 send((uint8_t*)bTxBuffer, length); | |
183 | |
184 aTxBuffer[0] = SET_PANEL; | |
185 aTxBuffer[1] = 0x0B; | |
186 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); | |
187 send((uint8_t*)bTxBuffer, length); | |
188 | |
189 aTxBuffer[0] = SET_GAMMA_CURVE_RELATED; | |
190 aTxBuffer[1] = 0x01; | |
191 aTxBuffer[2] = 0x48; | |
192 aTxBuffer[3] = 0x4D; | |
193 aTxBuffer[4] = 0x4E; | |
194 aTxBuffer[5] = 0x58; | |
195 aTxBuffer[6] = 0xF6; | |
196 aTxBuffer[7] = 0x0B; | |
197 aTxBuffer[8] = 0x4E; | |
198 aTxBuffer[9] = 0x12; | |
199 aTxBuffer[10] = 0xD5; | |
200 aTxBuffer[11] = 0x15; | |
201 aTxBuffer[12] = 0x95; | |
202 aTxBuffer[13] = 0x55; | |
203 aTxBuffer[14] = 0x8E; | |
204 aTxBuffer[15] = 0x11; | |
205 aTxBuffer[16] = 0x01; | |
206 aTxBuffer[17] = 0x48; | |
207 aTxBuffer[18] = 0x4D; | |
208 aTxBuffer[19] = 0x55; | |
209 aTxBuffer[20] = 0x5F; | |
210 aTxBuffer[21] = 0xFD; | |
211 aTxBuffer[22] = 0x0A; | |
212 aTxBuffer[23] = 0x4E; | |
213 aTxBuffer[24] = 0x51; | |
214 aTxBuffer[25] = 0xD3; | |
215 aTxBuffer[26] = 0x17; | |
216 aTxBuffer[27] = 0x95; | |
217 aTxBuffer[28] = 0x96; | |
218 aTxBuffer[29] = 0x4E; | |
219 aTxBuffer[30] = 0x11; | |
220 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,31); | |
221 send((uint8_t*)bTxBuffer, length); | |
222 HAL_Delay(5+1); | |
223 | |
224 aTxBuffer[0] = DISPLAY_ON; | |
225 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); | |
226 send((uint8_t*)bTxBuffer, length); | |
227 } | |
228 | |
229 | |
230 static void Display_Error_Handler(void) | |
231 { | |
232 while(1) | |
233 { | |
234 } | |
235 } |