diff --git a/2P-ProjectPong/.cproject b/2P-ProjectPong/.cproject index 101c5f3..3250365 100644 --- a/2P-ProjectPong/.cproject +++ b/2P-ProjectPong/.cproject @@ -1,258 +1,258 @@ - + - + - - - - - - + + + + + + - - - - - - - + + + + + - + - + - - - - - - + + + + + + - - - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + diff --git a/2P-ProjectPong/.mxproject b/2P-ProjectPong/.mxproject index f270f3d..3e85535 100644 --- a/2P-ProjectPong/.mxproject +++ b/2P-ProjectPong/.mxproject @@ -1,7 +1,7 @@ [PreviousGenFiles] -HeaderPath=D:/JCS/Documents/STM32_PROJECTS/2P-ProjectPong/Inc +HeaderPath=D:/JCS/Documents/GITRepos/STM32-SchoolProjects/2P-ProjectPong/Inc HeaderFiles=gpio.h;stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h;usart.h;i2c.h;quadspi.h;fsmc.h;RTE_Components.h;rng.h;tim.h; -SourcePath=D:/JCS/Documents/STM32_PROJECTS/2P-ProjectPong/Src +SourcePath=D:/JCS/Documents/GITRepos/STM32-SchoolProjects/2P-ProjectPong/Src SourceFiles=gpio.c;stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c;usart.c;i2c.c;quadspi.c;fsmc.c;rng.c;tim.c; [PreviousLibFiles] diff --git a/2P-ProjectPong/.project b/2P-ProjectPong/.project index eb580bd..600a64e 100644 --- a/2P-ProjectPong/.project +++ b/2P-ProjectPong/.project @@ -1,7 +1,7 @@ 2P-ProjectPong - + @@ -28,7 +28,7 @@ Utilities 2 - PARENT-3-PROJECT_LOC/STM32Cube/Repository/STM32Cube_FW_F4_V1.23.0/Utilities + PARENT-3-PROJECT_LOC/STM32Cube/Repository/STM32Cube_FW_F4_V1.23.0/Utilities diff --git a/2P-ProjectPong/2P-ProjectPong.ioc b/2P-ProjectPong/2P-ProjectPong.ioc index d19655c..1730d2b 100644 --- a/2P-ProjectPong/2P-ProjectPong.ioc +++ b/2P-ProjectPong/2P-ProjectPong.ioc @@ -3,7 +3,7 @@ File.Version=6 KeepUserPlacement=false Mcu.Family=STM32F4 Mcu.IP0=FSMC -Mcu.IP1=I2C1 +Mcu.IP1=I2C2 Mcu.IP2=NVIC Mcu.IP3=QUADSPI Mcu.IP4=RCC @@ -108,7 +108,7 @@ NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true -NVIC.I2C1_EV_IRQn=true\:0\:0\:true\:false\:true\:true +NVIC.I2C2_EV_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true @@ -168,6 +168,7 @@ PB1.Signal=S_DATAIN0DFSDM1 PB10.GPIOParameters=GPIO_Label PB10.GPIO_Label=I2C2_SCL PB10.Locked=true +PB10.Mode=I2C PB10.Signal=I2C2_SCL PB11.GPIOParameters=GPIO_Label PB11.GPIO_Label=M2_CKIN @@ -197,16 +198,15 @@ PB5.Signal=I2S3_SD PB6.GPIOParameters=GPIO_Label PB6.GPIO_Label=I2C1_SCL [WM8994ECS/R_SCLK] PB6.Locked=true -PB6.Mode=I2C PB6.Signal=I2C1_SCL PB7.GPIOParameters=GPIO_Label PB7.GPIO_Label=I2C1_SDA [WM8994ECS/R_SDA] PB7.Locked=true -PB7.Mode=I2C PB7.Signal=I2C1_SDA PB9.GPIOParameters=GPIO_Label PB9.GPIO_Label=I2C2_SDA PB9.Locked=true +PB9.Mode=I2C PB9.Signal=I2C2_SDA PC10.GPIOParameters=GPIO_Label PC10.GPIO_Label=uSD_D2 @@ -475,7 +475,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_FSMC_Init-FSMC-false-HAL-true,6-MX_QUADSPI_Init-QUADSPI-false-HAL-true,7-MX_RNG_Init-RNG-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FSMC_Init-FSMC-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_RNG_Init-RNG-false-HAL-true,7-MX_TIM6_Init-TIM6-false-HAL-true,8-MX_I2C2_Init-I2C2-false-HAL-true RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=16000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 diff --git a/2P-ProjectPong/Inc/i2c.h b/2P-ProjectPong/Inc/i2c.h index 0393ede..047408b 100644 --- a/2P-ProjectPong/Inc/i2c.h +++ b/2P-ProjectPong/Inc/i2c.h @@ -60,13 +60,13 @@ /* USER CODE END Includes */ -extern I2C_HandleTypeDef hi2c1; +extern I2C_HandleTypeDef hi2c2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ -void MX_I2C1_Init(void); +void MX_I2C2_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/2P-ProjectPong/Inc/sensor_interface.h b/2P-ProjectPong/Inc/sensor_interface.h new file mode 100644 index 0000000..c25c71e --- /dev/null +++ b/2P-ProjectPong/Inc/sensor_interface.h @@ -0,0 +1,27 @@ +/* + * sensor_interface.h + * + * Created on: 7 déc. 2019 + * Author: JackCarterSmith + */ + +#ifndef SENSOR_INTERFACE_H_ +#define SENSOR_INTERFACE_H_ + +#include "stm32412g_discovery.h" + +#define MEMS_ADD_RD 0x00D7 +#define MEMS_ADD_WR 0x00D6 +#define CTRL1_XL_REGISTER 0x10 +#define CTRL1_OUT_REGISTER 0x11 + +typedef struct { + int16_t Pitch; + int16_t Yaw; + int16_t Roll; +}PP_GyroAnglesTypeDef; + +void initGyro(); +void getAnglesFromSensor(); + +#endif /* SENSOR_INTERFACE_H_ */ diff --git a/2P-ProjectPong/Inc/stm32f4xx_it.h b/2P-ProjectPong/Inc/stm32f4xx_it.h index 1328d8c..516fee2 100644 --- a/2P-ProjectPong/Inc/stm32f4xx_it.h +++ b/2P-ProjectPong/Inc/stm32f4xx_it.h @@ -72,7 +72,7 @@ void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); void EXTI0_IRQHandler(void); -void I2C1_EV_IRQHandler(void); +void I2C2_EV_IRQHandler(void); void TIM6_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/2P-ProjectPong/Src/game_engine.c b/2P-ProjectPong/Src/game_engine.c index 2cd87d3..5840a79 100644 --- a/2P-ProjectPong/Src/game_engine.c +++ b/2P-ProjectPong/Src/game_engine.c @@ -36,6 +36,9 @@ struct gameControlByte { } gCtrlByte; +/** + * @brief Generate new ball's pos and acc from random seed + */ void generateNewBall(Game_ModeTypdef type, uint32_t seed) { switch (type) { case MULTI_MODE: @@ -43,19 +46,20 @@ void generateNewBall(Game_ModeTypdef type, uint32_t seed) { case SOLO_MODE: default: ballDatas.posX = (seed & 0xFF) % 240; - ballDatas.posY = ((seed & 0xFF00 >> 7) % 200) + 60; + ballDatas.posY = ((seed & 0xFF00 >> 7) % 180) + 60; if (ballDatas.posX < 0) ballDatas.posX = -ballDatas.posX; if (ballDatas.posY < 0) ballDatas.posY = -ballDatas.posY; ballDatas.accX = ((seed & 0xFF0000 >> 15) % 8) + 4; ballDatas.accY = ((seed & 0xFF000000 >> 31) % 8) + 4; - //ballDatas.accX = 5; - //ballDatas.accY = 3; if (seed & 0x1) ballDatas.accX = -ballDatas.accX; if (seed & 0x2 >> 1) ballDatas.accY = -ballDatas.accY; break; } } +/** + * @brief Collision and animation engine for the ball/bar + */ void ballRayTracingEngine(PP_BarTypeDef *barDatas) { if (ballDatas.posX + ballDatas.accX > 236) { ballDatas.posX = 236; @@ -84,20 +88,26 @@ void ballRayTracingEngine(PP_BarTypeDef *barDatas) { } } +/** + * @brief Refresh ball displayed on screen + */ void updateBallDisplay() { BSP_LCD_SetTextColor(LCD_COLOR_BLACK); BSP_LCD_FillRect(displayedBall.posX, displayedBall.posY, 4, 4); //Clean previous ball BSP_LCD_SetTextColor(LCD_COLOR_WHITE); - BSP_LCD_FillRect(ballDatas.posX, ballDatas.posY, 4, 4); //Draw the ball !!! + BSP_LCD_FillRect(ballDatas.posX, ballDatas.posY, 4, 4); //Draw the ball at new pos displayedBall.posX = ballDatas.posX; displayedBall.posY = ballDatas.posY; - if (ballDatas.posY == 236) displayEndMenu(); + if (ballDatas.posY >= 236) displayEndMenu(); } +/** + * @brief Refresh bar displayed on screen + */ void updatePongBar(PP_BarTypeDef *barDatas) { BSP_LCD_SetTextColor(LCD_COLOR_BLACK); - BSP_LCD_FillRect(0, BSP_LCD_GetYSize() - 12, BSP_LCD_GetXSize(), 7); //Clean previous ball + BSP_LCD_FillRect(0, BSP_LCD_GetYSize() - 12, BSP_LCD_GetXSize(), 7); //Clean previous bar BSP_LCD_SetTextColor(LCD_COLOR_WHITE); if (barDatas->pos + barDatas->acc > BSP_LCD_GetXSize() - 20) { barDatas->pos = BSP_LCD_GetXSize() - 20; @@ -106,23 +116,26 @@ void updatePongBar(PP_BarTypeDef *barDatas) { } else { barDatas->pos += barDatas->acc; } - BSP_LCD_FillRect(barDatas->pos - 20, BSP_LCD_GetYSize() - 12, 40, 7); + BSP_LCD_FillRect(barDatas->pos - 20, BSP_LCD_GetYSize() - 12, 40, 7); //Draw the bar at new pos } +/** + * @brief Refresh displayed score on game screen + */ void updateScoreArea(Game_ModeTypdef type, uint16_t newScore) { char sTextBuffer[32]; BSP_LCD_SetFont(&Font24); BSP_LCD_SetTextColor(LCD_COLOR_BLACK); - //BSP_LCD_FillRect(BSP_LCD_GetXSize() / 2 - 4 * BSP_LCD_GetFont()->Width, 1, 8 * BSP_LCD_GetFont()->Width, BSP_LCD_GetFont()->Height - 3); //Clean previous ball BSP_LCD_SetTextColor(LCD_COLOR_WHITE); sprintf(sTextBuffer, "%d", newScore); - //BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - (strlen(sTextBuffer)/2 * BSP_LCD_GetFont()->Width), 2, (uint8_t *)sTextBuffer, LEFT_MODE); BSP_LCD_DisplayStringAt(6, 2, (uint8_t *)sTextBuffer, RIGHT_MODE); - //BSP_LCD_DrawRect(BSP_LCD_GetXSize() / 2 - (4 * BSP_LCD_GetFont()->Width) - 1, 0, 8 * BSP_LCD_GetFont()->Width + 1, BSP_LCD_GetFont()->Height - 3); BSP_LCD_FillRect(10, 24, BSP_LCD_GetXSize() - 20, 1); } +/** + * @brief Get a new random number + */ uint32_t genSeed() { uint32_t tmp = 0; @@ -134,6 +147,9 @@ uint32_t genSeed() { return tmp; } +/** + * @brief Main function called when need to update screen + */ void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) { char sTextBuffer[32]; @@ -151,7 +167,7 @@ void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) { oldTicks = _t; } } else if (currGameMode == MULTI_MODE) { - + //Nothing } } else if (currMenu == MENU_MAIN || currMenu == MENU_END) { if (_t - oldTicks >= 30 || _t - oldTicks < 0) { @@ -169,6 +185,9 @@ void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) { } } +/** + * @brief Just a cool screen to display when the board start + */ void displayLoadingScreen() { char sTextBuffer[32]; @@ -208,6 +227,9 @@ void displayStartMenu(PP_HighScoresTypeDef hsDatas) { BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - 5 * 12, BSP_LCD_GetYSize() / 2 + 40, (uint8_t *)sTextBuffer, LEFT_MODE); } +/** + * @brief Generate and display new game + */ void displayGameArea(Game_ModeTypdef type, PP_BarTypeDef *_barDatas) { uint32_t seed = 0; currScore = 0; @@ -247,7 +269,7 @@ void displayEndMenu() { sprintf(sTextBuffer, "SCORE: %d", currScore); BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - (strlen(sTextBuffer)/2 * BSP_LCD_GetFont()->Width), BSP_LCD_GetYSize() / 2 - 40, (uint8_t *)sTextBuffer, LEFT_MODE); - //TODO: Save new HighScore if greather than the old one + //TODO: Save new HighScore in EEPROM if greather than the old one /* READY TO START NEW GAME! */ strcpy(sTextBuffer, "Press START\0"); diff --git a/2P-ProjectPong/Src/gpio.c b/2P-ProjectPong/Src/gpio.c index 442387d..68c4437 100644 --- a/2P-ProjectPong/Src/gpio.c +++ b/2P-ProjectPong/Src/gpio.c @@ -67,7 +67,6 @@ PA3 ------> USART2_RX PA4 ------> I2S3_WS PB1 ------> S_DATAIN0DFSDM1 - PB10 ------> I2C2_SCL PB11 ------> I2S_CKIN PB12 ------> I2S3_CK PC7 ------> I2S3_MCK @@ -83,7 +82,8 @@ PD2 ------> SDIO_CMD PB4 ------> I2S3_ext_SD PB5 ------> I2S3_SD - PB9 ------> I2C2_SDA + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA */ void MX_GPIO_Init(void) { @@ -184,14 +184,6 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - /*Configure GPIO pin : PtPin */ - GPIO_InitStruct.Pin = I2C2_SCL_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; - HAL_GPIO_Init(I2C2_SCL_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = M2_CKIN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; @@ -284,13 +276,13 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; HAL_GPIO_Init(CODEC_I2S3_SD_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pin : PtPin */ - GPIO_InitStruct.Pin = I2C2_SDA_Pin; + /*Configure GPIO pins : PBPin PBPin */ + GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_I2C2; - HAL_GPIO_Init(I2C2_SDA_GPIO_Port, &GPIO_InitStruct); + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); diff --git a/2P-ProjectPong/Src/i2c.c b/2P-ProjectPong/Src/i2c.c index 4452970..c724f06 100644 --- a/2P-ProjectPong/Src/i2c.c +++ b/2P-ProjectPong/Src/i2c.c @@ -54,22 +54,22 @@ /* USER CODE END 0 */ -I2C_HandleTypeDef hi2c1; +I2C_HandleTypeDef hi2c2; -/* I2C1 init function */ -void MX_I2C1_Init(void) +/* I2C2 init function */ +void MX_I2C2_Init(void) { - hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 100000; - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) + hi2c2.Instance = I2C2; + hi2c2.Init.ClockSpeed = 100000; + hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c2.Init.OwnAddress1 = 0; + hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c2.Init.OwnAddress2 = 0; + hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c2) != HAL_OK) { Error_Handler(); } @@ -80,58 +80,65 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C1) + if(i2cHandle->Instance==I2C2) { - /* USER CODE BEGIN I2C1_MspInit 0 */ + /* USER CODE BEGIN I2C2_MspInit 0 */ - /* USER CODE END I2C1_MspInit 0 */ + /* USER CODE END I2C2_MspInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB9 ------> I2C2_SDA */ - GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin; + GPIO_InitStruct.Pin = I2C2_SCL_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + HAL_GPIO_Init(I2C2_SCL_GPIO_Port, &GPIO_InitStruct); - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); + GPIO_InitStruct.Pin = I2C2_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_I2C2; + HAL_GPIO_Init(I2C2_SDA_GPIO_Port, &GPIO_InitStruct); - /* I2C1 interrupt Init */ - HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); - /* USER CODE BEGIN I2C1_MspInit 1 */ + /* I2C2 clock enable */ + __HAL_RCC_I2C2_CLK_ENABLE(); - /* USER CODE END I2C1_MspInit 1 */ + /* I2C2 interrupt Init */ + HAL_NVIC_SetPriority(I2C2_EV_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); + /* USER CODE BEGIN I2C2_MspInit 1 */ + + /* USER CODE END I2C2_MspInit 1 */ } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) { - if(i2cHandle->Instance==I2C1) + if(i2cHandle->Instance==I2C2) { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ + /* USER CODE BEGIN I2C2_MspDeInit 0 */ - /* USER CODE END I2C1_MspDeInit 0 */ + /* USER CODE END I2C2_MspDeInit 0 */ /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); + __HAL_RCC_I2C2_CLK_DISABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB9 ------> I2C2_SDA */ - HAL_GPIO_DeInit(GPIOB, I2C1_SCL_Pin|I2C1_SDA_Pin); + HAL_GPIO_DeInit(GPIOB, I2C2_SCL_Pin|I2C2_SDA_Pin); - /* I2C1 interrupt Deinit */ - HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); - /* USER CODE BEGIN I2C1_MspDeInit 1 */ + /* I2C2 interrupt Deinit */ + HAL_NVIC_DisableIRQ(I2C2_EV_IRQn); + /* USER CODE BEGIN I2C2_MspDeInit 1 */ - /* USER CODE END I2C1_MspDeInit 1 */ + /* USER CODE END I2C2_MspDeInit 1 */ } } diff --git a/2P-ProjectPong/Src/main.c b/2P-ProjectPong/Src/main.c index 173550f..5b9efe7 100644 --- a/2P-ProjectPong/Src/main.c +++ b/2P-ProjectPong/Src/main.c @@ -54,6 +54,7 @@ #include "stm32412g_discovery.h" #include "stm32412g_discovery_lcd.h" #include "game_engine.h" +#include "sensor_interface.h" //#include "lsm6dsl/lsm6dsl.h" /* USER CODE END Includes */ @@ -110,31 +111,31 @@ int main(void) /* USER CODE BEGIN Init */ PP_HighScoresTypeDef HighScoresDatas; + PP_GyroAnglesTypeDef AnglesDatas; /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ - RngHandle.Instance = RNG; + RngHandle.Instance = RNG; // Associate periph to handle /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); - MX_I2C1_Init(); MX_FSMC_Init(); MX_QUADSPI_Init(); MX_RNG_Init(); MX_TIM6_Init(); + MX_I2C2_Init(); /* USER CODE BEGIN 2 */ initPeriph(); // Start all periph func displayLoadingScreen(); barDatas.pos = BSP_LCD_GetXSize() / 2; - //testEEPROM(); - /* Load from NOR Flash and display high scores */ + /* Load from EEPROM and display high scores */ getHighScores(&HighScoresDatas); displayStartMenu(HighScoresDatas); /* USER CODE END 2 */ @@ -143,13 +144,30 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { - if (BSP_JOY_GetState() == JOY_UP) { - barDatas.acc = -6; - } else if (BSP_JOY_GetState() == JOY_DOWN) { - barDatas.acc = 6; - } else { - barDatas.acc = 0; + if (getCurrMenu() == MENU_GAME) { + /* Joystick Debug Mode */ + /* + if (BSP_JOY_GetState() == JOY_UP) { + barDatas.acc = -6; + } else if (BSP_JOY_GetState() == JOY_DOWN) { + barDatas.acc = 6; + } else { + barDatas.acc = 0; + } + */ + + /* Gyro angles -> bar acceleration conversion */ + getAnglesFromSensor(&AnglesDatas); + if (AnglesDatas.Roll <= 65 && AnglesDatas.Roll > 0) { + barDatas.acc = -5; + } else if (AnglesDatas.Roll >= -65 && AnglesDatas.Roll < 0) { + barDatas.acc = 5; + } else if (AnglesDatas.Roll > 65 || AnglesDatas.Roll < -65) { + barDatas.acc = 0; + } } + + /* The only one important function, trigger refresh screen */ refreshCurrScreen(ticks, &barDatas); /* USER CODE END WHILE */ @@ -209,26 +227,35 @@ void SystemClock_Config(void) } /* USER CODE BEGIN 4 */ +/** + * @brief Init all necessary hardware periph + */ void initPeriph() { - if (HAL_RNG_Init(&RngHandle) != HAL_OK) return; - if (HAL_TIM_Base_Init(&htim6) != HAL_OK) return; - if (HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) return; BSP_LED_Init(LED_BLUE); BSP_LED_Init(LED_RED); BSP_LED_Init(LED_ORANGE); BSP_LED_Init(LED_GREEN); - //if (BSP_JOY_Init(JOY_MODE_EXTI) != HAL_OK) return; - + if (HAL_RNG_Init(&RngHandle) != HAL_OK) return; + BSP_LED_On(LED_BLUE); + if (HAL_TIM_Base_Init(&htim6) != HAL_OK) return; + BSP_LED_On(LED_RED); + if (HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) return; + BSP_LED_On(LED_ORANGE); + initGyro(); if (BSP_LCD_InitEx(LCD_ORIENTATION_PORTRAIT) == LCD_ERROR) return; HAL_Delay(400); BSP_LCD_Clear(LCD_COLOR_BLACK); - BSP_LED_On(LED_GREEN); } +/** + * @brief Function to retrieve HighScores from external EEPROM + */ void getHighScores(PP_HighScoresTypeDef* hsDatas) { uint32_t tmp = 0; + /* Cheat, use random number generator because no EEPROM connected */ + // Can be use to test RNG if (HAL_RNG_Init(&RngHandle) == HAL_OK) { tmp = HAL_RNG_GetRandomNumber(&RngHandle); } else BSP_LED_On(LED_RED); @@ -238,21 +265,28 @@ void getHighScores(PP_HighScoresTypeDef* hsDatas) { hsDatas->Multi_HS = (uint8_t)(tmp>>24); } +/** + * @brief Callback function for cadencer timer + */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { - //BSP_LED_Toggle(LED_BLUE); + // Increment ticks all 10ms if (++ticks >= 0xffffffffffffffff) ticks = 0; - //HAL_TIM_Base_Stop_IT(&htim6); } +/** + * @brief Callback function for Joystick handling + */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { + // Scan current displayed "screen" to correctly interpret Joystick inputs switch(getCurrMenu()) { case MENU_GAME: - + // Empty break; default: + case MENU_END: case MENU_MAIN: if (BSP_JOY_GetState() == JOY_SEL) { - displayGameArea(SOLO_MODE, &barDatas); + displayGameArea(SOLO_MODE, &barDatas); // Start new game from main menu } break; } diff --git a/2P-ProjectPong/Src/sensor_interface.c b/2P-ProjectPong/Src/sensor_interface.c new file mode 100644 index 0000000..04de248 --- /dev/null +++ b/2P-ProjectPong/Src/sensor_interface.c @@ -0,0 +1,39 @@ +/* + * sensor_interface.c + * + * Created on: 7 déc. 2019 + * Author: JackCarterSmith + */ + +#include "sensor_interface.h" +#include "i2c.h" + +#include "math.h" + + +void initGyro() { + uint8_t MEMS_ODR_CONFIG []= {0x88}; + + //Configure all configurations datas for sensor chip + HAL_I2C_Mem_Write(&hi2c2,MEMS_ADD_WR,CTRL1_XL_REGISTER,1,MEMS_ODR_CONFIG,1,HAL_TIMEOUT); +} + +/** + * @brief function to retrieve values from sensors and calculate angles from it + */ +void getAnglesFromSensor(PP_GyroAnglesTypeDef *anglesVar) { + int16_t OUTX_XL[1],OUTY_XL[1],OUTZ_XL[1]; + float tempX, tempY, tempZ; + + HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x28, 1, (uint8_t*)&OUTX_XL, 2, HAL_TIMEOUT); + HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x2A, 1, (uint8_t*)&OUTY_XL, 2, HAL_TIMEOUT); + HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x2C, 1, (uint8_t*)&OUTZ_XL, 2, HAL_TIMEOUT); + + tempX = (float)OUTX_XL[0]; + tempY = (float)OUTY_XL[0]; + tempZ = (float)OUTZ_XL[0]; + + anglesVar->Pitch = (int16_t)atanf(-tempY / tempZ) * 60; + anglesVar->Yaw = (int16_t)atanf(-tempX / tempZ) * 60; + anglesVar->Roll = (int16_t)atanf(-tempX / tempY) * 60; +} diff --git a/2P-ProjectPong/Src/stm32f4xx_it.c b/2P-ProjectPong/Src/stm32f4xx_it.c index 3b923b4..38e26f6 100644 --- a/2P-ProjectPong/Src/stm32f4xx_it.c +++ b/2P-ProjectPong/Src/stm32f4xx_it.c @@ -71,7 +71,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ -extern I2C_HandleTypeDef hi2c1; +extern I2C_HandleTypeDef hi2c2; extern TIM_HandleTypeDef htim6; /* USER CODE BEGIN EV */ @@ -228,17 +228,17 @@ void EXTI0_IRQHandler(void) } /** - * @brief This function handles I2C1 event interrupt. + * @brief This function handles I2C2 event interrupt. */ -void I2C1_EV_IRQHandler(void) +void I2C2_EV_IRQHandler(void) { - /* USER CODE BEGIN I2C1_EV_IRQn 0 */ + /* USER CODE BEGIN I2C2_EV_IRQn 0 */ - /* USER CODE END I2C1_EV_IRQn 0 */ - HAL_I2C_EV_IRQHandler(&hi2c1); - /* USER CODE BEGIN I2C1_EV_IRQn 1 */ + /* USER CODE END I2C2_EV_IRQn 0 */ + HAL_I2C_EV_IRQHandler(&hi2c2); + /* USER CODE BEGIN I2C2_EV_IRQn 1 */ - /* USER CODE END I2C1_EV_IRQn 1 */ + /* USER CODE END I2C2_EV_IRQn 1 */ } /**