Welcome to mirror list, hosted at ThFree Co, Russian Federation.

tsl_dxs.c « src « STM32_TouchSensing_Library « ST « Middlewares - github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9e7d5f29e13f51317ba597d09c2773a001cdaa6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**
  ******************************************************************************
  * @file    tsl_dxs.c
  * @author  MCD Application Team
  * @brief   This file contains all functions to manage the
  *          Detection Exclusion System (DxS) algorithm.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 20020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "tsl_dxs.h"
#include "tsl_globals.h"

/* Private typedefs ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/

#define THIS_OBJ_TYPE       TSL_Globals.This_Obj->Type

#define THIS_TKEY           TSL_Globals.This_TKey
#define THIS_TKEY_STATEID   TSL_Globals.This_TKey->p_Data->StateId
#define THIS_TKEY_DXSLOCK   TSL_Globals.This_TKey->p_Data->DxSLock
#define THIS_TKEY_CHANGE    TSL_Globals.This_TKey->p_Data->Change

#define THIS_LINROT         TSL_Globals.This_LinRot
#define THIS_LINROT_STATEID TSL_Globals.This_LinRot->p_Data->StateId
#define THIS_LINROT_DXSLOCK TSL_Globals.This_LinRot->p_Data->DxSLock
#define THIS_LINROT_CHANGE  TSL_Globals.This_LinRot->p_Data->Change

/* Private macros ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private functions prototype -----------------------------------------------*/

/**
  * @brief Detection Exclusion System on the first object in detect state
  * @param[in] objgrp  Pointer to the objects group to process
  * @retval None
  */
void TSL_dxs_FirstObj(CONST TSL_ObjectGroup_T *objgrp)
{
#if TSLPRM_USE_DXS > 0

  TSL_tIndex_T idx_obj;
  CONST TSL_Object_T *pobj;
  CONST TSL_Object_T *pobj_candidate = 0; // Candidate object for being in Detect state + DxSLock flag
  TSL_tIndex_T obj_locked = 0; // Object with Lock flag

  // Exit if no object are in DETECT state.
  if ((objgrp->StateMask & TSL_STATE_DETECT_BIT_MASK) == 0)
  {
    return;
  }

  pobj = objgrp->p_Obj; // First object in the group

  // Process all objects
  for (idx_obj = 0; idx_obj < objgrp->NbObjects; idx_obj++)
  {

    // Assign global object
    TSL_obj_SetGlobalObj(pobj);

    //--------------------------------------------------------------------------
#if TSLPRM_TOTAL_TKEYS > 0
    if ((THIS_OBJ_TYPE == TSL_OBJ_TOUCHKEY) || (THIS_OBJ_TYPE == TSL_OBJ_TOUCHKEYB))
    {
      if (THIS_TKEY_STATEID == TSL_STATEID_DETECT)
      {
        if (THIS_TKEY_DXSLOCK == TSL_TRUE)
        {
          if (!obj_locked)
          {
            obj_locked = 1;
            pobj_candidate = 0;
          }
          else
          {
            THIS_TKEY_STATEID = TSL_STATEID_TOUCH;
            THIS_TKEY_CHANGE = TSL_STATE_CHANGED;
          }
        }
        else
        {
          THIS_TKEY_STATEID = TSL_STATEID_TOUCH;
          THIS_TKEY_CHANGE = TSL_STATE_CHANGED;
          if ((!pobj_candidate) && (!obj_locked))
          {
            pobj_candidate = pobj;
          }
        }
      }
    }
#endif // TSLPRM_TOTAL_TKEYS > 0

    //--------------------------------------------------------------------------
#if TSLPRM_TOTAL_LNRTS > 0
    if ((THIS_OBJ_TYPE == TSL_OBJ_LINEAR) || (THIS_OBJ_TYPE == TSL_OBJ_LINEARB) ||
        (THIS_OBJ_TYPE == TSL_OBJ_ROTARY) || (THIS_OBJ_TYPE == TSL_OBJ_ROTARYB))
    {
      if (THIS_LINROT_STATEID == TSL_STATEID_DETECT)
      {
        if (THIS_LINROT_DXSLOCK == TSL_TRUE)
        {
          if (!obj_locked)
          {
            obj_locked = 1;
            pobj_candidate = 0;
          }
          else
          {
            THIS_LINROT_STATEID = TSL_STATEID_TOUCH;
            THIS_LINROT_CHANGE = TSL_STATE_CHANGED;
          }
        }
        else
        {
          THIS_LINROT_STATEID = TSL_STATEID_TOUCH;
          THIS_LINROT_CHANGE = TSL_STATE_CHANGED;
          if ((!pobj_candidate) && (!obj_locked))
          {
            pobj_candidate = pobj;
          }
        }
      }
    }
#endif // TSLPRM_TOTAL_LNRTS > 0

    pobj++; // Next object

  } // // for all objects

  // Change state from TOUCH to DETECT + DxSLock flag on the candidate object only
  if (pobj_candidate)
  {

    // Assign global object
    TSL_obj_SetGlobalObj(pobj_candidate);

#if TSLPRM_TOTAL_TKEYS > 0
    if ((THIS_OBJ_TYPE == TSL_OBJ_TOUCHKEY) || (THIS_OBJ_TYPE == TSL_OBJ_TOUCHKEYB))
    {
      THIS_TKEY_STATEID = TSL_STATEID_DETECT;
      THIS_TKEY_CHANGE = TSL_STATE_CHANGED;
      THIS_TKEY_DXSLOCK = TSL_TRUE;
    }
#endif // TSLPRM_TOTAL_TKEYS > 0

#if TSLPRM_TOTAL_LNRTS > 0
    if ((THIS_OBJ_TYPE == TSL_OBJ_LINEAR) || (THIS_OBJ_TYPE == TSL_OBJ_LINEARB) ||
        (THIS_OBJ_TYPE == TSL_OBJ_ROTARY) || (THIS_OBJ_TYPE == TSL_OBJ_ROTARYB))
    {
      THIS_LINROT_STATEID = TSL_STATEID_DETECT;
      THIS_LINROT_CHANGE = TSL_STATE_CHANGED;
      THIS_LINROT_DXSLOCK = TSL_TRUE;
    }
#endif // TSLPRM_TOTAL_LNRTS > 0

  }

#endif // TSLPRM_USE_DXS > 0
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/