annotate Discovery/Src/motion.c @ 642:c737cf5d9067

Do not show focus indicator in case motion detection is suspended: Motion detection will be suspended in case the diver is operating the OSTC using the buttons. In previous versions the focus indicator was shown even the motion detection was not active => may cause confusion. The indicator is now only shown in case the detection is active Added hystresis for switching between sector views: In previous versions small jitter at the angle signal could cause fast switching of the custom view. An offset has now been added to avoid this scenario
author Ideenmodellierer
date Wed, 24 Mar 2021 21:28:41 +0100
parents 189f945ae4ba
children ff2b393e290f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
1 /*
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
2 * motion.c
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
3 *
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
4 * Created on: 20.05.2019
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
5 * Author: Thorsten Sonntag
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
6 */
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
7
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
8 #include <stdint.h>
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
9 #include <string.h>
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
10 #include <stdlib.h>
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
11 #include <math.h>
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
12 #include "motion.h"
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
13 #include "data_central.h"
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
14 #include "t7.h"
384
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
15 #include "t3.h"
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
16 #include "settings.h"
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
17 #include "base.h"
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
18
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
19 #define STABLE_STATE_COUNT 2 /* number of count to declare a state as stable (at the moment based on 100ms) */
363
bdf978d2a5d4 Reworked detection function
ideenmodellierer
parents: 362
diff changeset
20 #define STABLE_STATE_TIMEOUT 5 /* Detection shall be aborted if a movement state is stable for more than 500ms */
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
21
385
0cd862e501f6 Finetune parameter for detection of small sectors as used for the pitch detection
ideenmodellierer
parents: 384
diff changeset
22 #define SECTOR_MAX 24 /* maximum number of sectors */
378
834e087505ec Incremented "idle window" for scroll detection
ideenmodellierer
parents: 373
diff changeset
23 #define SECTOR_SCROLL 7 /* number of sectors used for scroll detection */
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
24 #define SECTOR_MAX_CNT 5 /* max number of views used for sector control */
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
25
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
26
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
27 typedef enum
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
28 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
29 MOTION_DELTA_STABLE = 0,
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
30 MOTION_DELTA_JITTER,
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
31 MOTION_DELTA_RAISE,
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
32 MOTION_DELTA_RAISE_FAST,
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
33 MOTION_DELTA_FALL,
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
34 MOTION_DELTA_FALL_FAST
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
35 } MotionDeltaState_t;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
36
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
37 #define MOTION_DELTA_JITTER_LEVEL 2.0 /* lower values are considered as stable */
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
38 #define MOTION_DELTA_RAISE_LEVEL 4.0 /* Movement causing a significant change detected */
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
39 #define MOTION_DELTA_FALL_LEVEL -4.0 /* Movement causing a significant change detected */
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
40 #define MOTION_DELTA_FAST_LEVEL 6.0 /* Movement causing a fast change detected */
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
41
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
42 #define MOTION_DELTA_HISTORY_SIZE 20 /* Number of history data sets */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
43
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
44 #define MOTION_FOCUS_LIMIT 0.5 /* +/- value which defines the border of the focus area */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
45 #define MOTION_FOCUS_USE_SECTOR 0.4 /* +/- value for the focus area used to map secors to views */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
46 #define MOTION_FOCUS_SCROLL_IDLE 0.3 /* +/- value for starting generation of scroll events */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
47
385
0cd862e501f6 Finetune parameter for detection of small sectors as used for the pitch detection
ideenmodellierer
parents: 384
diff changeset
48 detectionState_t detectionState = DETECT_NOTHING;
0cd862e501f6 Finetune parameter for detection of small sectors as used for the pitch detection
ideenmodellierer
parents: 384
diff changeset
49 SSector sectorDetection;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
50
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
51 static uint8_t motionDeltaHistory[3][MOTION_DELTA_HISTORY_SIZE]; /* Change history of roll, pitch and yaw */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
52 static uint8_t motionDeltaHistoryIdx; /* Current index of history data */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
53
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
54 static uint8_t focusCnt = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
55 static uint8_t inFocus = 0;
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
56 static uint8_t sectorMap[SECTOR_MAX_CNT];
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
57
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
58 static uint8_t suspendMotionDetectionSec = 0;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
59
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
60 void resetMotionDeltaHistory()
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
61 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
62 motionDeltaHistoryIdx = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
63 memset(motionDeltaHistory, 0, sizeof(motionDeltaHistory));
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
64 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
65
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
66 void evaluateMotionDelta(float roll, float pitch, float yaw)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
67 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
68 static float lastValue[3] = {0.0,0.0,0.0};
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
69 uint8_t nextIndex = motionDeltaHistoryIdx + 1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
70 uint8_t axis;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
71 float curValue;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
72
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
73 if(nextIndex == MOTION_DELTA_HISTORY_SIZE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
74 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
75 nextIndex = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
76 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
77 for(axis=0; axis < 3; axis++)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
78 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
79 switch(axis)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
80 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
81 case MOTION_HISTORY_ROLL: curValue = roll;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
82 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
83 case MOTION_HISTORY_PITCH: curValue = pitch;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
84 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
85 default:
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
86 case MOTION_HISTORY_YAW: if((yaw < 90) && (lastValue[MOTION_HISTORY_YAW] > 270.0)) /* transition 360 => 0 */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
87 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
88 lastValue[MOTION_HISTORY_YAW] -= 360;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
89 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
90 else if((yaw > 270) && (lastValue[MOTION_HISTORY_YAW] < 90.0)) /* transition 0 => 360 */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
91 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
92 lastValue[MOTION_HISTORY_YAW] += 360;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
93 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
94 curValue = yaw;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
95 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
96 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
97 if(curValue - lastValue[axis] > MOTION_DELTA_RAISE_LEVEL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
98 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
99 motionDeltaHistory[axis][nextIndex] = MOTION_DELTA_RAISE;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
100 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
101 if(fabsf(curValue - lastValue[axis]) < MOTION_DELTA_RAISE_LEVEL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
102 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
103 motionDeltaHistory[axis][nextIndex] = MOTION_DELTA_JITTER;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
104 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
105 if(fabsf(curValue - lastValue[axis]) < MOTION_DELTA_JITTER_LEVEL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
106 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
107 motionDeltaHistory[axis][nextIndex] = MOTION_DELTA_STABLE;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
108 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
109 if(curValue - lastValue[axis] < MOTION_DELTA_FALL_LEVEL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
110 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
111 motionDeltaHistory[axis][nextIndex] = MOTION_DELTA_FALL;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
112 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
113
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
114 if(fabsf(curValue - lastValue[axis]) > MOTION_DELTA_FAST_LEVEL)
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
115 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
116 motionDeltaHistory[axis][nextIndex]++;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
117 }
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
118
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
119 lastValue[axis] = curValue;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
120 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
121 motionDeltaHistoryIdx = nextIndex;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
122 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
123
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
124 SDeltaHistory GetDeltaHistory(uint8_t stepback)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
125 {
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
126 uint8_t loop;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
127 uint8_t index = motionDeltaHistoryIdx;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
128
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
129 SDeltaHistory result = {0,0,0};
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
130
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
131 loop = stepback + 1; /* motionDeltaHistoryIdx is pointing to future entry => step back one more to get the latest */
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
132 if(stepback < MOTION_DELTA_HISTORY_SIZE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
133 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
134 while(loop != 0) /* find requested entry */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
135 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
136 loop--;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
137 index--;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
138 if(index == 0)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
139 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
140 index = MOTION_DELTA_HISTORY_SIZE - 1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
141 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
142 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
143 result.roll = motionDeltaHistory[MOTION_HISTORY_ROLL][index];
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
144 result.pitch = motionDeltaHistory[MOTION_HISTORY_PITCH][index];
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
145 result.yaw = motionDeltaHistory[MOTION_HISTORY_YAW][index];
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
146 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
147 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
148 }
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
149
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
150 uint8_t GetSectorForFocus(float focusOffset)
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
151 {
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
152 uint8_t sector = 0;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
153 float compare = -1.0 * MOTION_FOCUS_USE_SECTOR + sectorDetection.size ; /* start with first sector upper limit */
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
154
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
155 while(compare <= MOTION_FOCUS_USE_SECTOR)
381
695434a6dcf6 Simplified pitch detection state machine:
ideenmodellierer
parents: 378
diff changeset
156 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
157 if(focusOffset > compare)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
158 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
159 sector++;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
160 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
161 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
162 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
163 break;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
164 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
165 compare += sectorDetection.size;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
166 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
167 if(sector >= sectorDetection.count)
381
695434a6dcf6 Simplified pitch detection state machine:
ideenmodellierer
parents: 378
diff changeset
168 {
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
169 sector = sectorDetection.count - 1;
381
695434a6dcf6 Simplified pitch detection state machine:
ideenmodellierer
parents: 378
diff changeset
170 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
171 return sector;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
172 }
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
173
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
174 void DefineSectorCount(uint8_t numOfSectors)
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
175 {
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
176 if(numOfSectors == CUSTOMER_DEFINED_VIEWS)
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
177 {
384
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
178 if(settingsGetPointer()->design == 3) /* Big font view ? */
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
179 {
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
180 sectorDetection.count = t3_GetEnabled_customviews();
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
181 }
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
182 else
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
183 {
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
184 sectorDetection.count = t7_GetEnabled_customviews();
427ae9f8e28e Consider number of available t3 views in sector handling:
ideenmodellierer
parents: 383
diff changeset
185 }
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
186 if(sectorDetection.count > SECTOR_MAX_CNT)
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
187 {
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
188 sectorDetection.count = SECTOR_MAX_CNT; /* more views are hard to manually control */
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
189 }
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
190 }
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
191 else
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
192 if(numOfSectors != CUSTOMER_KEEP_LAST_SECTORS)
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
193 {
383
49a02dea8ae3 Combine variables in a structure to improve readability of code
ideenmodellierer
parents: 381
diff changeset
194 sectorDetection.count = numOfSectors;
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
195 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
196 sectorDetection.size = MOTION_FOCUS_USE_SECTOR * 2.0 / sectorDetection.count;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
197 }
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
198
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
199
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
200 uint8_t GetCVForSector(uint8_t selSector)
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
201 {
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
202 if(selSector < sectorDetection.count)
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
203 {
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
204 return sectorMap[selSector];
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
205 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
206 else
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
207 {
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
208 return 0;
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
209 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
210 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
211
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
212 void MapCVToSector()
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
213 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
214 uint8_t ViewIndex = 0;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
215 memset(sectorMap, 0, sizeof(sectorMap));
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
216
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
217 while(ViewIndex < (sectorDetection.count / 2)) /* define center sector */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
218 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
219 ViewIndex++;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
220 }
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
221
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
222 if(settingsGetPointer()->design == 3) /* Big font view ? */
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
223 {
595
fd0b60dee6f3 Bugfix Selection of primary view:
Ideenmodellierer
parents: 592
diff changeset
224 t3_set_customview_to_primary();
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
225 sectorMap[ViewIndex] = t3_change_customview(ACTION_END);
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
226 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
227 else
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
228 {
595
fd0b60dee6f3 Bugfix Selection of primary view:
Ideenmodellierer
parents: 592
diff changeset
229 t7_set_customview_to_primary();
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
230 sectorMap[ViewIndex] = t7_change_customview(ACTION_END);
595
fd0b60dee6f3 Bugfix Selection of primary view:
Ideenmodellierer
parents: 592
diff changeset
231
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
232 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
233
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
234 ViewIndex++;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
235 while(sectorMap[ViewIndex] == 0)
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
236 {
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
237 if(settingsGetPointer()->design == 3) /* Big font view ? */
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
238 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
239 sectorMap[ViewIndex] = t3_change_customview(ACTION_BUTTON_ENTER);
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
240 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
241 else
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
242 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
243 sectorMap[ViewIndex] = t7_change_customview(ACTION_BUTTON_ENTER);
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
244 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
245 ViewIndex++;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
246 if(ViewIndex == sectorDetection.count)
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
247 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
248 ViewIndex = 0;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
249 }
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
250 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
251
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
252 }
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
253
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
254 void InitMotionDetection(void)
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
255 {
383
49a02dea8ae3 Combine variables in a structure to improve readability of code
ideenmodellierer
parents: 381
diff changeset
256 sectorDetection.target = 0;
49a02dea8ae3 Combine variables in a structure to improve readability of code
ideenmodellierer
parents: 381
diff changeset
257 sectorDetection.current = 0;
49a02dea8ae3 Combine variables in a structure to improve readability of code
ideenmodellierer
parents: 381
diff changeset
258 sectorDetection.size = 0;
49a02dea8ae3 Combine variables in a structure to improve readability of code
ideenmodellierer
parents: 381
diff changeset
259 sectorDetection.count = 0;
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
260
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
261 switch(settingsGetPointer()->MotionDetection)
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
262 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
263 case MOTION_DETECT_SECTOR: DefineSectorCount(CUSTOMER_DEFINED_VIEWS);
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
264 MapCVToSector();
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
265 break;
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
266 case MOTION_DETECT_MOVE: DefineSectorCount(SECTOR_MAX);
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
267 break;
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
268 case MOTION_DETECT_SCROLL: DefineSectorCount(SECTOR_SCROLL);
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
269 break;
371
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
270 default:
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
271 break;
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
272 }
fca370f847f8 Added parameter for number of sectors to be defined
ideenmodellierer
parents: 370
diff changeset
273
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
274 resetMotionDeltaHistory();
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
275 }
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
276
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
277 /* Map the current pitch value to a sector and create button event in case the sector is left */
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
278 detectionState_t detectSectorButtonEvent(float focusOffset)
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
279 {
642
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
280 static uint8_t lastTargetSector = 0xFF;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
281 static float lastfocusOffset = 0.0;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
282
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
283 uint8_t newTargetSector;
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
284
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
285 newTargetSector = GetSectorForFocus(focusOffset);
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
286
642
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
287 /* take a small hysteresis into account to avoid fast display changes (flicker) */
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
288 if((newTargetSector != lastTargetSector) && (fabsf(focusOffset - lastfocusOffset) > (sectorDetection.size / 3)))
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
289 {
642
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
290 lastfocusOffset = focusOffset;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
291 if(settingsGetPointer()->design == 3) /* Big font view ? */
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
292 {
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
293 t3_select_customview(GetCVForSector(newTargetSector));
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
294 }
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
295 else
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
296 {
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
297 t7_select_customview(GetCVForSector(newTargetSector));
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
298 }
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
299 }
592
f52bc70e380f MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents: 585
diff changeset
300 return DETECT_NOTHING;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
301 }
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
302
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
303 /* Check if pitch is not in center position and trigger a button action if needed */
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
304 detectionState_t detectScrollButtonEvent(float focusOffset)
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
305 {
378
834e087505ec Incremented "idle window" for scroll detection
ideenmodellierer
parents: 373
diff changeset
306 static uint8_t delayscroll = 0; /* slow down the number of scroll events */
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
307
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
308 uint8_t PitchEvent = DETECT_NOTHING;
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
309
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
310 if(delayscroll == 0)
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
311 {
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
312 if(focusOffset > MOTION_FOCUS_SCROLL_IDLE)
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
313 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
314 PitchEvent = DETECT_POS_PITCH;
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
315 delayscroll = 7;
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
316 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
317 if(focusOffset < (-1.0 * MOTION_FOCUS_SCROLL_IDLE))
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
318 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
319 PitchEvent = DETECT_NEG_PITCH;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
320 delayscroll = 7;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
321 }
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
322 }
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
323 else
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
324 {
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
325 delayscroll--;
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
326 }
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
327 return PitchEvent;
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
328 }
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
329
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
330
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
331 /* Detect if user is generating an pitch including return to starting position */
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
332 /* This is done by feeding the past movements value per value into a state machine */
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
333 detectionState_t detectPitch(float currentPitch)
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
334 {
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
335 static int8_t lastStart = 0;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
336 uint8_t exit = 0;
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
337 int8_t step = 0;
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
338 uint8_t duration = 0;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
339 SDeltaHistory test;
370
77cdfbdaca8c Changed function names from shake to pitch and improved detection function: Shake might be confusing for people reading the code because pitch values are ased for calculation => changed name to pitch to be more transparent
ideenmodellierer
parents: 363
diff changeset
340
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
341 if(lastStart < 0)
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
342 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
343 detectionState = DETECT_NOTHING;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
344 lastStart = 0;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
345 }
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
346 else
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
347 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
348 detectionState = DETECT_START;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
349 }
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
350 step = lastStart;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
351 do
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
352 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
353 test = GetDeltaHistory(step);
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
354 duration++;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
355 switch (detectionState)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
356 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
357 case DETECT_NOTHING: if(test.pitch > MOTION_DELTA_STABLE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
358 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
359 exit = 1;
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
360 lastStart = -2;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
361 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
362 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
363 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
364 detectionState = DETECT_START;
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
365 lastStart = -1;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
366 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
367 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
368 case DETECT_START: if(test.pitch == MOTION_DELTA_RAISE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
369 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
370 detectionState = DETECT_POS_MOVE;
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
371 lastStart = step;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
372 }
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
373 else
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
374 if(test.pitch == MOTION_DELTA_FALL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
375 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
376 detectionState = DETECT_NEG_MOVE;
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
377 lastStart = step;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
378 }
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
379 else
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
380 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
381 lastStart = -1;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
382 }
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
383 duration = 0;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
384 break;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
385 case DETECT_NEG_MOVE: if((test.pitch <= MOTION_DELTA_JITTER) || (test.pitch == MOTION_DELTA_RAISE) || (test.pitch == MOTION_DELTA_RAISE_FAST))
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
386 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
387 detectionState++;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
388 }
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
389 break;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
390 case DETECT_POS_MOVE: if((test.pitch <= MOTION_DELTA_JITTER) || (test.pitch == MOTION_DELTA_FALL) || (test.pitch == MOTION_DELTA_FALL_FAST))
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
391 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
392 detectionState++;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
393 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
394 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
395 case DETECT_MAXIMA: if(test.pitch == MOTION_DELTA_FALL)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
396 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
397 detectionState = DETECT_FALLBACK;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
398 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
399 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
400 case DETECT_MINIMA: if(test.pitch == MOTION_DELTA_RAISE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
401 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
402 detectionState = DETECT_RISEBACK;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
403 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
404 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
405 case DETECT_RISEBACK:
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
406 case DETECT_FALLBACK: if(test.pitch == MOTION_DELTA_STABLE)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
407 {
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
408 if(duration > 4) /* avoid detection triggered by short moves */
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
409 {
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
410 detectionState++;
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
411 }
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
412 exit = 1;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
413 lastStart = -2;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
414 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
415 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
416 default:
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
417 detectionState = DETECT_NOTHING;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
418 exit = 1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
419 break;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
420 }
578
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
421 step--;
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
422 } while((step >= 0) && (!exit));
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
423
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
424 if((lastStart < MOTION_DELTA_HISTORY_SIZE))
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
425 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
426 lastStart++; /* prepare value for next iteration (history index will be increased) */
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
427 }
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
428 else
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
429 {
beb4d47542f1 Rework pitch detection:
Ideenmodellierer
parents: 574
diff changeset
430 lastStart = -1;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
431 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
432 if((detectionState != DETECT_POS_PITCH) && (detectionState != DETECT_NEG_PITCH)) /* nothing found */
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
433 {
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
434 detectionState = DETECT_NOTHING;
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
435 }
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
436 else /* dont detect the same event twice */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
437 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
438 resetMotionDeltaHistory();
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
439 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
440 return detectionState;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
441 }
363
bdf978d2a5d4 Reworked detection function
ideenmodellierer
parents: 362
diff changeset
442
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
443 void anglesToCoord(float roll, float pitch, float yaw, SCoord *pCoord)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
444 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
445 pCoord->x = ((cosf(yaw) * cosf(pitch)) * pCoord->x + (cosf(yaw)*sinf(pitch)*sinf(roll) - (sinf(yaw)* cosf(roll))) * pCoord->y + (cosf(yaw)*sinf(pitch)*cosf(roll) + sinf(yaw)*sinf(roll)) * pCoord->z);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
446 pCoord->y = ((sinf(yaw) * cosf(pitch)) * pCoord->x + (sinf(yaw)*sinf(pitch)*sinf(roll) + cosf(yaw) * cosf(roll)) * pCoord->y + ( sinf(yaw) * sinf(pitch) * cosf(roll) - cosf(yaw) * sinf(roll))* pCoord->z);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
447 pCoord->z = ((-1*sinf(pitch)) * pCoord->x + (cosf(pitch) *sinf(roll)) * pCoord->y + (cosf(pitch) * cosf(roll))* pCoord->z);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
448 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
449
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
450 SCoord CoordAdd(SCoord cA, SCoord cB)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
451 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
452 SCoord result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
453
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
454 result.x = cA.x + cB.x;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
455 result.y = cA.y + cB.y;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
456 result.z = cA.z + cB.z;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
457 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
458 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
459
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
460 SCoord CoordSub(SCoord cA, SCoord cB)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
461 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
462 SCoord result;
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
463
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
464 result.x = cA.x - cB.x;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
465 result.y = cA.y - cB.y;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
466 result.z = cA.z - cB.z;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
467 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
468 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
469
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
470 SCoord CoordCross(SCoord cA, SCoord cB)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
471 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
472 SCoord result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
473
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
474 result.x = (cA.y * cB.z) - (cA.z * cB.y);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
475 result.y = (cA.z * cB.x) - (cA.x * cB.z);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
476 result.z = (cA.x * cB.y) - (cA.y * cB.x);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
477
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
478 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
479
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
480 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
481
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
482 SCoord CoordMulF(SCoord op, float factor)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
483 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
484 SCoord result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
485 result.x = (op.x * factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
486 result.y = (op.y * factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
487 result.z = (op.z * factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
488
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
489 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
490 }
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
491
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
492 SCoord CoordDivF(SCoord op, float factor)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
493 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
494 SCoord result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
495 result.x = (op.x / factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
496 result.y = (op.y / factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
497 result.z = (op.z / factor);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
498
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
499 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
500 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
501
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
502 float CoordDot(SCoord cA, SCoord cB)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
503 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
504 float result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
505
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
506 result = cA.x * cB.x + cA.y * cB.y + cB.z*cA.z;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
507 return result;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
508 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
509
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
510 void calibrateViewport(float roll, float pitch, float yaw)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
511 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
512 SSettings* pSettings = settingsGetPointer();
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
513
621
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
514 pSettings->viewPitch = pitch + 180;
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
515 pSettings->viewRoll = roll+ 180;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
516 pSettings->viewYaw = yaw;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
517 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
518
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
519
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
520 float checkViewport(float roll, float pitch, float yaw, uint8_t enableAxis)
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
521 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
522 uint8_t retval = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
523 float angleYaw;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
524 float anglePitch;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
525 float angleRoll;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
526 float distance = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
527 float _a, _b;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
528 SCoord u,v,n;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
529 float r = 0.0;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
530 float focusLimit = 0;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
531
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
532 SCoord refVec;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
533 SCoord axis_1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
534 SCoord axis_2;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
535 SCoord curVec;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
536 SCoord resultVec;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
537
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
538 SDeltaHistory movementDelta;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
539
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
540 SSettings* pSettings = settingsGetPointer();
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
541
621
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
542 roll += 180;
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
543 pitch += 180;
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
544
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
545 /* calculate base vector taking calibration delta into account yaw (heading) */
621
6826731ff2be Use roll and pitch agles in 0-360 format:
Ideenmodellierer
parents: 618
diff changeset
546 float compYaw;
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
547
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
548 if(enableAxis & MOTION_ENABLE_YAW)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
549 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
550 compYaw = 360.0 - yaw; /* turn to 0° */
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
551 compYaw += pSettings->viewYaw; /* consider calib yaw value */
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
552 compYaw += yaw;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
553
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
554 if (compYaw < 0.0)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
555 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
556 compYaw = 360.0 + compYaw;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
557 }
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
558
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
559 if (compYaw > 360.0)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
560 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
561 compYaw = compYaw - 360.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
562 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
563 if (compYaw > 360.0)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
564 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
565 compYaw = compYaw - 360.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
566 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
567 angleYaw = pSettings->viewYaw * M_PI / 180.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
568 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
569 else
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
570 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
571 compYaw = 0.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
572 angleYaw = 0.0;
381
695434a6dcf6 Simplified pitch detection state machine:
ideenmodellierer
parents: 378
diff changeset
573 }
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
574
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
575 if(enableAxis & MOTION_ENABLE_PITCH)
381
695434a6dcf6 Simplified pitch detection state machine:
ideenmodellierer
parents: 378
diff changeset
576 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
577 anglePitch = pSettings->viewPitch * M_PI / 180.0;
373
7b981f8bdd41 Add scroll event by pitch angle detection:
ideenmodellierer
parents: 371
diff changeset
578 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
579 else
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
580 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
581 anglePitch = 0;
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
582 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
583 if(enableAxis & MOTION_ENABLE_ROLL)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
584 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
585 angleRoll = pSettings->viewRoll * M_PI / 180.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
586 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
587 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
588 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
589 angleRoll = 0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
590 }
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
591
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
592 refVec.x = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
593 refVec.y = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
594 refVec.z = 1.0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
595
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
596 anglesToCoord(angleRoll,anglePitch,angleYaw, &refVec);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
597
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
598 /* assume x = 0 and y = 1 => find matching vector so axis_1 is 90° to axis_2 */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
599 axis_1.x = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
600 if(refVec.y >=0)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
601 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
602 axis_2.y = 1; /* => Spawn y == refVec y */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
603 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
604 else axis_1.y = -1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
605 axis_1.z = -1.0 * refVec.y / refVec.z;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
606 axis_2 = CoordCross(refVec, axis_1); /* Cross is 90° to refVec and Spawn as well => Plane Spawn / cross */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
607
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
608 /* check if detection plane is correct */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
609 u = CoordSub(axis_1,refVec);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
610 v = CoordSub(axis_2,refVec);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
611 n = CoordCross(u,v);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
612
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
613 if((fabsf(n.x) <= 0.0001) && (fabsf(n.y) <= 0.0001) && (fabsf(n.z) <= 0.0001))
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
614 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
615 retval = 2;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
616 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
617 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
618 {
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
619 if(enableAxis & MOTION_ENABLE_PITCH)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
620 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
621 anglePitch = pitch * M_PI / 180.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
622 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
623 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
624 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
625 anglePitch = 0.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
626 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
627 if(enableAxis & MOTION_ENABLE_ROLL)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
628 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
629 angleRoll = roll * M_PI / 180.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
630 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
631 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
632 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
633 angleRoll = 0.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
634 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
635 if(enableAxis & MOTION_ENABLE_YAW)
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
636 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
637 angleYaw = compYaw * M_PI / 180.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
638 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
639 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
640 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
641 angleYaw = 0.0;
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
642 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
643
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
644 curVec.x = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
645 curVec.y = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
646 curVec.z = 1.0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
647 anglesToCoord(angleRoll,anglePitch,angleYaw, &curVec);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
648
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
649 _a = CoordDot(curVec,n);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
650 _b = CoordDot(refVec,n);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
651
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
652 if(_b>=(-0.0001)&&_b<=0.0001) /* Check if view port is parallel (no matchpoint) */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
653 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
654 retval = 3;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
655 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
656 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
657 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
658 r=_a/_b;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
659 if(r<0.00||r>1.40) /* are we looking into wrong direction? */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
660 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
661 retval = 4;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
662 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
663 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
664 distance = retval * 1.0; /* just for debugging */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
665 if(retval == 0)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
666 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
667 /* start calculating the matchpoint */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
668 curVec = CoordMulF(curVec,r);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
669 resultVec = CoordSub(refVec,curVec);
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
670
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
671 /* calculate the distance between reference and actual vector */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
672 resultVec.x = resultVec.x * resultVec.x;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
673 resultVec.y = resultVec.y * resultVec.y;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
674 resultVec.z = resultVec.z * resultVec.z;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
675
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
676 if((resultVec.x == 0) && (resultVec.y == 0) && (resultVec.z == 0))
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
677 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
678 distance = 0.0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
679 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
680 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
681 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
682 distance = sqrtf((resultVec.x + resultVec.y + resultVec.z));
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
683 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
684 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
685 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
686
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
687 movementDelta = GetDeltaHistory(0);
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
688
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
689 if(inFocus == 0) /* consider option to use smaller spot to detect focus state */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
690 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
691 focusLimit = MOTION_FOCUS_LIMIT - (((pSettings->viewPortMode >> 5) & 0x03) / 10.0);
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
692 }
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
693 else
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
694 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
695 focusLimit = MOTION_FOCUS_LIMIT; /* use standard spot to detect diver interactions */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
696 }
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
697
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
698 if((distance <= focusLimit) && (movementDelta.yaw != MOTION_DELTA_RAISE_FAST) && (movementDelta.yaw != MOTION_DELTA_FALL_FAST)) /* handle focus counter to avoid fast in/out focus changes */
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
699 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
700 if(focusCnt < 10)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
701 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
702 if((focusCnt == 9) && (inFocus == 0)) /* we will get into focus */
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
703 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
704 resetMotionDeltaHistory();
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
705 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
706 focusCnt++;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
707 }
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
708 if((focusCnt == 10) && (inFocus == 0))
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
709 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
710 inFocus = 1;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
711 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
712 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
713 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
714 {
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
715 if((movementDelta.yaw > MOTION_DELTA_JITTER ) && (focusCnt >= 5))
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
716 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
717 focusCnt--;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
718 }
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
719 if(focusCnt >= 5) /* Reset focus faster then setting focus */
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
720 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
721 focusCnt--;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
722 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
723 else
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
724 {
574
01ee21dd311f Improved focus detection:
Ideenmodellierer
parents: 551
diff changeset
725 focusCnt = 0;
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
726 inFocus = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
727 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
728 }
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
729 if ((r<1) && (retval == 0)) /* add direction information to distance */
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
730 {
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
731 distance *= -1.0;
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
732 }
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
733 return distance;
359
4258ea9b67fa Added new files for motion detection (shaking) detection
ideenmodellierer
parents:
diff changeset
734 }
551
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
735 uint8_t viewInFocus(void)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
736 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
737 return inFocus;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
738 }
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
739 void resetFocusState(void)
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
740 {
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
741 inFocus = 0;
e3237f580ae9 Added viewport functionality:
Ideenmodellierer
parents: 385
diff changeset
742 }
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
743
642
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
744 uint8_t viewDetectionSuspended(void)
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
745 {
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
746 uint8_t retVal = 0;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
747
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
748 if(suspendMotionDetectionSec)
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
749 {
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
750 retVal = 1;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
751 }
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
752 return retVal;
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
753 }
c737cf5d9067 Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents: 627
diff changeset
754
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
755 void suspendMotionDetection(uint8_t seconds)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
756 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
757 suspendMotionDetectionSec = seconds * 10; /* detection function is called every 100ms */
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
758 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
759
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
760 void HandleMotionDetection(void)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
761 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
762 detectionState_t pitchstate = DETECT_NOTHING;
618
96af74455420 Development bugfix: focus state not remembered:
Ideenmodellierer
parents: 611
diff changeset
763 static uint8_t wasInFocus = 0;
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
764 float focusOffset = 0.0;
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
765
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
766 evaluateMotionDelta(stateUsed->lifeData.compass_roll, stateUsed->lifeData.compass_pitch, stateUsed->lifeData.compass_heading);
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
767 if(viewInFocus())
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
768 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
769 focusOffset = checkViewport(stateUsed->lifeData.compass_roll, stateUsed->lifeData.compass_pitch, stateUsed->lifeData.compass_heading, (MOTION_ENABLE_PITCH | MOTION_ENABLE_YAW));
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
770 }
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
771 else
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
772 {
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
773 focusOffset = checkViewport(stateUsed->lifeData.compass_roll, stateUsed->lifeData.compass_pitch, stateUsed->lifeData.compass_heading, MOTION_ENABLE_ALL);
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
774 }
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
775 if(viewInFocus())
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
776 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
777 wasInFocus = 1;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
778 set_Backlight_Boost(settingsGetPointer()->viewPortMode & 0x03);
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
779
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
780 if(suspendMotionDetectionSec == 0) /* suspend detection while diver is manually operating the OSTC */
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
781 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
782 switch(settingsGetPointer()->MotionDetection)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
783 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
784 case MOTION_DETECT_MOVE: pitchstate = detectPitch(stateRealGetPointer()->lifeData.compass_pitch);
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
785 break;
625
028d8f3a9410 Switch Sector / Scroll detection to vector implementation:
Ideenmodellierer
parents: 621
diff changeset
786 case MOTION_DETECT_SECTOR: pitchstate = detectSectorButtonEvent(focusOffset);
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
787 break;
627
189f945ae4ba Improve in / out of focus transitions:
Ideenmodellierer
parents: 625
diff changeset
788 case MOTION_DETECT_SCROLL: pitchstate = detectScrollButtonEvent(fabs(focusOffset));
611
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
789 break;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
790 default:
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
791 pitchstate = DETECT_NOTHING;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
792 break;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
793 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
794 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
795
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
796 if(DETECT_NEG_PITCH == pitchstate)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
797 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
798 StoreButtonAction((uint8_t)ACTION_PITCH_NEG);
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
799 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
800 if(DETECT_POS_PITCH == pitchstate)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
801 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
802 StoreButtonAction((uint8_t)ACTION_PITCH_POS);
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
803 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
804 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
805 else
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
806 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
807 if(wasInFocus)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
808 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
809 wasInFocus = 0;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
810 if(suspendMotionDetectionSec == 0)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
811 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
812 if(settingsGetPointer()->design == 7)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
813 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
814 t7_set_customview_to_primary();
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
815 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
816 else
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
817 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
818 t3_set_customview_to_primary();
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
819 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
820 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
821 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
822 set_Backlight_Boost(0);
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
823 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
824 if(suspendMotionDetectionSec != 0)
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
825 {
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
826 suspendMotionDetectionSec--;
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
827 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
828 }
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
829
916998f90e39 Suspend MotionDetection events while diver is operationg the OSTC:
Ideenmodellierer
parents: 595
diff changeset
830