/*
 * max7219.h
 *
 *  Created on: 29 січ. 2016
 *      Author: shilov
 */

#ifndef INCLUDE_MAX7219_H_
#define INCLUDE_MAX7219_H_

// symbols
// Для BCD
#define MAX7219_CHAR_MINUS	    0x0A
#define MAX7219_CHAR_E          0x0B
#define MAX7219_CHAR_H          0x0C
#define MAX7219_CHAR_L          0x0D
#define MAX7219_CHAR_P          0x0E
#define MAX7219_CHAR_BLANK      0x0F
// без кодирования
#define SYM_Gradus				0x63
#define SYM_LGradus				0x1D
#define SYM_Temp				0x0F
#define SYM_Minus				0x01
#define SYM_Minus2L				0x09
#define SYM_Minus2H				0x41
#define SYM_Minus3				0x49
#define SYM_BLANK				0x00
#define SYM_FULL				0xFF
#define SYM_H					0x37
#define SYM_H_SM				0x17
#define SYM_C					0x4E
#define SYM_C_sm				0x0D

#define MAX7219_ON				0x01
#define MAX7219_OFF				0x00
#define MAX7219_BRIGHT			0x08

// режимы работы
#define MAX7219_MODE_DECODE		0x09
#define MAX7219_MODE_INTENSITY	0x0A
#define MAX7219_MODE_SCAN_LIMIT	0x0B
#define MAX7219_MODE_POWER		0x0C
#define MAX7219_MODE_TEST		0x0F
#define MAX7219_MODE_NOOP		0x00

// соответствие разрядов
#define MAX7219_DIGIT0			0x01
#define MAX7219_DIGIT1			0x02
#define MAX7219_DIGIT2			0x03
#define MAX7219_DIGIT3			0x04
#define MAX7219_DIGIT4			0x05
#define MAX7219_DIGIT5			0x06
#define MAX7219_DIGIT6			0x07
#define MAX7219_DIGIT7			0x08

// соответсвие бит сегментам
#define SEG_A					6
#define SEG_B					5
#define SEG_C					4
#define SEG_D					3
#define SEG_E					2
#define SEG_F					1
#define SEG_G					0
#define SEG_DP					7

/*
 * Цифры для секунд "Pseudo Gray Code"
 *   0   1     2      3    4      5     6     7     8      9
 * │    ┌──   ────   ───┐    │  │   │  │  │     │        │
 * │    │               │    │  │   │  └──┘  ───┘  ────  └───
 */
// Коды GRAY для десятков секунд
#define SYM_GRAY_0x			0x02
#define SYM_GRAY_1x			0x42
#define SYM_GRAY_2x			0x40
#define SYM_GRAY_3x			0x60
#define SYM_GRAY_4x			0x20
#define SYM_GRAY_5x			0x22
const uint8_t max7219_grayH[6] = {
	SYM_GRAY_0x,
	SYM_GRAY_1x,
	SYM_GRAY_2x,
	SYM_GRAY_3x,
	SYM_GRAY_4x,
	SYM_GRAY_5x
};

// Коды GRAY для единиц секунд
#define SYM_GRAY_x0			0x04
#define SYM_GRAY_x1			0x05
#define SYM_GRAY_x2			0x01
#define SYM_GRAY_x3			0x11
#define SYM_GRAY_x4			0x10
#define SYM_GRAY_x5			0x14
#define SYM_GRAY_x6			0x1C
#define SYM_GRAY_x7			0x18
#define SYM_GRAY_x8			0x08
#define SYM_GRAY_x9			0x0C
const uint8_t max7219_grayL[10] = {
	SYM_GRAY_x0,
	SYM_GRAY_x1,
	SYM_GRAY_x2,
	SYM_GRAY_x3,
	SYM_GRAY_x4,
	SYM_GRAY_x5,
	SYM_GRAY_x6,
	SYM_GRAY_x7,
	SYM_GRAY_x8,
	SYM_GRAY_x9
};
// final second code
#define SYM_GRAY_CODE(sec)	(max7219_grayH[sec/10] | max7219_grayL[sec%10])

/*
 * Цифры для секунд "Pseudo Bin Code"
 *   0   1   2      3     4     5     6     7     8     9
 *     │    ────   ┌──      │  │  │  ───┐  ┌──┐        │
 *     │           │        │  │  │     │  │  │  ────  └───
 */
// Коды BIN для десятков секунд
#define SYM_BIN_0x			0x00
#define SYM_BIN_1x			0x02
#define SYM_BIN_2x			0x40
#define SYM_BIN_3x			0x42
#define SYM_BIN_4x			0x20
#define SYM_BIN_5x			0x22
const uint8_t max7219_binH[6] = {
	SYM_BIN_0x,
	SYM_BIN_1x,
	SYM_BIN_2x,
	SYM_BIN_3x,
	SYM_BIN_4x,
	SYM_BIN_5x
};

// Коды BIN для единиц секунд
#define SYM_BIN_x0			0x00
#define SYM_BIN_x1			0x04
#define SYM_BIN_x2			0x01
#define SYM_BIN_x3			0x05
#define SYM_BIN_x4			0x10
#define SYM_BIN_x5			0x14
#define SYM_BIN_x6			0x11
#define SYM_BIN_x7			0x15
#define SYM_BIN_x8			0x08
#define SYM_BIN_x9			0x0C
const uint8_t max7219_BINL[10] = {
	SYM_BIN_x0,
	SYM_BIN_x1,
	SYM_BIN_x2,
	SYM_BIN_x3,
	SYM_BIN_x4,
	SYM_BIN_x5,
	SYM_BIN_x6,
	SYM_BIN_x7,
	SYM_BIN_x8,
	SYM_BIN_x9
};
// final second BIN code
#define SYM_BIN_CODE(sec)	(max7219_binH[sec/10] | max7219_binL[sec%10])


void MAX7219_writeData (uint8_t data_register, uint8_t data);
void MAX7219_Init (void);
void MAX7219_FillMinus(void);

#endif /* INCLUDE_MAX7219_H_ */
