/* * This file is part of Cleanflight. * * Cleanflight is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cleanflight is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Cleanflight. If not, see . */ #pragma once #include #include "config/parameter_group.h" typedef enum { BOXARM = 0, BOXANGLE, BOXHORIZON, BOXBARO, BOXANTIGRAVITY, BOXMAG, BOXHEADFREE, BOXHEADADJ, BOXCAMSTAB, BOXCAMTRIG, BOXGPSHOME, BOXGPSHOLD, BOXPASSTHRU, BOXBEEPERON, BOXLEDMAX, BOXLEDLOW, BOXLLIGHTS, BOXCALIB, BOXGOV, BOXOSD, BOXTELEMETRY, BOXGTUNE, BOXSONAR, BOXSERVO1, BOXSERVO2, BOXSERVO3, BOXBLACKBOX, BOXFAILSAFE, BOXAIRMODE, BOX3DDISABLESWITCH, BOXFPVANGLEMIX, BOXBLACKBOXERASE, BOXCAMERA1, BOXCAMERA2, BOXCAMERA3, CHECKBOX_ITEM_COUNT } boxId_e; // type to hold enough bits for CHECKBOX_ITEM_COUNT. Struct used for value-like behavior typedef struct { uint32_t bits[(CHECKBOX_ITEM_COUNT + 31) / 32]; } boxBitmask_t; #define MAX_MODE_ACTIVATION_CONDITION_COUNT 20 #define CHANNEL_RANGE_MIN 900 #define CHANNEL_RANGE_MAX 2100 #define MODE_STEP_TO_CHANNEL_VALUE(step) (CHANNEL_RANGE_MIN + 25 * step) #define CHANNEL_VALUE_TO_STEP(channelValue) ((constrain(channelValue, CHANNEL_RANGE_MIN, CHANNEL_RANGE_MAX) - CHANNEL_RANGE_MIN) / 25) #define MIN_MODE_RANGE_STEP 0 #define MAX_MODE_RANGE_STEP ((CHANNEL_RANGE_MAX - CHANNEL_RANGE_MIN) / 25) // steps are 25 apart // a value of 0 corresponds to a channel value of 900 or less // a value of 48 corresponds to a channel value of 2100 or more // 48 steps between 900 and 1200 typedef struct channelRange_s { uint8_t startStep; uint8_t endStep; } channelRange_t; typedef struct modeActivationCondition_s { boxId_e modeId; uint8_t auxChannelIndex; channelRange_t range; } modeActivationCondition_t; PG_DECLARE_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions); typedef struct modeActivationProfile_s { modeActivationCondition_t modeActivationConditions[MAX_MODE_ACTIVATION_CONDITION_COUNT]; } modeActivationProfile_t; #define IS_RANGE_USABLE(range) ((range)->startStep < (range)->endStep) bool IS_RC_MODE_ACTIVE(boxId_e boxId); void rcModeUpdate(boxBitmask_t *newState); bool isAirmodeActive(void); bool isAntiGravityModeActive(void); bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range); void updateActivatedModes(void); bool isModeActivationConditionPresent(boxId_e modeId);