view Discovery/Inc/motion.h @ 830:b7d93ff6b3b2 Evo_2_23

Added selection if an active gas shall be used for deco calculation or not: In previous version selecting a gas as deco gas automatically activated the gas for deco calculation. Some divers prever to have the deco time displayed which matches to the gas currently in use. These divers kept the gas deactivated unless they switch to it. Features like gas usability visualization or easy gas change using quick selection were not usable for these divers. With introduction of the new option the gas switching / visualization features may be used without having the gas been considered for calculation in the background. The option may be operated in the gas selection menu.
author Ideenmodellierer
date Thu, 16 Nov 2023 20:32:09 +0100
parents c737cf5d9067
children
line wrap: on
line source

/*
 * motion.h
 *
 *  Created on: 20.05.2019
 *      Author: Thorsten Sonntag
 */

#ifndef INC_MOTION_H_
#define INC_MOTION_H_


/* exported data types */
#define CUSTOMER_DEFINED_VIEWS	(100u)	/* value will cause the function to detect the number of selected views */
#define CUSTOMER_KEEP_LAST_SECTORS	(200u)	/* do not update number of sectors, just define the new center position */

#define MOTION_ENABLE_ROLL	(0x01u)
#define MOTION_ENABLE_PITCH	(0x02u)
#define MOTION_ENABLE_YAW	(0x04u)
#define MOTION_ENABLE_ALL	(MOTION_ENABLE_ROLL | MOTION_ENABLE_PITCH | MOTION_ENABLE_YAW)

typedef enum
{
		MOTION_DETECT_OFF = 0,
		MOTION_DETECT_SECTOR,
		MOTION_DETECT_MOVE,
		MOTION_DETECT_SCROLL,
		MOTION_DETECT_END
} MotionDetectMethod_t;

typedef enum
{
		DETECT_START = 0,
		DETECT_POS_MOVE,
		DETECT_MAXIMA,
		DETECT_FALLBACK,
		DETECT_POS_PITCH,
		DETECT_NEG_MOVE,
		DETECT_MINIMA,
		DETECT_RISEBACK,
		DETECT_NEG_PITCH,
		DETECT_NOTHING
} detectionState_t;

typedef struct
{
    float upperborder;			/* current sector is changed if pitch exceeds these borders */
    float lowerborder;

    uint8_t current;			/* number of the current visible sector */
    uint8_t target;				/* used for sector switch => number of the sector which shall be finnaly displayed */

    float offset;				/* offset to adjust minimum pitch value used for detection to zero */
    float size;					/* delta of upper and lower boarder defining the sector in degree */
    float window;				/* defines which range of pitch values are used for detection */
    float center;				/* defines the offset from pitch to middle of active sector (avoid center position is close to the calculated borders) */
    uint8_t count;				/* number of sectors used for detection */
} SSector;

typedef struct
{
	float x;
	float y;
	float z;
} SCoord;

typedef enum
{
		MOTION_HISTORY_ROLL = 0,
		MOTION_HISTORY_PITCH,
		MOTION_HISTORY_YAW
} MotionHistoryEntry_t;

typedef struct
{
	uint8_t roll;
	uint8_t pitch;
	uint8_t yaw;
} SDeltaHistory;

void InitMotionDetection(void);
void suspendMotionDetection(uint8_t seconds);
void HandleMotionDetection(void);
void resetMotionDeltaHistory();
void evaluateMotionDelta(float roll, float pitch, float yaw);
void DefineSectorCount(uint8_t numOfSectors);
void MapCVToSector(void);
detectionState_t detectPitch(float currentPitch);
detectionState_t detectSectorButtonEvent(float focusOffset);
detectionState_t detectScrollButtonEvent(float focusOffset);

void anglesToCoord(float roll, float pitch, float yaw, SCoord *pCoord);
void calibrateViewport(float roll, float pitch, float yaw);
float checkViewport(float roll, float pitch, float yaw, uint8_t enableAxis);
uint8_t viewInFocus(void);
uint8_t viewDetectionSuspended(void);
void resetFocusState(void);

#endif /* INC_MOTION_H_ */