/************************************************************************************//** * \file Demo/ARMCM0_STM32G0_Nucleo_G071RB_CubeIDE/Prog/App/app.c * \brief User program application source file. * \ingroup Prog_ARMCM0_STM32G0_Nucleo_G071RB_CubeIDE * \internal *---------------------------------------------------------------------------------------- * C O P Y R I G H T *---------------------------------------------------------------------------------------- * Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved * *---------------------------------------------------------------------------------------- * L I C E N S E *---------------------------------------------------------------------------------------- * This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any later * version. * * OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You have received a copy of the GNU General Public License along with OpenBLT. It * should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. * * \endinternal ****************************************************************************************/ /**************************************************************************************** * Include files ****************************************************************************************/ extern "C" { #include "header.h" /* generic header */ #include "vl6180_app.h" } #include #include "uart_bridge.hpp" #include "tim.h" #include UartBridge bridge(true, USART1, USART2, 9600, 9600); uint8_t flagTransmitCompleted = 1; void zummerOff(void); void zummerOn(void); void lightingOn(void); void lightingOff(void); /************************************************************************************//** ** \brief Initializes the user program application. Should be called once during ** software program initialization. ** \return none. ** ****************************************************************************************/ void AppInit(void) { /* Initialize the timer driver. */ TimerInit(); vl6180_init(); /* Initialize the led driver. */ LedInit(); /* initialize the bootloader interface */ bridge.init(); zummerOff(); lightingOff(); /* BootComInit(); */ } /*** end of AppInit ***/ /************************************************************************************//** ** \brief Task function of the user program application. Should be called ** continuously in the program loop. ** \return none. ** ****************************************************************************************/ uint32_t controlPinMs = 0; uint8_t controlPinFlag = 0; uint32_t controlPinDetectedMs = 0; uint8_t updateMode = 0; command_t lastZummerCommand; command_t sendCommand; void zummerOff(void) { HAL_TIM_Base_Stop(&htimZummer); HAL_TIM_PWM_Stop(&htimZummer, TIM_CHANNEL_2); } void zummerOn(void) { HAL_TIM_Base_Start(&htimZummer); HAL_TIM_PWM_Start(&htimZummer, TIM_CHANNEL_2); #ifndef PASSIVE_ZUMMER __HAL_TIM_SET_COMPARE(&htimZummer, TIM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&htimZummer) - 1); #endif } void lightingOn(void) { HAL_TIM_Base_Start(&htimLighitng); HAL_TIM_PWM_Start(&htimLighitng, TIM_CHANNEL_1); } void lightingOff(void) { HAL_TIM_Base_Stop(&htimLighitng); HAL_TIM_PWM_Stop(&htimLighitng, TIM_CHANNEL_1); } uint8_t proximityCompleteMessure = 0; void proximityMessureCompleted(void) { proximityCompleteMessure = 1; } VL6180_RangeData_t VL6180_Range; uint32_t waitAnswerFromReaderMs = 0; #define MAX_WAIT_ANSWER_FROM_GM60 30000 #define MAX_WAIT_FOR_BOOT_COMMAND 30000 #define DATA_TIMEOUT 500 uint32_t bootStartMs = 0; uint32_t lightStartMs = 0; uint8_t uart1Buf[1024]; uint8_t uart2Buf[1024]; uint32_t msms ; uint8_t uartTask(void) // return 0 if data received , otherwise return 1 { if (waitAnswerFromReaderMs != 0) { if (HAL_GetTick() - waitAnswerFromReaderMs >= MAX_WAIT_ANSWER_FROM_GM60) { HAL_GPIO_WritePin(READER_EN_GPIO_Port, READER_EN_Pin, GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(READER_EN_GPIO_Port, READER_EN_Pin, GPIO_PIN_RESET); waitAnswerFromReaderMs = 0; } } if (!bridge.uart1Buf.is_empty() && bridge.getHuart2()->gState == 0x20) { waitAnswerFromReaderMs = HAL_GetTick(); std::string_view stringView{bridge.uart1Buf.dequeue()}; uint32_t size = stringView.size(); stringView.copy(reinterpret_cast(uart1Buf), size, 0); if (size == sizeof(command_t)) { uint8_t command = stringView[0]; if (command == ENTER_FIRMWARE_UPDATE) { HAL_UART_Transmit_IT(bridge.getHuart1(), (uint8_t*) &uart1Buf[0], sizeof(sendCommand)); HAL_Delay(200); HAL_UART_DeInit(bridge.getHuart1()); BootComInit(); zummerOff(); lightingOff(); updateMode = 1; bootStartMs = HAL_GetTick(); } else if (command == ZUMMER_ON || command == ZUMMER_OFF) { memcpy(&lastZummerCommand, uart1Buf, sizeof(lastZummerCommand)); } else if (command == GET_FIRMWARE_VERSION) { uint8_t fw_ver[16]; sprintf(reinterpret_cast(fw_ver),"%s", FW_VERSION); sendCommand = { GET_FIRMWARE_VERSION, *(uint16_t*)&fw_ver[0], *(uint16_t*)&fw_ver[2], 0x00 }; } HAL_UART_Transmit_IT(bridge.getHuart1(), (uint8_t*) &sendCommand, sizeof(sendCommand)); } else { HAL_UART_Transmit_IT(bridge.getHuart2(), (const uint8_t *) uart1Buf, size); } return 0; } if (!bridge.uart2Buf.is_empty() && bridge.getHuart1()->gState == 0x20) { msms = HAL_GetTick(); __HAL_TIM_CLEAR_FLAG(&htimSecTimer, TIM_FLAG_UPDATE); HAL_TIM_Base_Start_IT(&htimSecTimer); flagTransmitCompleted = 0; waitAnswerFromReaderMs = 0; std::string_view stringView{bridge.uart2Buf.dequeue()}; uint32_t size = stringView.size(); stringView.copy(reinterpret_cast(uart2Buf), size, 0); HAL_UART_Transmit_IT(bridge.getHuart1(), (const uint8_t *) uart2Buf, size); return 0; } return 1; } typedef struct currentlyZummerParam_t { int32_t beepMs ; uint32_t zumStartMs ; int32_t zumPauseMs; uint8_t beepCount; uint8_t zumIsPaused ; }; currentlyZummerParam_t currentlyZummerParam = {0}; void zumHandle (void) { if (lastZummerCommand.numOfCommand == ZUMMER_ON && currentlyZummerParam.zumStartMs == 0) { zummerOn(); currentlyZummerParam = { lastZummerCommand.data1, HAL_GetTick(), lastZummerCommand.data2, lastZummerCommand.data3, 0 }; } else if (currentlyZummerParam.zumStartMs > 0 && currentlyZummerParam.zumIsPaused == 0 && currentlyZummerParam.beepCount >= 1 && currentlyZummerParam.beepMs <= (HAL_GetTick() - currentlyZummerParam.zumStartMs)) { currentlyZummerParam.beepMs = 0; if (currentlyZummerParam.beepCount >= 1) { currentlyZummerParam.beepCount--; currentlyZummerParam.zumIsPaused = 1; currentlyZummerParam.zumStartMs = HAL_GetTick(); currentlyZummerParam.zumPauseMs = lastZummerCommand.data2; zummerOff(); } } else if (currentlyZummerParam.zumIsPaused == 1 && (HAL_GetTick() - currentlyZummerParam.zumStartMs) >= currentlyZummerParam.zumPauseMs ) { currentlyZummerParam.zumPauseMs = 0; currentlyZummerParam.beepMs = lastZummerCommand.data1; currentlyZummerParam.zumIsPaused = 0; currentlyZummerParam.zumStartMs = HAL_GetTick(); zummerOn(); } else if (currentlyZummerParam.beepCount == 0 && currentlyZummerParam.zumIsPaused <= 0 ) { currentlyZummerParam = {0}; zummerOff(); memset((uint8_t*)&lastZummerCommand, 0, sizeof(lastZummerCommand)); } } void AppTask(void) { if (!updateMode) { uartTask(); if (HAL_GetTick() - lightStartMs >= 10000 && lightStartMs > 0) { lightStartMs = 0; lightingOff(); } zumHandle(); if (lastZummerCommand.numOfCommand == ZUMMER_ON) return; if (flagTransmitCompleted == 1) { if (proximityCompleteMessure == 1) { proximityCompleteMessure = 0; if (getRange(&VL6180_Range) == 0) { if (VL6180_Range.range_mm > 0 && lightStartMs == 0) { lightStartMs = uwTick; lightingOn(); } } } if (vl6180_is_ready() >= 0) vl6180_single_shot(); } } else { if (HAL_GetTick() - bootStartMs > MAX_WAIT_FOR_BOOT_COMMAND) updateMode = 0; BootComCheckActivationRequest(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == htimSecTimer.Instance) { HAL_TIM_Base_Stop_IT(htim); msms = HAL_GetTick() - msms; flagTransmitCompleted = 1; } } /*** end of AppTask ***/ /*********************************** end of app.c **************************************/ //////////// FINALLY NEED TO UNCOMMENT BootComCheckActivationRequest and BootComInit for success firmwaare update from HOST