Blame | Last modification | View Log | Download | RSS feed
#include "defines.h"#include "CONTROLLERS.h"#include "I2C1.h"static CONTROLLER_DATA *ctrl_data_p;static BOARD_STATE *board_state_p;void Controller_Init(CONTROLLER_DATA *data, BOARD_STATE *state,void (*btn_change_callback)(uint8_t, uint8_t)) {ctrl_data_p = data;board_state_p = state;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->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_Update(void) {uint8_t buffer[2];uint8_t result, length;uint8_t ctrl_1_btn = 0, ctrl_2_btn = 0;// Read button values from controllersI2C1_Master_Restart(CONTROLLER_1_ADDRESS, CONTROLLER_READ, 1);do {result = I2C1_Get_Status();} while (!result);if (result == I2C1_RECV_OK) {// Indicate that controller 1 is connectedLED1_LAT = 1;ctrl_data_p->ctrl_1_connected = 1;length = I2C1_Read_Buffer(buffer);buffer[0] = ~buffer[0];// Button change detectedif (ctrl_data_p->ctrl_1_buttons_prev != buffer[0]) {// Check if a button has been pressed since startupif (!ctrl_data_p->ctrl_1_active) {ctrl_data_p->ctrl_1_active = 1;}// Figure out which button has changedctrl_1_btn = ctrl_data_p->ctrl_1_buttons_prev ^ buffer[0];// Save the button if it went from unpressed -> pressedctrl_1_btn &= buffer[0];}ctrl_data_p->ctrl_1_buttons_prev = buffer[0];} else {LED1_LAT = 0;ctrl_data_p->ctrl_1_connected = 0;ctrl_data_p->ctrl_1_active = 0;}I2C1_Master_Restart(CONTROLLER_2_ADDRESS, CONTROLLER_READ, 1);do {result = I2C1_Get_Status();} while (!result);if (result == I2C1_RECV_OK) {// Indicate that controller 2 is connectedLED2_LAT = 1;ctrl_data_p->ctrl_2_connected = 1;length = I2C1_Read_Buffer(buffer);buffer[0] = ~buffer[0];// Button change detectedif (ctrl_data_p->ctrl_2_buttons_prev != buffer[0]) {// Check if a button has been pressed since startupif (!ctrl_data_p->ctrl_2_active) {ctrl_data_p->ctrl_2_active = 1;}// Figure out which button has changedctrl_2_btn = ctrl_data_p->ctrl_2_buttons_prev ^ buffer[0];// Save the button if it went from unpressed -> pressedctrl_2_btn &= buffer[0];}ctrl_data_p->ctrl_2_buttons_prev = buffer[0];} else {LED2_LAT = 0;ctrl_data_p->ctrl_2_connected = 0;ctrl_data_p->ctrl_2_active = 0;}// Write LED values to controllersif (ctrl_data_p->ctrl_1_connected) {buffer[0] = CONTROLLER_WRITE;buffer[1] = ctrl_data_p->ctrl_1_leds;I2C1_Master_Send(CONTROLLER_1_ADDRESS, buffer, 2);do {result = I2C1_Get_Status();} while (!result);}if (ctrl_data_p->ctrl_2_connected) {buffer[0] = CONTROLLER_WRITE;buffer[1] = ctrl_data_p->ctrl_2_leds;I2C1_Master_Send(CONTROLLER_2_ADDRESS, buffer, 2);do {result = I2C1_Get_Status();} while (!result);}// If board is in an idle state and a controller is connected, switch modesif (board_state_p->cube_mode == BOARD_MODE_IDLE) {// If both controllers are active, go into game TRON modeif (ctrl_data_p->ctrl_1_active && ctrl_data_p->ctrl_2_active) {board_state_p->cube_mode = BOARD_MODE_TRON;Reset_Board();}// Otherwise if only one controller is active, go into game SNAKE modeif (ctrl_data_p->ctrl_1_active || ctrl_data_p->ctrl_2_active) {board_state_p->cube_mode = BOARD_MODE_SNAKE;Reset_Board();}}if (board_state_p->cube_mode == BOARD_MODE_SNAKE) {// If both controllers are active, go into game TRON modeif (ctrl_data_p->ctrl_1_active && ctrl_data_p->ctrl_2_active) {board_state_p->cube_mode = BOARD_MODE_TRON;Reset_Board();}}// Call the callback function if any buttons have changedif (ctrl_data_p->btn_change_callback != NULL) {if (ctrl_1_btn || ctrl_2_btn) {(*ctrl_data_p->btn_change_callback)(ctrl_1_btn, ctrl_2_btn);}}}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;}