summaryrefslogtreecommitdiff
path: root/third_party/TouchSense/STMTouch_Driver/src/tsl_time.c
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-03-05 20:20:45 +0300
committerOxore <oxore@protonmail.com>2023-03-05 20:20:45 +0300
commitea807de65b0485ac58b6eae576209c64d4d5c4e9 (patch)
treeb4264d20e1d700cfd9e0ece9d847a825dd1dfc03 /third_party/TouchSense/STMTouch_Driver/src/tsl_time.c
parentdd01e7ed22cea652061f0d12cecf929e04b285e9 (diff)
Split app code and third party libraries
Diffstat (limited to 'third_party/TouchSense/STMTouch_Driver/src/tsl_time.c')
-rw-r--r--third_party/TouchSense/STMTouch_Driver/src/tsl_time.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/third_party/TouchSense/STMTouch_Driver/src/tsl_time.c b/third_party/TouchSense/STMTouch_Driver/src/tsl_time.c
new file mode 100644
index 0000000..d274575
--- /dev/null
+++ b/third_party/TouchSense/STMTouch_Driver/src/tsl_time.c
@@ -0,0 +1,174 @@
+/**
+ ******************************************************************************
+ * @file tsl_time.c
+ * @author MCD Application Team
+ * @version V1.4.4
+ * @date 31-March-2014
+ * @brief This file contains all functions to manage the timings in general.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "tsl_time.h"
+#include "tsl_globals.h"
+
+/* Private typedefs ----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private functions prototype -----------------------------------------------*/
+
+/**
+ * @brief Management of the timing module interrupt service routine.
+ * @param None
+ * @retval None
+ */
+void TSL_tim_ProcessIT(void)
+{
+ static TSL_tTick_ms_T count_1s = 0;
+
+ // Count 1 global tick every xxx ms (defined by TSLPRM_TICK_FREQ parameter)
+ TSL_Globals.Tick_ms++;
+
+ // Check if 1 second has elapsed
+ count_1s++;
+ if (count_1s > (TSLPRM_TICK_FREQ - 1))
+ {
+ TSL_Globals.Tick_sec++; // 1 global tick every second
+ if (TSL_Globals.Tick_sec > 63) // Due to DTO counter on 6 bits...
+ {
+ TSL_Globals.Tick_sec = 0;
+ }
+ count_1s = 0;
+ }
+
+// Callback function
+#if TSLPRM_USE_TIMER_CALLBACK > 0
+ TSL_CallBack_TimerTick();
+#endif
+
+}
+
+
+/**
+ * @brief Check if a delay (in ms) has elapsed.
+ * This function must be called regularly due to counter Roll-over only managed one time.
+ * @param[in] delay_ms Delay in ms
+ * @param[in] last_tick Variable holding the last tick value
+ * @retval Status
+ */
+TSL_Status_enum_T TSL_tim_CheckDelay_ms(TSL_tTick_ms_T delay_ms, __IO TSL_tTick_ms_T *last_tick)
+{
+ TSL_tTick_ms_T tick;
+ TSL_tTick_ms_T diff;
+
+ disableInterrupts();
+
+ tick = TSL_Globals.Tick_ms;
+
+ if (delay_ms == 0)
+ {
+ enableInterrupts();
+ return TSL_STATUS_ERROR;
+ }
+
+ // Counter Roll-over management
+ if (tick >= *last_tick)
+ {
+ diff = tick - *last_tick;
+ }
+ else
+ {
+ diff = (0xFFFF - *last_tick) + tick + 1;
+ }
+
+#if (TSLPRM_TICK_FREQ == 125)
+ if (diff >= (TSL_tTick_ms_T)(delay_ms >> 3)) // Divide by 8 for 8ms tick
+#endif
+#if (TSLPRM_TICK_FREQ == 250)
+ if (diff >= (TSL_tTick_ms_T)(delay_ms >> 2)) // Divide by 4 for 4ms tick
+#endif
+#if (TSLPRM_TICK_FREQ == 500)
+ if (diff >= (TSL_tTick_ms_T)(delay_ms >> 1)) // Divide by 2 for 2ms tick
+#endif
+#if (TSLPRM_TICK_FREQ == 1000)
+ if (diff >= (TSL_tTick_ms_T)delay_ms) // Direct value for 1ms tick
+#endif
+#if (TSLPRM_TICK_FREQ == 2000)
+ if (diff >= (TSL_tTick_ms_T)(delay_ms << 1)) // Multiply by 2 for 0.5ms tick
+#endif
+ {
+ // Save current time
+ *last_tick = tick;
+ enableInterrupts();
+ return TSL_STATUS_OK;
+ }
+
+ enableInterrupts();
+ return TSL_STATUS_BUSY;
+
+}
+
+
+/**
+ * @brief Check if a delay (in s) has elapsed.
+ * @param[in] delay_sec Delay in seconds
+ * @param[in] last_tick Variable holding the last tick value
+ * @retval Status
+ */
+TSL_Status_enum_T TSL_tim_CheckDelay_sec(TSL_tTick_sec_T delay_sec, __IO TSL_tTick_sec_T *last_tick)
+{
+ TSL_tTick_sec_T tick;
+ TSL_tTick_sec_T diff;
+
+ disableInterrupts();
+
+ tick = TSL_Globals.Tick_sec;
+
+ if (delay_sec == 0)
+ {
+ enableInterrupts();
+ return TSL_STATUS_ERROR;
+ }
+
+ // Counter Roll-over management
+ if (tick >= *last_tick)
+ {
+ diff = (TSL_tTick_sec_T)(tick - *last_tick);
+ }
+ else
+ {
+ diff = (TSL_tTick_sec_T)((63 - *last_tick) + tick + 1); // DTO counter is on 6 bits
+ }
+
+ if (diff >= delay_sec)
+ {
+ // Save current time
+ *last_tick = tick;
+ enableInterrupts();
+ return TSL_STATUS_OK;
+ }
+
+ enableInterrupts();
+ return TSL_STATUS_BUSY;
+
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/