is this an interface?

master
Dmitry Maylarov 7 years ago
parent 2f796255f6
commit c1f541ad7e

@ -73,7 +73,7 @@
#define configUSE_TICKLESS_IDLE 1 #define configUSE_TICKLESS_IDLE 1
#define configUSE_IDLE_HOOK 0 #define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0 #define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ 48000000 #define configCPU_CLOCK_HZ 24000000
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES 5 #define configMAX_PRIORITIES 5
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )

@ -18,5 +18,6 @@ void LCD_SendData(LCD_HandleTypeDef *lcd, uint8_t data);
void LCD_Init(LCD_HandleTypeDef *lcd); void LCD_Init(LCD_HandleTypeDef *lcd);
void LCD_SendChar(LCD_HandleTypeDef *lcd, char chr); void LCD_SendChar(LCD_HandleTypeDef *lcd, char chr);
void LCD_SendString(LCD_HandleTypeDef *lcd, char *str); void LCD_SendString(LCD_HandleTypeDef *lcd, char *str);
void LCD_MoveHome(LCD_HandleTypeDef *lcd);
#endif #endif

@ -71,6 +71,7 @@ void vTaskConfig(void *parameter);
void vTaskTimerSetup(void *parameter); void vTaskTimerSetup(void *parameter);
void vTaskTurn(void *parameter); void vTaskTurn(void *parameter);
void vTaskTurnEnd(void *parameter); void vTaskTurnEnd(void *parameter);
void vTaskTurnTimeUpdate(void *parameter);
void vTimerCallback(TimerHandle_t xTimer); void vTimerCallback(TimerHandle_t xTimer);
/* USER CODE END EFP */ /* USER CODE END EFP */

@ -6,11 +6,12 @@ void InitGameEngine() {
game.timerValue = game.turnTime; game.timerValue = game.turnTime;
game.countScores = false; game.countScores = false;
game.activePlayers = 0; game.activePlayers = 0;
game.currentPlayer = 0; game.currentPlayer = 1;
game.turnTime = TIMER_MAX / 2; game.turnTime = TIMER_MAX / 2;
game.timerValue = game.turnTime; game.timerValue = game.turnTime;
for (int i=0; i<MAX_PLAYERS; i++) for (int i=0; i<MAX_PLAYERS+1; i++)
game.scores[i] = -1; game.scores[i] = 999;
game.scores[1] = 0;
} }
void DecrementTurnTime() { void DecrementTurnTime() {
@ -30,25 +31,17 @@ void IncrementTurnTime() {
} }
void AddPlayer() { void AddPlayer() {
if (game.activePlayers < MAX_PLAYERS) { if (game.activePlayers <= MAX_PLAYERS) {
game.scores[game.activePlayers++] = 0; game.scores[++game.activePlayers] = 0;
} }
} }
void RemovePlayer() { void RemovePlayer() {
if (game.activePlayers > 0) { if (game.activePlayers > 1) {
game.scores[game.activePlayers--] = -1; game.scores[--game.activePlayers] = -1;
} }
} }
uint32_t GetCurrentPlayer() {
return game.currentPlayer;
}
uint32_t GetTimerValue() {
return game.timerValue;
}
void ChangeScore(int8_t delta) { void ChangeScore(int8_t delta) {
game.scores[game.currentPlayer] += delta; game.scores[game.currentPlayer] += delta;
} }
@ -58,6 +51,6 @@ void ResetTurnTimer() {
} }
void NextPlayer() { void NextPlayer() {
game.currentPlayer = (game.currentPlayer + 1) % game.activePlayers; game.currentPlayer = ((game.currentPlayer) % (game.activePlayers+1) + 1 );
ResetTurnTimer(); ResetTurnTimer();
} }

@ -101,6 +101,7 @@ void LCD_MoveCursor(LCD_HandleTypeDef *lcd, uint8_t line, uint8_t column) {
void LCD_MoveHome(LCD_HandleTypeDef *lcd) { void LCD_MoveHome(LCD_HandleTypeDef *lcd) {
LCD_SendCommand(lcd, LCD_RETURNHOME ); LCD_SendCommand(lcd, LCD_RETURNHOME );
vTaskDelay(2); vTaskDelay(2);
LCD_SendCommand(lcd, LCD_CLEARDISPLAY);
} }
void LCD_Init(LCD_HandleTypeDef *lcd) { void LCD_Init(LCD_HandleTypeDef *lcd) {

@ -99,6 +99,7 @@ Button *bigButton = &buttons[0];
TimerHandle_t secondsTimerHandle = NULL; TimerHandle_t secondsTimerHandle = NULL;
TaskHandle_t xMusicHandle = NULL; TaskHandle_t xMusicHandle = NULL;
TaskHandle_t xLCDUpdaterHandle = NULL;
asm( asm(
"tetris:\n\t" "tetris:\n\t"
@ -550,36 +551,72 @@ void vTaskConfig(void *parameter) {
vTaskDelete(NULL); vTaskDelete(NULL);
} }
void vTaskTurn(void *parameter) { void vTaskTurnTimeUpdate(void *parameter) {
xTimerReset(secondsTimerHandle, 0);
LCD_MoveHome(&hlcd);
TickType_t xLastWakeTime; TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount(); xLastWakeTime = xTaskGetTickCount();
while (1) while (1)
{ {
if (plusButton->pressed) { LCD_MoveCursor(&hlcd, 0, 0);
xTaskCreate(vTaskTimerSetup, "TaskTimerSetup", configMINIMAL_STACK_SIZE, NULL, 1, NULL); sprintf(lcdBuffer, " %1ld:%02ld ",game.timerValue / 60, game.timerValue % 60);
break; LCD_SendString(&hlcd, lcdBuffer);
}
else if (minusButton->pressed) { vTaskDelayUntil(&xLastWakeTime,1000);
xTaskCreate(vTaskConfig, "Config", configMINIMAL_STACK_SIZE, NULL, 1, NULL); }
break; }
}
else if (bigButton->pressed) { void vTaskTurn(void *parameter) {
xTaskCreate(vTaskTurnEnd, "TaskTurnEnd", configMINIMAL_STACK_SIZE, NULL, 1, NULL); xTaskCreate(vTaskTurnTimeUpdate, "TimeUpdate", configMINIMAL_STACK_SIZE, NULL, 1, &xLCDUpdaterHandle);
break; vTaskDelay(1);
} TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
else if(game.timerValue == 0 && xMusicHandle == NULL)
{ xTimerReset(secondsTimerHandle, 0);
xTaskCreate(vTaskOvertime, "vTaskOvertime", configMINIMAL_STACK_SIZE, NULL, 1, &xMusicHandle); LCD_MoveHome(&hlcd);
}
vTaskDelayUntil(&xLastWakeTime,100);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); if (game.countScores)
{
memset(&lcdBuffer,'\0', sizeof(lcdBuffer));
LCD_MoveCursor(&hlcd, 2, 1);
for (int i = 1; i <= game.activePlayers; i++)
{
char tmp[8];
sprintf(tmp, "%1d:%3ld|", i, game.scores[i]);
strcat(lcdBuffer, tmp);
if (strlen(lcdBuffer) > (LCD_COLS-6))
{
LCD_SendString(&hlcd, lcdBuffer);
memset(&lcdBuffer,'\0', sizeof(lcdBuffer));
LCD_MoveCursor(&hlcd, 3, 1);
}
}
LCD_SendString(&hlcd, lcdBuffer);
memset(&lcdBuffer,'\0', sizeof(lcdBuffer));
}
LCD_MoveCursor(&hlcd, 1, 0);
sprintf(lcdBuffer, "Player: %1d Score: %3ld",game.currentPlayer, game.scores[game.currentPlayer]);
LCD_SendString(&hlcd, lcdBuffer);
while (1)
{
if (xSemaphoreTake(buttonPressed, portMAX_DELAY) == pdPASS )
{
if (plusButton->pressed) {
xTaskCreate(vTaskTimerSetup, "TaskTimerSetup", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
break;
}
else if (minusButton->pressed) {
xTaskCreate(vTaskConfig, "Config", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
break;
}
else if (bigButton->pressed) {
xTaskCreate(vTaskTurnEnd, "TaskTurnEnd", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
break;
}
}
vTaskDelayUntil(&xLastWakeTime,100);
// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
} }
xTimerStop(secondsTimerHandle, 0); xTimerStop(secondsTimerHandle, 0);
ResetTurnTimer(); ResetTurnTimer();
@ -589,27 +626,39 @@ void vTaskTurn(void *parameter) {
MusicStop(); MusicStop();
xMusicHandle = NULL; xMusicHandle = NULL;
} }
vTaskDelete(xLCDUpdaterHandle);
vTaskDelete(NULL); vTaskDelete(NULL);
} }
void vTaskTurnEnd(void *parameter) { void vTaskTurnEnd(void *parameter) {
if (game.countScores) { if (game.countScores) {
int32_t delta = 0; int32_t delta = 0;
LCD_MoveHome(&hlcd);
LCD_MoveCursor(&hlcd, 1, 0);
sprintf(lcdBuffer, "Player: %1d Score: %3ld",game.currentPlayer, game.scores[game.currentPlayer]);
LCD_SendString(&hlcd, lcdBuffer);
while (1) { while (1) {
if (bigButton->pressed) { LCD_MoveCursor(&hlcd, 2, 0);
ChangeScore(delta); sprintf(lcdBuffer, "Result: %+4ld", delta);
break; LCD_SendString(&hlcd, lcdBuffer);
} if (xSemaphoreTake(buttonPressed, portMAX_DELAY) == pdPASS ) {
else if (plusButton->pressed) if (bigButton->pressed) {
{ ChangeScore(delta);
delta++; break;
} }
else if (minusButton->pressed) else if (plusButton->pressed)
{ {
delta--; plusButton->pressed = false;
} delta++;
vTaskDelay(10); }
} else if (minusButton->pressed)
{
minusButton->pressed = false;
delta--;
}
vTaskDelay(10);
}
}
} }
NextPlayer(); NextPlayer();
xTaskCreate(vTaskTurn, "TaskTurn", configMINIMAL_STACK_SIZE, NULL, 1, NULL); xTaskCreate(vTaskTurn, "TaskTurn", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
@ -633,6 +682,10 @@ void vTaskOvertime(void *parameter) {
void vTimerCallback(TimerHandle_t xTimer) { void vTimerCallback(TimerHandle_t xTimer) {
if (game.timerValue > 0) if (game.timerValue > 0)
game.timerValue--; game.timerValue--;
else if(game.timerValue == 0 && xMusicHandle == NULL)
{
xTaskCreate(vTaskOvertime, "vTaskOvertime", configMINIMAL_STACK_SIZE, NULL, 1, &xMusicHandle);
}
} }
void vTaskButtonPoll(void *parameter) { void vTaskButtonPoll(void *parameter) {

Loading…
Cancel
Save