#ifndef INC_FND_H_
#define INC_FND_H_

#include "main.h"

typedef struct fnd_control {
	GPIO_TypeDef	*port;
	uint16_t		pinNumber;
} FND_CONTROL;

extern uint8_t segNum[20];
extern uint8_t segAlph[26];

void fndDisplay_CC(uint8_t select, uint8_t num);
void fndDisplay_CA(uint8_t select, uint8_t num);

#endif /* INC_FND_H_ */
// fnd.c
#include "fnd.h"

// FND 연결 Port, Pin 정보
FND_CONTROL fnd[8] = {
		{GPIOC, GPIO_PIN_9},
		{GPIOB, GPIO_PIN_8},
		{GPIOB, GPIO_PIN_9},
		{GPIOA, GPIO_PIN_5},
		{GPIOA, GPIO_PIN_7},
		{GPIOC, GPIO_PIN_7},
		{GPIOA, GPIO_PIN_9},
		{GPIOA, GPIO_PIN_8}
};

// FND 출력용 숫자 배열, 0 ~ 9, 0. ~ 9.
uint8_t segNum[20] = { // .GFEDCBA
    0x3f, 0x06,     // 00111111 --FEDCBA 0, 00000110 -----CB- 1
    0x5b, 0x4f,     // 01011011 -G-ED-BA 2, 01001111 -G--DCBA 3
    0x66, 0x6d,     // 01100110 -GF--CB- 4, 01101101 -GF-DC-A 5
    0x7d, 0x27,     // 01111101 -GFEDC-A 6, 00100111 --F--CBA 7
    0x7f, 0x67,     // 01111111 -GFEDCBA 8, 01100111 -GF--CBA 9
    0xbf, 0x86,     // 10111111 .-FEDCBA 0, 10000110 .----CB- 1
    0xdb, 0xcf,     // 11011011 .G-ED-BA 2, 11001111 .G--DCBA 3
    0xe6, 0xed,     // 11100110 .GF--CB- 4, 11101101 .GF-DC-A 5
    0xfd, 0xa7,     // 11111101 .GFEDC-A 6, 10100111 .-F--CBA 7
    0xff, 0xe7      // 11111111 .GFEDCBA 8, 11100111 .GF--CBA 9
};

// FND 출력용 영문 배열, A ~ Z
uint8_t segAlph[26] = { // .GFEDCBA
    0x5f, 0x7c,     // 0101 1111 -G-EDCBA A, 0111 1100 -GFEDC-- B 0 1
    0x39, 0x5e,     // 0101 1001 --FED--A C, 0101 1110 -G-EDCB- D 2 3
    0x79, 0x71,     // 0111 1001 -GFED--A E, 0111 0001 -GFE---A F 4 5
    0x3d, 0x76,     // 0011 1101 --FEDC-A G, 0111 0110 -GFE-CB- H 6 7
    0x11, 0x0d,     // 0011 0000 ---E---A I, 0000 1101 ----DC-A J 8 9
    0x75, 0x38,     // 0111 0101 -GFE-C-A K, 0011 1000 --FED--- L 10 11
    0x55, 0x54,     // 0101 0101 -G-E-C-A M, 0101 0100 -G-E-C-- N 12 13
    0x5c, 0x73,     // 0101 1100 -G-EDC-- O, 0111 0011 -GFE--BA P 14 15
    0x67, 0x50,     // 0110 0111 -GF--CBA Q, 0101 0000 -G-E---- R 16 17
    0x2d, 0x78,     // 0010 1101 --F-DC-A S, 0111 1000 -GFED--- T 18 19
    0x1c, 0x2a,     // 0001 1100 ---EDC-- U, 0010 1010 --F-D-B- V 20 21
    0x6a, 0x14,     // 0110 1010 -GF-D-B- W, 0001 0100 ---E-C-- X 22 23
    0x6e, 0x1b      // 0110 1110 -GF-DCB- Y, 0001 1011 ---ED-BA Z 24 25
};

// FND 출력 함수, select 0 숫자 / 1 영문 / 2 초기화, num 배열 번호
void fndDisplay_CC(uint8_t select, uint8_t num) {
	switch (select) {
		case 0:
			for (uint8_t i = 0; i < 8; i++) {
				if (segNum[num] & (1 << i)) {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_SET);
				}
				else {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
				}
			}
			break;

		case 1:
			for (uint8_t i = 0; i < 8; i++) {
				if (segAlph[num] & (1 << i)) {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_SET);
				}
				else {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
				}
			}
			break;

		case 2:
			for (uint8_t i = 0; i < 8; i++) {
				HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
			}
			break;
	}
}

// FND 출력 함수, select 0 숫자 / 1 영문 / 2 초기화, num 배열 번호
void fndDisplay_CA(uint8_t select, uint8_t num) {
	switch (select) {
		case 0:
			for (uint8_t i = 0; i < 8; i++) {
				if (~segNum[num] & (1 << i)) {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_SET);
				}
				else {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
				}
			}
			break;

		case 1:
			for (uint8_t i = 0; i < 8; i++) {
				if (~segAlph[num] & (1 << i)) {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_SET);
				}
				else {
					HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
				}
			}
			break;

		case 2:
			for (uint8_t i = 0; i < 8; i++) {
				HAL_GPIO_WritePin(fnd[i].port, fnd[i].pinNumber, GPIO_PIN_RESET);
			}
			break;
	}
}