Skip to content

Commit 8637c47

Browse files
committed
New FF.CFG option osd-display-order=, analagous to LCD/OLED display-order=
1 parent e137eac commit 8637c47

File tree

6 files changed

+80
-29
lines changed

6 files changed

+80
-29
lines changed

examples/FF.CFG

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ oled-font = 6x13
218218
# Values: 0 <= N <= 255
219219
oled-contrast = 143
220220

221-
# Text height and arrangement on LCD/OLED
221+
# Text height and arrangement on LCD/OLED and on OSD, respectively.
222222
# 'default', or a comma-separated list (one entry per LCD/OLED row, top down).
223223
# Each list item is a digit plus optional height specifier: <content-row>[d]
224224
# content-row: '0-3' = specified content row, '7' = blank
@@ -230,6 +230,7 @@ oled-contrast = 143
230230
# 'default' depends on display, eg.: oled-128x32='0,1' ; oled-128x64='3,0d,1'
231231
# Values: [0-7][d] | default
232232
display-order = default
233+
osd-display-order = default
233234

234235
# Turn an LCD or OLED display off after N seconds of inactivity
235236
# N=0: always off; N=255: always on

inc/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ struct packed ff_cfg {
164164
#define WDRAIN_eot 2
165165
uint8_t write_drain;
166166
uint8_t max_cyl;
167+
uint16_t osd_display_order;
167168
};
168169

169170
extern struct ff_cfg ff_cfg;

scripts/mk_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def main(argv):
4646
else:
4747
opts += ['DISPLAY_' + x]
4848
val = '|'.join(opts)
49-
elif opt == "display-order":
49+
elif opt == "display-order" or opt == "osd-display-order":
5050
if val == "default":
5151
val = "DORD_" + val
5252
else:

src/display/lcd_at32f435.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,20 +219,39 @@ static unsigned int osd_prep_buffer(void)
219219
uint16_t order = menu_mode ? 0x7903 : 0x7183;
220220
char *p;
221221
uint8_t *q = buffer;
222-
unsigned int row;
222+
unsigned int row, rows, heights;
223+
int i;
223224

224225
if (++in_osd == OSD_read) {
225226
memset(buffer, 0x11, sizeof(struct i2c_osd_info));
226227
return sizeof(struct i2c_osd_info);
227228
}
228229

230+
if ((ff_cfg.osd_display_order != DORD_default)
231+
&& (display_mode == DM_normal))
232+
order = ff_cfg.osd_display_order;
233+
234+
heights = rows = 0;
235+
for (i = 3; i >= 0; i--) {
236+
/* Iterate over rows, bottom to top. */
237+
row = order >> (i<<2);
238+
/* Skip all trailing empty rows. */
239+
if ((rows == 0) && ((row&7) == 7))
240+
continue;
241+
/* Count this row and check if it is double height. */
242+
rows++;
243+
heights <<= 1;
244+
if (row & 8)
245+
heights |= 1;
246+
}
247+
229248
*q++ = OSD_BACKLIGHT | !!_bl;
230249
*q++ = OSD_COLUMNS | lcd_columns;
231-
*q++ = OSD_ROWS | 3;
232-
*q++ = OSD_HEIGHTS | (menu_mode ? 4 : 2);
250+
*q++ = OSD_ROWS | rows;
251+
*q++ = OSD_HEIGHTS | heights;
233252
*q++ = OSD_BUTTONS | osd_buttons_tx;
234253
*q++ = OSD_DATA;
235-
for (row = 0; row < 3; row++) {
254+
for (row = 0; row < rows; row++) {
236255
p = text[(order >> (row * DORD_shift)) & DORD_row];
237256
memcpy(q, p, lcd_columns);
238257
q += lcd_columns;

src/display/lcd_stm32f105.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,21 +246,40 @@ static unsigned int osd_prep_buffer(void)
246246
uint16_t order = menu_mode ? 0x7903 : 0x7183;
247247
char *p;
248248
uint8_t *q = buffer;
249-
unsigned int row;
249+
unsigned int row, rows, heights;
250+
int i;
250251

251252
if (++in_osd == OSD_read) {
252253
i2c->cr2 |= I2C_CR2_LAST | I2C_CR2_ITEVTEN;
253254
i2c->cr1 |= I2C_CR1_ACK | I2C_CR1_START;
254255
return sizeof(struct i2c_osd_info);
255256
}
256257

258+
if ((ff_cfg.osd_display_order != DORD_default)
259+
&& (display_mode == DM_normal))
260+
order = ff_cfg.osd_display_order;
261+
262+
heights = rows = 0;
263+
for (i = 3; i >= 0; i--) {
264+
/* Iterate over rows, bottom to top. */
265+
row = order >> (i<<2);
266+
/* Skip all trailing empty rows. */
267+
if ((rows == 0) && ((row&7) == 7))
268+
continue;
269+
/* Count this row and check if it is double height. */
270+
rows++;
271+
heights <<= 1;
272+
if (row & 8)
273+
heights |= 1;
274+
}
275+
257276
*q++ = OSD_BACKLIGHT | !!_bl;
258277
*q++ = OSD_COLUMNS | lcd_columns;
259-
*q++ = OSD_ROWS | 3;
260-
*q++ = OSD_HEIGHTS | (menu_mode ? 4 : 2);
278+
*q++ = OSD_ROWS | rows;
279+
*q++ = OSD_HEIGHTS | heights;
261280
*q++ = OSD_BUTTONS | osd_buttons_tx;
262281
*q++ = OSD_DATA;
263-
for (row = 0; row < 3; row++) {
282+
for (row = 0; row < rows; row++) {
264283
p = text[(order >> (row * DORD_shift)) & DORD_row];
265284
memcpy(q, p, lcd_columns);
266285
q += lcd_columns;

src/main.c

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,30 @@ static uint8_t parse_pin_str(const char *s)
915915
return pin;
916916
}
917917

918+
static uint16_t parse_display_order(const char *p)
919+
{
920+
int sh = 0;
921+
uint16_t order = 0;
922+
923+
if (!strcmp(p, "default"))
924+
return DORD_default;
925+
926+
while (p != NULL) {
927+
order |= ((p[0]-'0')&7) << sh;
928+
if (p[1] == 'd')
929+
order |= DORD_double << sh;
930+
sh += DORD_shift;
931+
if ((p = strchr(p, ',')) == NULL)
932+
break;
933+
p++;
934+
}
935+
936+
if (sh < 16)
937+
order |= 0x7777 << sh;
938+
939+
return order;
940+
}
941+
918942
static void read_ff_cfg(void)
919943
{
920944
enum {
@@ -1200,26 +1224,13 @@ static void read_ff_cfg(void)
12001224
ff_cfg.oled_contrast = strtol(opts.arg, NULL, 10);
12011225
break;
12021226

1203-
case FFCFG_display_order: {
1204-
char *p = opts.arg;
1205-
int sh = 0;
1206-
ff_cfg.display_order = DORD_default;
1207-
if (!strcmp(p, "default"))
1208-
break;
1209-
ff_cfg.display_order = 0;
1210-
while (p != NULL) {
1211-
ff_cfg.display_order |= ((p[0]-'0')&7) << sh;
1212-
if (p[1] == 'd')
1213-
ff_cfg.display_order |= DORD_double << sh;
1214-
sh += DORD_shift;
1215-
if ((p = strchr(p, ',')) == NULL)
1216-
break;
1217-
p++;
1218-
}
1219-
if (sh < 16)
1220-
ff_cfg.display_order |= 0x7777 << sh;
1227+
case FFCFG_display_order:
1228+
ff_cfg.display_order = parse_display_order(opts.arg);
1229+
break;
1230+
1231+
case FFCFG_osd_display_order:
1232+
ff_cfg.osd_display_order = parse_display_order(opts.arg);
12211233
break;
1222-
}
12231234

12241235
case FFCFG_display_off_secs:
12251236
ff_cfg.display_off_secs = strtol(opts.arg, NULL, 10);

0 commit comments

Comments
 (0)