Skip to content

Commit b39ef92

Browse files
HAL: remove user-facing magic numbers
1 parent 2613ba9 commit b39ef92

File tree

2 files changed

+53
-53
lines changed

2 files changed

+53
-53
lines changed

targets/f7/furi_hal/furi_hal_serial.c

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -605,46 +605,52 @@ void furi_hal_serial_set_br(FuriHalSerialHandle* handle, uint32_t baud) {
605605
}
606606
}
607607

608-
// Flash usage optimization: by checking that our enum members are equal to the
609-
// corresponding ST LL values, we can avoid having to convert between our
610-
// representation and the ST LL representation, thus shaving off about 120 bytes
611-
// (about half the size of this feature)
612-
static_assert(FuriHalSerialDataBits7 == LL_USART_DATAWIDTH_7B);
613-
static_assert(FuriHalSerialDataBits8 == LL_USART_DATAWIDTH_8B);
614-
static_assert(FuriHalSerialDataBits9 == LL_USART_DATAWIDTH_9B);
615-
static_assert(FuriHalSerialParityNone == LL_USART_PARITY_NONE);
616-
static_assert(FuriHalSerialParityEven == LL_USART_PARITY_EVEN);
617-
static_assert(FuriHalSerialParityOdd == LL_USART_PARITY_ODD);
618-
static_assert(FuriHalSerialStopBits0_5 == LL_USART_STOPBITS_0_5);
619-
static_assert(FuriHalSerialStopBits1 == LL_USART_STOPBITS_1);
620-
static_assert(FuriHalSerialStopBits1_5 == LL_USART_STOPBITS_1_5);
621-
static_assert(FuriHalSerialStopBits2 == LL_USART_STOPBITS_2);
608+
// Avoid duplicating look-up tables between USART and LPUART
609+
static_assert(LL_LPUART_DATAWIDTH_7B == LL_USART_DATAWIDTH_7B);
610+
static_assert(LL_LPUART_DATAWIDTH_8B == LL_USART_DATAWIDTH_8B);
611+
static_assert(LL_LPUART_DATAWIDTH_9B == LL_USART_DATAWIDTH_9B);
612+
static_assert(LL_LPUART_PARITY_NONE == LL_USART_PARITY_NONE);
613+
static_assert(LL_LPUART_PARITY_EVEN == LL_USART_PARITY_EVEN);
614+
static_assert(LL_LPUART_PARITY_ODD == LL_USART_PARITY_ODD);
615+
static_assert(LL_LPUART_STOPBITS_1 == LL_USART_STOPBITS_1);
616+
static_assert(LL_LPUART_STOPBITS_2 == LL_USART_STOPBITS_2);
617+
618+
static const uint32_t serial_data_bits_lut[] = {
619+
[FuriHalSerialDataBits7] = LL_USART_DATAWIDTH_7B,
620+
[FuriHalSerialDataBits8] = LL_USART_DATAWIDTH_8B,
621+
[FuriHalSerialDataBits9] = LL_USART_DATAWIDTH_9B,
622+
};
623+
624+
static const uint32_t serial_parity_lut[] = {
625+
[FuriHalSerialParityNone] = LL_USART_PARITY_NONE,
626+
[FuriHalSerialParityEven] = LL_USART_PARITY_EVEN,
627+
[FuriHalSerialParityOdd] = LL_USART_PARITY_ODD,
628+
};
629+
630+
static const uint32_t serial_stop_bits_lut[] = {
631+
[FuriHalSerialStopBits0_5] = LL_USART_STOPBITS_0_5,
632+
[FuriHalSerialStopBits1] = LL_USART_STOPBITS_1,
633+
[FuriHalSerialStopBits1_5] = LL_USART_STOPBITS_1_5,
634+
[FuriHalSerialStopBits2] = LL_USART_STOPBITS_2,
635+
};
622636

623637
static void furi_hal_serial_usart_configure_framing(
624638
FuriHalSerialDataBits data_bits,
625639
FuriHalSerialParity parity,
626640
FuriHalSerialStopBits stop_bits) {
627-
LL_USART_SetDataWidth(USART1, data_bits);
628-
LL_USART_SetParity(USART1, parity);
629-
LL_USART_SetStopBitsLength(USART1, stop_bits);
641+
LL_USART_SetDataWidth(USART1, serial_data_bits_lut[data_bits]);
642+
LL_USART_SetParity(USART1, serial_parity_lut[parity]);
643+
LL_USART_SetStopBitsLength(USART1, serial_stop_bits_lut[stop_bits]);
630644
}
631645

632-
static_assert(FuriHalSerialDataBits7 == LL_LPUART_DATAWIDTH_7B);
633-
static_assert(FuriHalSerialDataBits8 == LL_LPUART_DATAWIDTH_8B);
634-
static_assert(FuriHalSerialDataBits9 == LL_LPUART_DATAWIDTH_9B);
635-
static_assert(FuriHalSerialParityNone == LL_LPUART_PARITY_NONE);
636-
static_assert(FuriHalSerialParityEven == LL_LPUART_PARITY_EVEN);
637-
static_assert(FuriHalSerialParityOdd == LL_LPUART_PARITY_ODD);
638-
static_assert(FuriHalSerialStopBits1 == LL_LPUART_STOPBITS_1);
639-
static_assert(FuriHalSerialStopBits2 == LL_LPUART_STOPBITS_2);
640-
641646
static void furi_hal_serial_lpuart_configure_framing(
642647
FuriHalSerialDataBits data_bits,
643648
FuriHalSerialParity parity,
644649
FuriHalSerialStopBits stop_bits) {
645-
LL_LPUART_SetDataWidth(LPUART1, data_bits);
646-
LL_LPUART_SetParity(LPUART1, parity);
647-
LL_LPUART_SetStopBitsLength(LPUART1, stop_bits);
650+
LL_LPUART_SetDataWidth(LPUART1, serial_data_bits_lut[data_bits]);
651+
LL_LPUART_SetParity(LPUART1, serial_parity_lut[parity]);
652+
// Unsupported non-whole stop bit numbers have been furi_check'ed away
653+
LL_LPUART_SetStopBitsLength(LPUART1, serial_stop_bits_lut[stop_bits]);
648654
}
649655

650656
void furi_hal_serial_configure_framing(
@@ -659,14 +665,7 @@ void furi_hal_serial_configure_framing(
659665
if(data_bits == FuriHalSerialDataBits6) furi_check(parity != FuriHalSerialParityNone);
660666

661667
// Extend data word to account for parity bit
662-
if(parity != FuriHalSerialParityNone) {
663-
if(data_bits == FuriHalSerialDataBits6)
664-
data_bits = FuriHalSerialDataBits7;
665-
else if(data_bits == FuriHalSerialDataBits7)
666-
data_bits = FuriHalSerialDataBits8;
667-
else if(data_bits == FuriHalSerialDataBits8)
668-
data_bits = FuriHalSerialDataBits9;
669-
}
668+
if(parity != FuriHalSerialParityNone) data_bits++;
670669

671670
if(handle->id == FuriHalSerialIdUsart) {
672671
if(LL_USART_IsEnabled(USART1)) {

targets/f7/furi_hal/furi_hal_serial_types.h

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,39 @@ typedef enum {
1919
FuriHalSerialDirectionMax,
2020
} FuriHalSerialDirection;
2121

22-
// For an explanation of these magic numbers see furi_hal_serial.c, static
23-
// asserts right before `furi_hal_serial_usart_configure_framing`. Not including
24-
// the ST peripheral LL header here to pull these magic numbers from to avoid
25-
// exposing it to users of our HAL.
26-
2722
/**
2823
* @brief Actual data bits, i.e. not including start/stop and parity bits
2924
* @note 6 data bits are only permitted when parity is enabled
3025
* @note 9 data bits are only permitted when parity is disabled
3126
*/
3227
typedef enum {
33-
FuriHalSerialDataBits6 = 1,
34-
FuriHalSerialDataBits7 = 1 << 28,
35-
FuriHalSerialDataBits8 = 0,
36-
FuriHalSerialDataBits9 = 1 << 12,
28+
FuriHalSerialDataBits6,
29+
FuriHalSerialDataBits7,
30+
FuriHalSerialDataBits8,
31+
FuriHalSerialDataBits9,
32+
33+
FuriHalSerialDataBitsMax,
3734
} FuriHalSerialDataBits;
3835

3936
typedef enum {
40-
FuriHalSerialParityNone = 0,
41-
FuriHalSerialParityEven = 1 << 10,
42-
FuriHalSerialParityOdd = ((1 << 10) | (1 << 9)),
37+
FuriHalSerialParityNone,
38+
FuriHalSerialParityEven,
39+
FuriHalSerialParityOdd,
40+
41+
FuriHalSerialParityMax,
4342
} FuriHalSerialParity;
4443

4544
/**
4645
* @brief Stop bit length
4746
* @note LPUART only supports whole stop bit lengths (i.e. 1 and 2, but not 0.5 and 1.5)
4847
*/
4948
typedef enum {
50-
FuriHalSerialStopBits0_5 = 1 << 12,
51-
FuriHalSerialStopBits1 = 0,
52-
FuriHalSerialStopBits1_5 = 3 << 12,
53-
FuriHalSerialStopBits2 = 2 << 12,
49+
FuriHalSerialStopBits0_5,
50+
FuriHalSerialStopBits1,
51+
FuriHalSerialStopBits1_5,
52+
FuriHalSerialStopBits2,
53+
54+
FuriHalSerialStopBits2Max,
5455
} FuriHalSerialStopBits;
5556

5657
typedef struct FuriHalSerialHandle FuriHalSerialHandle;

0 commit comments

Comments
 (0)