/PIC Stuff/Cerebot_32MX7_LED_Cube/defines.h |
---|
8,8 → 8,8 |
#include <stdint.h> |
// Uncomment ONE of the following: |
#define CEREBOT_32MX7 |
// #define CEREBOT_MX7CK |
//#define CEREBOT_32MX7 |
#define CEREBOT_MX7CK |
#define CPU_CLOCK_HZ 80000000UL |
#define PERIPHERAL_CLOCK_HZ 80000000UL |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/Makefile-genesis.properties |
---|
1,5 → 1,5 |
# |
#Thu Mar 13 23:02:03 EDT 2014 |
#Mon Feb 24 14:18:24 EST 2014 |
default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=83f4565fa27ad9b8015f63d69ef74f66 |
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\xc32\\v1.31\\bin |
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=1f98a0eed69cb2a45c12981fa9470927 |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/configurations.xml |
---|
130,13 → 130,6 |
<property key="exclude-floating-point-library" value="false"/> |
<property key="exclude-standard-libraries" value="false"/> |
<property key="extra-lib-directories" value=""/> |
<property key="fill-flash-options-addr" value=""/> |
<property key="fill-flash-options-const" value=""/> |
<property key="fill-flash-options-how" value="0"/> |
<property key="fill-flash-options-inc-const" value="1"/> |
<property key="fill-flash-options-increment" value=""/> |
<property key="fill-flash-options-seq" value=""/> |
<property key="fill-flash-options-what" value="0"/> |
<property key="generate-16-bit-code" value="false"/> |
<property key="generate-cross-reference-file" value="false"/> |
<property key="generate-micro-compressed-code" value="false"/> |
192,6 → 185,7 |
<property key="ToolFirmwareFilePath" |
value="Press to browse for a specific firmware version"/> |
<property key="ToolFirmwareOption.UseLatestFirmware" value="true"/> |
<property key="firmware.download.all" value="false"/> |
<property key="memories.bootflash" value="false"/> |
<property key="memories.configurationmemory" value="false"/> |
<property key="memories.eeprom" value="false"/> |
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/private/configurations.xml |
---|
4,7 → 4,7 |
<defaultConf>0</defaultConf> |
<confs> |
<conf name="default" type="2"> |
<platformToolSN>:=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>8108:=<rev>0002:=<man>Digilent:=<prod>Cerebot 32MX7:=<sn>D370400:=<drv>x:=<xpt>h:=end</platformToolSN> |
<platformToolSN>:=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>8108:=<rev>0002:=<man>Digilent:=<prod>CerebotMX7CK:=<sn>D459520:=<drv>x:=<xpt>h:=end</platformToolSN> |
<languageToolchainDir>C:\Program Files (x86)\Microchip\xc32\v1.31\bin</languageToolchainDir> |
<mdbdebugger version="1"> |
<placeholder1>place holder 1</placeholder1> |
/PIC Stuff/Cerebot_32MX7_LED_Cube/ANIMATIONS.c |
---|
233,16 → 233,22 |
void Animation_Cube_In_Cube(uint16_t delay_ms) { |
uint8_t x; |
for (x = 0; x < 6; x++) { |
for (x = 0; x < 5; x++) { |
Cube_Clear(); |
if (x == 0) |
Cube_Set_Shell(0, RED); |
else if (x == 1 || x == 5) |
else if (x == 1) |
Cube_Set_Shell(1, YELLOW); |
else if (x == 2 || x == 4) |
else if (x == 2) |
Cube_Set_Shell(2, GREEN); |
else if (x == 3) |
Cube_Set_Shell(3, BLUE); |
else { |
Cube_Set_Shell(0, RED); |
Cube_Set_Shell(1, YELLOW); |
Cube_Set_Shell(2, GREEN); |
Cube_Set_Shell(3, BLUE); |
} |
Delay_MS(delay_ms); |
} |
} |
251,72 → 257,48 |
uint8_t x,i,j,k; |
for (x = 0; x < 7; x++) { |
Cube_Clear(); |
switch (x % 7) { |
case 0: |
Cube_Set_Shell(3, r, g, b); |
break; |
case 1: |
Cube_Set_Shell(2, r, g, b); |
break; |
case 2: |
Cube_Set_Shell(1, r, g, b); |
break; |
case 3: |
Cube_Set_Shell(0, r, g, b); |
break; |
case 4: |
Cube_Set_Shell(1, r, g, b); |
break; |
case 5: |
Cube_Set_Shell(2, r, g, b); |
break; |
case 6: |
Cube_Set_Shell(3, r, g, b); |
break; |
for (i = 0; i < CUBE_LAYER_COUNT; i++) { |
if ((x == 0 || x == 6)&&(i == 0 || i == 7)) { |
Cube_Set_Layer(i,r,g,b); |
} else if ((x == 1 || x == 5)&&(i == 1 || i == 6)) { |
for (j = 1; j < CUBE_ROW_COUNT-1; j++) |
for (k = 1; k < CUBE_COLUMN_COUNT-1; k++) |
Cube_Set_Pixel(i,j,k,r,g,b); |
} else if ((x == 2 || x == 4)&&(i == 2 || i == 5)) { |
for (j = 2; j < CUBE_ROW_COUNT-2; j++) |
for (k = 2; k < CUBE_COLUMN_COUNT-2; k++) |
Cube_Set_Pixel(i,j,k,r,g,b); |
} else if ((x == 3)&&(i == 3 || i == 4)) { |
for (j = 3; j < CUBE_ROW_COUNT-3; j++) |
for (k = 3; k < CUBE_COLUMN_COUNT-3; k++) |
Cube_Set_Pixel(i,j,k,r,g,b); |
} |
if ((x == 0 || x == 6)&&(i > 0 && i < 8)) { |
for (j = 0; j < 8; j++) { |
Cube_Set_Pixel(i,j,0,r,g,b); |
Cube_Set_Pixel(i,j,7,r,g,b); |
Cube_Set_Pixel(i,0,j,r,g,b); |
Cube_Set_Pixel(i,7,j,r,g,b); |
} |
} |
if ((x == 1 || x == 5)&&(i > 1 && i < 7)) { |
for (j = 1; j < 7; j++) { |
Cube_Set_Pixel(i,j,1,r,g,b); |
Cube_Set_Pixel(i,j,6,r,g,b); |
Cube_Set_Pixel(i,1,j,r,g,b); |
Cube_Set_Pixel(i,6,j,r,g,b); |
} |
} |
if ((x == 2 || x == 4)&&(i > 2 && i < 6)) { |
for (j = 2; j < 6; j++) { |
Cube_Set_Pixel(i,j,2,r,g,b); |
Cube_Set_Pixel(i,j,5,r,g,b); |
Cube_Set_Pixel(i,2,j,r,g,b); |
Cube_Set_Pixel(i,5,j,r,g,b); |
} |
} |
} |
// for (i = 0; i < CUBE_LAYER_COUNT; i++) { |
// if ((x == 0 || x == 6)&&(i == 0 || i == 7)) { |
// Cube_Set_Layer(i,r,g,b); |
// } else if ((x == 1 || x == 5)&&(i == 1 || i == 6)) { |
// for (j = 1; j < CUBE_ROW_COUNT-1; j++) |
// for (k = 1; k < CUBE_COLUMN_COUNT-1; k++) |
// Cube_Set_Pixel(i,j,k,r,g,b); |
// } else if ((x == 2 || x == 4)&&(i == 2 || i == 5)) { |
// for (j = 2; j < CUBE_ROW_COUNT-2; j++) |
// for (k = 2; k < CUBE_COLUMN_COUNT-2; k++) |
// Cube_Set_Pixel(i,j,k,r,g,b); |
// } else if ((x == 3)&&(i == 3 || i == 4)) { |
// for (j = 3; j < CUBE_ROW_COUNT-3; j++) |
// for (k = 3; k < CUBE_COLUMN_COUNT-3; k++) |
// Cube_Set_Pixel(i,j,k,r,g,b); |
// } |
// |
// if ((x == 0 || x == 6)&&(i > 0 && i < 8)) { |
// for (j = 0; j < 8; j++) { |
// Cube_Set_Pixel(i,j,0,r,g,b); |
// Cube_Set_Pixel(i,j,7,r,g,b); |
// Cube_Set_Pixel(i,0,j,r,g,b); |
// Cube_Set_Pixel(i,7,j,r,g,b); |
// } |
// } |
// if ((x == 1 || x == 5)&&(i > 1 && i < 7)) { |
// for (j = 1; j < 7; j++) { |
// Cube_Set_Pixel(i,j,1,r,g,b); |
// Cube_Set_Pixel(i,j,6,r,g,b); |
// Cube_Set_Pixel(i,1,j,r,g,b); |
// Cube_Set_Pixel(i,6,j,r,g,b); |
// } |
// } |
// if ((x == 2 || x == 4)&&(i > 2 && i < 6)) { |
// for (j = 2; j < 6; j++) { |
// Cube_Set_Pixel(i,j,2,r,g,b); |
// Cube_Set_Pixel(i,j,5,r,g,b); |
// Cube_Set_Pixel(i,2,j,r,g,b); |
// Cube_Set_Pixel(i,5,j,r,g,b); |
// } |
// } |
// } |
Delay_MS(delay_ms); |
} |
} |
324,90 → 306,60 |
void Animation_Double_Rotation(uint16_t delay_ms) { |
Cube_Clear(); |
uint8_t x,y,z; |
for (z = 0; z < 3; z++) { |
switch (z % 3) { |
case 0: |
for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
Cube_Set_Pixel(y,0,0,RED); |
Cube_Set_Pixel(y,1,1,RED); |
Cube_Set_Pixel(y,2,2,RED); |
Cube_Set_Pixel(y,3,3,RED); |
Cube_Set_Pixel(y,4,4,RED); |
Cube_Set_Pixel(y,5,5,RED); |
Cube_Set_Pixel(y,6,6,RED); |
Cube_Set_Pixel(y,7,7,RED); |
} |
break; |
case 1: |
for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
Cube_Set_Pixel(y,0,0,GREEN); |
Cube_Set_Pixel(y,1,1,GREEN); |
Cube_Set_Pixel(y,2,2,GREEN); |
Cube_Set_Pixel(y,3,3,GREEN); |
Cube_Set_Pixel(y,4,4,GREEN); |
Cube_Set_Pixel(y,5,5,GREEN); |
Cube_Set_Pixel(y,6,6,GREEN); |
Cube_Set_Pixel(y,7,7,GREEN); |
} |
break; |
case 2: |
for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
Cube_Set_Pixel(y,0,0,BLUE); |
Cube_Set_Pixel(y,1,1,BLUE); |
Cube_Set_Pixel(y,2,2,BLUE); |
Cube_Set_Pixel(y,3,3,BLUE); |
Cube_Set_Pixel(y,4,4,BLUE); |
Cube_Set_Pixel(y,5,5,BLUE); |
Cube_Set_Pixel(y,6,6,BLUE); |
Cube_Set_Pixel(y,7,7,BLUE); |
} |
break; |
} |
for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
Cube_Set_Pixel(y,0,0,RED); |
Cube_Set_Pixel(y,1,1,ORANGE); |
Cube_Set_Pixel(y,2,2,YELLOW); |
Cube_Set_Pixel(y,3,3,GREEN); |
Cube_Set_Pixel(y,4,4,TEAL); |
Cube_Set_Pixel(y,5,5,BLUE); |
Cube_Set_Pixel(y,6,6,PURPLE); |
Cube_Set_Pixel(y,7,7,WHITE); |
for (x = 0; x < 28; x++) { |
Delay_MS(delay_ms); |
Cube_Rotate(0); |
} |
} |
for (x = 0; x < 28; x++) { |
Delay_MS(delay_ms); |
Cube_Rotate(0); |
} |
} |
// for (z = 0; z < 3; z++) { |
// switch (z % 3) { |
// case 0: |
// for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
// Cube_Set_Pixel(y,0,0,RED); |
// Cube_Set_Pixel(y,1,1,RED); |
// Cube_Set_Pixel(y,2,2,RED); |
// Cube_Set_Pixel(y,3,3,RED); |
// Cube_Set_Pixel(y,4,4,RED); |
// Cube_Set_Pixel(y,5,5,RED); |
// Cube_Set_Pixel(y,6,6,RED); |
// Cube_Set_Pixel(y,7,7,RED); |
// } |
// break; |
// case 1: |
// for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
// Cube_Set_Pixel(y,0,0,GREEN); |
// Cube_Set_Pixel(y,1,1,GREEN); |
// Cube_Set_Pixel(y,2,2,GREEN); |
// Cube_Set_Pixel(y,3,3,GREEN); |
// Cube_Set_Pixel(y,4,4,GREEN); |
// Cube_Set_Pixel(y,5,5,GREEN); |
// Cube_Set_Pixel(y,6,6,GREEN); |
// Cube_Set_Pixel(y,7,7,GREEN); |
// } |
// break; |
// case 2: |
// for (y = 0; y < CUBE_LAYER_COUNT; y++) { |
// Cube_Set_Pixel(y,0,0,BLUE); |
// Cube_Set_Pixel(y,1,1,BLUE); |
// Cube_Set_Pixel(y,2,2,BLUE); |
// Cube_Set_Pixel(y,3,3,BLUE); |
// Cube_Set_Pixel(y,4,4,BLUE); |
// Cube_Set_Pixel(y,5,5,BLUE); |
// Cube_Set_Pixel(y,6,6,BLUE); |
// Cube_Set_Pixel(y,7,7,BLUE); |
// } |
// break; |
// } |
// |
// for (x = 0; x < 28; x++) { |
// Delay_MS(delay_ms); |
// Cube_Rotate(0); |
// } |
// } |
//} |
void Animation_Wave1(uint16_t delay_ms) { |
uint8_t i, j; |
static uint8_t data[8]; |
uint32_t r; |
uint8_t data[8]; |
for (i = 0; i < 16; i++) { |
for (j = 0; j < 8; j++) { |
r = rand(); |
if (r % 3 == 0) { |
// Increase |
data[j] = (data[j] == CUBE_LAYER_COUNT - 1) ? data[j] : data[j] + 1; |
} else if (r % 3 == 1) { |
// Decrease |
data[j] = (data[j] == 0) ? data[j] : data[j] - 1; |
} else { |
// No change |
data[j] = data[j]; |
} |
} |
for (j = 0; j < 8; j++) |
data[j] = rand() % 9; |
Cube_Shift_Waterfall(data); |
Delay_MS(delay_ms); |
} |
415,23 → 367,11 |
void Animation_Wave2(uint16_t delay_ms) { |
uint8_t i, j; |
static uint8_t data[8]; |
uint32_t r; |
uint8_t data[8]; |
for (i = 0; i < 16; i++) { |
for (j = 0; j < 8; j++) { |
r = rand(); |
if (r % 3 == 0) { |
// Increase |
data[j] = (data[j] == CUBE_LAYER_COUNT - 1) ? data[j] : data[j] + 1; |
} else if (r % 3 == 1) { |
// Decrease |
data[j] = (data[j] == 0) ? data[j] : data[j] - 1; |
} else { |
// No change |
data[j] = data[j]; |
} |
} |
for (j = 0; j < 8; j++) |
data[j] = rand() % 9; |
Cube_Shift_Waterfall2(data); |
Delay_MS(delay_ms); |
} |
/PIC Stuff/Cerebot_32MX7_LED_Cube/main.c |
---|
190,7 → 190,7 |
// Initialize controllers |
CONTROLLER_DATA ctrl_data; |
Controller_Init(&ctrl_data); |
Controller_Init(&ctrl_data, NULL); |
// Initialize the Ethernet module |
if (op_state == BOARD_MODE_ETHERNET) { |
214,7 → 214,7 |
Idle_Animation_Sequence(); |
break; |
case BOARD_MODE_SNAKE:; |
Controller_Init(&ctrl_data); |
Controller_Init(&ctrl_data, &Snake_Update_Direction); |
TIMER4_Init(NULL, &Controller_Update, NULL, 0); |
TIMER4_Start(); |
Snake_Init(&snake_data); |
221,7 → 221,7 |
Snake_Main(); |
break; |
case BOARD_MODE_TRON: |
Controller_Init(&ctrl_data); |
Controller_Init(&ctrl_data, &Tron_Update_Direction); |
TIMER4_Init(NULL, &Controller_Update, NULL, 0); |
TIMER4_Start(); |
Tron_Init(&tron_data); |
293,8 → 293,6 |
Animation_Cube_In_Cube(300); |
Animation_Double_Rotation(30); |
Animation_Double_Rotation(30); |
Animation_Double_Rotation(30); |
Animation_Double_Rotation(30); |
Animation_Pseudo_Random_Colors(300); |
Animation_Pseudo_Random_Colors(300); |
Animation_Pseudo_Random_Colors(300); |
/PIC Stuff/Cerebot_32MX7_LED_Cube/ANIMATIONS.h |
---|
10,7 → 10,6 |
void Animation_Pseudo_Random_Colors(uint16_t delay_ms); |
void Animation_Random_Colors(uint16_t delay_ms); |
void Animation_Cube_In_Cube(uint16_t delay_ms); |
void Animation_Cube_In_Out(uint16_t delay_ms, uint16_t r, uint16_t g, uint16_t b); |
void Animation_Double_Rotation(uint16_t delay_ms); |
void Animation_Wave1(uint16_t delay_ms); |
void Animation_Wave2(uint16_t delay_ms); |
/PIC Stuff/Cerebot_32MX7_LED_Cube/CONTROLLERS.c |
---|
4,58 → 4,24 |
static CONTROLLER_DATA *ctrl_data_p; |
void Controller_Init(CONTROLLER_DATA *data) { |
void Controller_Init(CONTROLLER_DATA *data, |
void (*btn_change_callback)(uint8_t, uint8_t)) { |
ctrl_data_p = data; |
// Variable initialization |
int i; |
for (i = 0; i < CONTROLLER_MAX_COUNT; i++) { |
ctrl_data_p->connected_controllers[i] = 0x0; |
ctrl_data_p->led_status[i][0] = 0x0; |
ctrl_data_p->led_status[i][1] = 0x0; |
ctrl_data_p->btn_prev[i] = 0x0; |
ctrl_data_p->btn_last[i] = 0x0; |
} |
ctrl_data_p->btn_change_callback = btn_change_callback; |
ctrl_data_p->ctrl_1_connected = 0; |
ctrl_data_p->ctrl_1_buttons_prev = CONTROLLER_BTN_DEFAULT; |
ctrl_data_p->ctrl_1_leds = CONTROLLER_LED_DEFAULT; |
ctrl_data_p->ctrl_1_active = 0; |
ctrl_data_p->connected_count = 0x0; |
// Poll to see which controllers are connected |
Controller_Poll_Connected(); |
ctrl_data_p->ctrl_2_connected = 0; |
ctrl_data_p->ctrl_2_buttons_prev = CONTROLLER_BTN_DEFAULT; |
ctrl_data_p->ctrl_2_leds = CONTROLLER_LED_DEFAULT; |
ctrl_data_p->ctrl_2_active = 0; |
} |
void Controller_Poll_Connected(void) { |
uint8_t buffer[2] = {CONTROLLER_CMD_RESET}; |
uint8_t result, length, i; |
uint8_t address = CONTROLLER_PREFIX_ADDRESS + CONTROLLER_START_ADDRESS; |
// Attempt to contact each controller to see if its connected |
for (i = 0; i < CONTROLLER_MAX_COUNT; i++) { |
// I2C1_Master_Send(address + i, buffer, 1); |
// do { |
// result = I2C1_Get_Status(); |
// } while (!result); |
// if (result == I2C1_SEND_OK) { |
// // If a controller is connected, save its address |
// ctrl_data_p->connected_controllers[ctrl_data_p->connected_count] |
// = address + i; |
// ctrl_data_p->connected_count++; |
// } |
I2C1_Master_Restart(address + i, CONTROLLER_CMD_READ, 1); |
do { |
result = I2C1_Get_Status(); |
} while (!result); |
if (result == I2C1_RECV_OK) { |
length = I2C1_Read_Buffer(buffer); |
// If a controller is connected, save its address |
ctrl_data_p->connected_controllers[ctrl_data_p->connected_count] |
= address + i; |
ctrl_data_p->connected_count++; |
} |
} |
} |
void Controller_Update(void) { |
/* |
uint8_t buffer[2]; |
uint8_t result, length; |
uint8_t ctrl_1_btn = 0, ctrl_2_btn = 0; |
160,21 → 126,20 |
(*ctrl_data_p->btn_change_callback)(ctrl_1_btn, ctrl_2_btn); |
} |
} |
*/ |
} |
void Controller_Set_Leds(uint8_t controller, uint16_t value) { |
// ctrl_data_p->ctrl_1_leds = ctrl_1; |
// ctrl_data_p->ctrl_2_leds = ctrl_2; |
void Controller_Set_Leds(uint8_t ctrl_1, uint8_t ctrl_2) { |
ctrl_data_p->ctrl_1_leds = ctrl_1; |
ctrl_data_p->ctrl_2_leds = ctrl_2; |
} |
uint8_t Controller_Query(uint8_t controller) { |
// // Returns the active status of attached controllers |
// if (ctrl_data_p->ctrl_1_active && ctrl_data_p->ctrl_2_active) |
// return 0x3; |
// else if (ctrl_data_p->ctrl_1_active) |
// return 0x1; |
// else if (ctrl_data_p->ctrl_2_active) |
// return 0x2; |
// return 0; |
uint8_t Controller_Query(void) { |
// Returns the active status of attached controllers |
if (ctrl_data_p->ctrl_1_active && ctrl_data_p->ctrl_2_active) |
return 0x3; |
else if (ctrl_data_p->ctrl_1_active) |
return 0x1; |
else if (ctrl_data_p->ctrl_2_active) |
return 0x2; |
return 0; |
} |
/PIC Stuff/Cerebot_32MX7_LED_Cube/CONTROLLERS.h |
---|
1,33 → 1,35 |
#ifndef CONTROLLERS_H |
#define CONTROLLERS_H |
#define CONTROLLER_CMD_READ 0xA |
#define CONTROLLER_CMD_WRITE 0xB |
#define CONTROLLER_CMD_RESET 0xC |
#define CONTROLLER_READ 0xA |
#define CONTROLLER_WRITE 0xB |
#define CONTROLLER_BTN_DEFAULT 0xC0 |
#define CONTROLLER_LED_DEFAULT 0x00 |
#define CONTROLLER_PREFIX_ADDRESS 0xA0 |
#define CONTROLLER_START_ADDRESS 0x01 |
#define CONTROLLER_END_ADDRESS 0x08 |
#define CONTROLLER_1_ADDRESS 0x24 |
#define CONTROLLER_2_ADDRESS 0x25 |
#define CONTROLLER_MAX_COUNT 8 |
typedef struct { |
uint8_t connected_controllers[CONTROLLER_MAX_COUNT]; |
uint8_t led_status[CONTROLLER_MAX_COUNT][2]; |
uint8_t btn_prev[CONTROLLER_MAX_COUNT]; |
uint8_t btn_last[CONTROLLER_MAX_COUNT]; |
void (*btn_change_callback)(uint8_t ctrl_1, uint8_t ctrl_2); |
uint8_t connected_count; |
uint8_t ctrl_1_connected; |
uint8_t ctrl_1_buttons_prev; |
uint8_t ctrl_1_leds; |
uint8_t ctrl_1_active; |
uint8_t ctrl_2_connected; |
uint8_t ctrl_2_buttons_prev; |
uint8_t ctrl_2_leds; |
uint8_t ctrl_2_active; |
} CONTROLLER_DATA; |
void Controller_Init(CONTROLLER_DATA *data); |
void Controller_Poll_Connected(void); |
void Controller_Init(CONTROLLER_DATA *data, |
void (*btn_change_callback)(uint8_t, uint8_t)); |
void Controller_Update(void); |
void Controller_Set_Leds(uint8_t controller, uint16_t value); |
uint8_t Controller_Query(uint8_t controller); |
void Controller_Set_Leds(uint8_t ctrl_1, uint8_t ctrl_2); |
void Controller_Btn_Change(void (*callback)(uint8_t, uint8_t)); |
uint8_t Controller_Query(void); |
#endif /* CONTROLLERS_H */ |