Merge remote-tracking branch 'refs/remotes/origin/Failsafe-and-toggles'
This commit is contained in:
commit
d3112e7128
@ -74,12 +74,25 @@ typedef struct
|
||||
uint32_t averageExecutionTime; // Moving average over 6 samples, used to calculate guard interval
|
||||
uint32_t taskLatestDeltaTime; //
|
||||
#ifndef SKIP_TASK_STATISTICS
|
||||
uint32_t taskAverageDeltaTime;
|
||||
uint32_t maxExecutionTime;
|
||||
uint32_t totalExecutionTime; // total time consumed by task since boot
|
||||
#endif
|
||||
|
||||
}task_t;
|
||||
|
||||
/* Struct used to store statistical data of the scheduler */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t totalSystemRuntime;
|
||||
uint32_t totalTaskRuntime; //Total time spent for tasks running
|
||||
uint32_t totalOverHead; //Total overhead when selecting a task
|
||||
uint32_t averageOverHead;
|
||||
uint32_t totalMissedPeriods; //Number of time any task have missed a period
|
||||
uint32_t totalSchedulerCalls; //amount of times scheduler have been called
|
||||
uint32_t totalTasksScheduled; //the total amount of tasks schedulede
|
||||
}scheduler_statistics_t;
|
||||
|
||||
|
||||
/* Task counter, ToDo: If more tasks are needed add them here first, defines are used to make sure the task is somewhere in the system */
|
||||
/* Important: If a new define for a task is added here it MUST be added in the tasks.c */
|
||||
@ -129,6 +142,7 @@ typedef enum
|
||||
}taskId_t;
|
||||
|
||||
/* Variables -------------------------------------------------------------*/
|
||||
extern scheduler_statistics_t systemSchedulerStatistics;
|
||||
extern task_t SystemTasks[TASK_COUNT]; /* All the tasks that exist in the system */
|
||||
extern uint16_t averageSystemLoadPercent; /* The average load on the system Todo */
|
||||
|
||||
|
@ -172,10 +172,21 @@ typedef enum {
|
||||
EEPROM_PERIOD_ALTITUDE,
|
||||
#endif
|
||||
#if BEEPER
|
||||
EEPROM_PERIOD_BEEPER
|
||||
EEPROM_PERIOD_BEEPER,
|
||||
#endif
|
||||
|
||||
/* Motormix values */
|
||||
EEPROM_MOTORMIX_CONFIG,
|
||||
|
||||
/* Flags eeprom values */
|
||||
EEPROM_FLAG_ARM,
|
||||
EEPROM_FLAG_FLIGHTMODE_ACCELEROMETER,
|
||||
EEPROM_FLAG_FLIGHTMODE_BAROMETER,
|
||||
EEPROM_FLAG_FLIGHTMODE_COMPASS,
|
||||
EEPROM_FLAG_FLIGHTMODE_GPS,
|
||||
EEPROM_FLAG_AIRMODE,
|
||||
EEPROM_FLAG_FLIGHTMODE_2,
|
||||
EEPROM_FLAG_FLIGHTMODE_3,
|
||||
|
||||
/* Counts the amount of system settings */
|
||||
EEPROM_SYS_COUNT
|
||||
|
170
UAV-ControlSystem/inc/drivers/failsafe_toggles.h
Normal file
170
UAV-ControlSystem/inc/drivers/failsafe_toggles.h
Normal file
@ -0,0 +1,170 @@
|
||||
/*
|
||||
* failsafe_toggles.h
|
||||
*
|
||||
* Created on: 10 okt. 2016
|
||||
* Author: holmis
|
||||
*/
|
||||
|
||||
#ifndef DRIVERS_FAILSAFE_TOGGLES_H_
|
||||
#define DRIVERS_FAILSAFE_TOGGLES_H_
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
//Macro functions
|
||||
#define getFlagMaskValue(x) (1 << x)
|
||||
|
||||
#define failSafe_vals_offset 0 //offset for the fail safe values in the bitfield
|
||||
#define boolean_vals_offset 2 //offset for the booleans values in the bitfield
|
||||
|
||||
/*If a new value is added to the bitfield these IDs must be reviewed and checkd so that they still are correct*/
|
||||
//failsafe values
|
||||
#define systemFlags_Failsafe_rcChannelInRange_id 0 + failSafe_vals_offset
|
||||
#define systemFlags_Failsafe_noRcReceived_id 1 + failSafe_vals_offset
|
||||
|
||||
//other flags
|
||||
#define systemFlags_armed_id 0 + boolean_vals_offset
|
||||
#define systemFlags_flightmode_acceleromter_id 1 + boolean_vals_offset
|
||||
#define systemFlags_flightmode_barometer_id 2 + boolean_vals_offset
|
||||
#define systemFlags_flightmode_compass_id 3 + boolean_vals_offset
|
||||
#define systemFlags_flightmode_gps_id 4 + boolean_vals_offset
|
||||
#define systemFlags_airmode_id 5 + boolean_vals_offset
|
||||
#define systemFlags_flightMode_2_id 6 + boolean_vals_offset
|
||||
#define systemFlags_flightMode_3_id 7 + boolean_vals_offset
|
||||
|
||||
|
||||
/*Mask values for each of the flag values*/
|
||||
//failsafe values
|
||||
#define systemFlags_Failsafe_rcChannelInRange_mask getFlagMaskValue(systemFlags_Failsafe_rcChannelInRange_id)
|
||||
#define systemFlags_Failsafe_noRcReceived_mask getFlagMaskValue(systemFlags_Failsafe_noRcReceived_id)
|
||||
|
||||
//other flags
|
||||
#define systemFlags_armed_mask getFlagMaskValue(systemFlags_armed_id)
|
||||
#define systemFlags_flightmode_acceleromter_mask getFlagMaskValue(systemFlags_flightmode_acceleromter_id)
|
||||
#define systemFlags_flightmode_barometer_mask getFlagMaskValue(systemFlags_flightmode_barometer_id)
|
||||
#define systemFlags_flightmode_compass_mask getFlagMaskValue(systemFlags_flightmode_compass_id)
|
||||
#define systemFlags_flightmode_gps_mask getFlagMaskValue(systemFlags_flightmode_gps_id)
|
||||
#define systemFlags_airmode_mask getFlagMaskValue(systemFlags_airmode_id)
|
||||
#define systemFlags_flightMode_2_mask getFlagMaskValue(systemFlags_flightMode_2_id)
|
||||
#define systemFlags_flightMode_3_mask getFlagMaskValue(systemFlags_flightMode_3_id)
|
||||
|
||||
|
||||
|
||||
//typedef for the boolean value
|
||||
typedef unsigned int booleanValue_t;
|
||||
|
||||
/* Struct containing all the failsafe on boolean values in the system */
|
||||
typedef union bitSetRegion
|
||||
{
|
||||
struct
|
||||
{
|
||||
//fail-safe booleans
|
||||
booleanValue_t rcChannelInRange : 1;
|
||||
booleanValue_t noRcReceived : 1;
|
||||
|
||||
//Flag boleans that are not fail-safe
|
||||
booleanValue_t armed : 1;
|
||||
booleanValue_t acceleromter : 1;
|
||||
booleanValue_t barometer : 1;
|
||||
booleanValue_t compass : 1;
|
||||
booleanValue_t gps : 1;
|
||||
booleanValue_t airmode : 1;
|
||||
booleanValue_t flightMode_2 : 1;
|
||||
booleanValue_t flightMode_3 : 1;
|
||||
}bitField;
|
||||
uint64_t intRepresentation;
|
||||
}boolFlags_t;
|
||||
|
||||
/* Stuct to define values that can be changed and manipulated by RC commands */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t minRange; //minimum range value in a RC channel (uint16 to save space, increase if higher ranges are needed)
|
||||
uint16_t maxRange; //maximum range value in a RC channel (uint16 to save space, increase if higher ranges are needed)
|
||||
uint8_t channelNumber; //The RC channel number for the value
|
||||
uint8_t flagId; //ID for the flag to be changed in the system
|
||||
}flags_Configuration_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FLAG_CONFIGURATION_ARM = 0,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_ACCELEROMETER,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_BAROMETER,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_COMPASS,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_GPS,
|
||||
FLAG_CONFIGURATION_AIRMODE,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_2,
|
||||
FLAG_CONFIGURATION_FLIGHTMODE_3,
|
||||
|
||||
//Counter
|
||||
FLAG_CONFIGURATION_COUNT
|
||||
}flags_configuration_IDs_t;
|
||||
|
||||
/* Stuct containing values for all the flags and failsafe booleans sin the system */
|
||||
extern boolFlags_t systemFlags;
|
||||
|
||||
/* Array of flag configurations. These are values that can be set by RC. */
|
||||
extern flags_Configuration_t flagConfigArr[FLAG_CONFIGURATION_COUNT];
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void initFlags();
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_ProcessRcChannel(int rcChannel_ID, int value);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Set_ID(int id);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Clear_ID(int id);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Toggle_ID(int id);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
bool flags_IsSet_ID(int id);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Set_MASK(int mask);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Clear_MASK(int mask);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Toggle_MASK(int mask);
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
bool flags_IsSet_MASK(int mask);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* DRIVERS_FAILSAFE_TOGGLES_H_ */
|
@ -43,6 +43,7 @@ typedef struct {
|
||||
uint16_t minCommand; // Pulse when motors are running idle (Armed)
|
||||
uint16_t maxCommand; // Max throttle allowed. Mixer can go higher than this though.
|
||||
uint16_t minCheck; // In Non Airmode: If throttle is below minCheck we set motors to minCommand
|
||||
uint16_t padding;
|
||||
bool pid_at_min_throttle; // When enabled PIDs are used at minimum throttle
|
||||
bool motorstop; // If enabled motors will stop spinning at no throttle when Armed
|
||||
bool yaw_reverse_direction; // Default should be 1. Can be either -1 or 1
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
#define SBUS_MAX_CHANNEL 18 // Including two digital
|
||||
#define STICK_CHANNEL_COUNT 4
|
||||
#define AUX_CHANNEL_COUNT 4
|
||||
#define MAX_AUX_CHANNEL_COUNT (SBUS_MAX_CHANNEL - STICK_CHANNEL_COUNT)
|
||||
|
||||
|
||||
@ -128,4 +129,11 @@ bool sbus_frame_available();
|
||||
***********************************************************************/
|
||||
void sbus_read();
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF: Give the value of a channel in "sbusChannelData" *
|
||||
* INFORMATION: Given a channel id the value of that channel will be *
|
||||
* returned. *
|
||||
***********************************************************************/
|
||||
int getChannelValue(sbusFrame_s frame, int id);
|
||||
|
||||
#endif /* DRIVERS_SBUS_H_ */
|
||||
|
@ -47,6 +47,7 @@ static uint32_t tasksExecutionTimeUs = 0; //Total execution time of the task
|
||||
//static uint32_t lastSystemLoadTimeValUs = 0; //Not used right now, would be used to calculate load with time vals
|
||||
|
||||
uint32_t taskAgeCycleStatisitcs[taskAgeCycleCounterSize]; //Age cycle statistics array
|
||||
scheduler_statistics_t systemSchedulerStatistics = {0}; //Struct holding scheduler statisitcs
|
||||
|
||||
/* Functions to operate on the task queue ------------------------------------------------------- */
|
||||
|
||||
@ -451,7 +452,10 @@ void scheduler(void)
|
||||
|
||||
#ifdef USE_TASK_AGE_CYCLE_STATISTICS
|
||||
if (taskToRun->taskAgeCycle > 1)
|
||||
{
|
||||
taskAgeCycleStatisitcs[taskToRun->taskAgeCycle] ++; //increment the statistic counter for age cycles if we miss period
|
||||
systemSchedulerStatistics.totalMissedPeriods ++;
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_LED_WARNINGS_MISSED_PERIOD
|
||||
if (taskToRun->taskAgeCycle > 1)
|
||||
@ -514,6 +518,12 @@ void scheduler(void)
|
||||
//Assign the selected task to the pointer for the current task
|
||||
currentTask = selectedTask;
|
||||
|
||||
//Calculate the overhead to select a new task
|
||||
uint32_t currentOverHead = (clock_get_us() - currentTime);
|
||||
systemSchedulerStatistics.totalOverHead += currentOverHead;
|
||||
systemSchedulerStatistics.averageOverHead = ((uint32_t)systemSchedulerStatistics.averageOverHead * 31 + currentOverHead) / 32;
|
||||
systemSchedulerStatistics.totalSchedulerCalls ++;
|
||||
|
||||
//If we have found a task to run, execute the function that the task is responsible for
|
||||
if (selectedTask != NULL)
|
||||
{
|
||||
@ -530,11 +540,16 @@ void scheduler(void)
|
||||
tasksExecutionTimeUs += taskExecutionTime; //Add the task execution time for each task execution, will be used to
|
||||
|
||||
//Save statistical values
|
||||
selectedTask->taskAverageDeltaTime = ((uint32_t)selectedTask->taskAverageDeltaTime * 31 + selectedTask->taskLatestDeltaTime) / 32;
|
||||
selectedTask->averageExecutionTime = ((uint32_t)selectedTask->averageExecutionTime * 31 + taskExecutionTime) / 32;
|
||||
selectedTask->totalExecutionTime += taskExecutionTime; // time consumed by scheduler + task
|
||||
selectedTask->maxExecutionTime = MAX(selectedTask->maxExecutionTime, taskExecutionTime);
|
||||
}
|
||||
|
||||
//statistical values for the scheduler
|
||||
systemSchedulerStatistics.totalTaskRuntime += taskExecutionTime;
|
||||
systemSchedulerStatistics.totalTasksScheduled ++;
|
||||
}
|
||||
systemSchedulerStatistics.totalSystemRuntime = clock_get_us();
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "utilities.h"
|
||||
#include "Scheduler/scheduler.h"
|
||||
|
||||
#define cliActivateCharacter 35
|
||||
#define commandValueError 0xFFFFFFFFFFFFFFFF
|
||||
@ -69,6 +70,7 @@ typedef enum
|
||||
ACTION_EXIT, //Exists the cli
|
||||
ACTION_REBOOT, //Reboots the entire system
|
||||
ACTION_RESET, //Resets the entire eeprom
|
||||
ACTION_STATS, //gives statistics on the system
|
||||
|
||||
//The number of actions
|
||||
ACTION_COUNT, //Count of the number of actions
|
||||
@ -88,7 +90,8 @@ const typeString commandAction_Strings[ACTION_COUNT] = {
|
||||
"profile",
|
||||
"exit",
|
||||
"reboot",
|
||||
"reset"
|
||||
"reset",
|
||||
"stats"
|
||||
};
|
||||
|
||||
/* String values descrbing information of a certain action */
|
||||
@ -103,7 +106,8 @@ const typeString commandActionInformation_Strings[ACTION_COUNT] = {
|
||||
"| profile - Changes the active profile between the values (1-3).\n\r",
|
||||
"| exit - Exits the CLI mode.\n\r",
|
||||
"| reboot - Exit CLI and reboots the system.\n\r",
|
||||
"| reset - Restore all the values to its default values-\n\r"
|
||||
"| reset - Restore all the values to its default values.\n\r",
|
||||
"| stats - Gives some current stats of the system and tasks.\n\r"
|
||||
};
|
||||
|
||||
/* String array containing all the signature examples for each action */
|
||||
@ -118,7 +122,8 @@ const typeString commandActionSignature_Strings[ACTION_COUNT] = {
|
||||
" profile number",
|
||||
" exit",
|
||||
" reboot",
|
||||
" reset"
|
||||
" reset",
|
||||
" stats"
|
||||
};
|
||||
|
||||
/* Size values for the values a command will require */
|
||||
@ -131,7 +136,8 @@ typedef enum
|
||||
VAL_UINT_32,
|
||||
VAL_INT_32,
|
||||
VAL_UINT_64,
|
||||
VAL_INT_64
|
||||
VAL_INT_64,
|
||||
VAL_BOOL
|
||||
}valueTypes_t;
|
||||
|
||||
/* ID values for individual command, all commands must have a uniqe ID value */
|
||||
@ -170,8 +176,56 @@ typedef enum
|
||||
COMMAND_ID_PERIOD_BEEPER,
|
||||
#endif
|
||||
|
||||
|
||||
/* Commands for chaning motormixer values */
|
||||
COMMAND_ID_MOTORMIX_MINTHROTTLE,
|
||||
COMMAND_ID_MOTORMIX_MAXTHROTTLE,
|
||||
COMMAND_ID_MOTORMIX_MINCOMMAND,
|
||||
COMMAND_ID_MOTORMIX_MAXCOMMAND,
|
||||
COMMAND_ID_MOTORMIX_MINCHECK,
|
||||
COMMAND_ID_MOTORMIX_PID_AT_MINTHROTTLE,
|
||||
COMMAND_ID_MOTORMIX_MOTORSTOP,
|
||||
COMMAND_ID_MOTORMIX_YAW_REVERSE_DIRECTION,
|
||||
|
||||
|
||||
/* Commands for changing flag toggles from RC */
|
||||
COMMAND_ID_FLAG_ARM_MINRANGE,
|
||||
COMMAND_ID_FLAG_ARM_MAXRANGE,
|
||||
COMMAND_ID_FLAG_ARM_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_GPS_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_GPS_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_GPS_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_AIRMODE_MINRANGE,
|
||||
COMMAND_ID_FLAG_AIRMODE_MAXRANGE,
|
||||
COMMAND_ID_FLAG_AIRMODE_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_2_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_2_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_2_CHANNEL,
|
||||
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_3_MINRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_3_MAXRANGE,
|
||||
COMMAND_ID_FLAG_FLIGHTMODE_3_CHANNEL,
|
||||
|
||||
|
||||
/* Counter for the amount of commands */
|
||||
COMMAND_ID_COUNT,
|
||||
|
||||
/* ID number for a non existing commands */
|
||||
COMMAND_ID_NO_COMMAND
|
||||
}command_Ids_t;
|
||||
|
||||
@ -283,6 +337,151 @@ const cliCommandConfig_t commandTable[COMMAND_ID_COUNT] = {
|
||||
"task_period_beeper", COMMAND_ID_PERIOD_BEEPER, EEPROM_PERIOD_BEEPER, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_32, .valueRange = {0, 1000000000}
|
||||
},
|
||||
#endif
|
||||
|
||||
|
||||
/* Commands for chaning motormixer values */
|
||||
[COMMAND_ID_MOTORMIX_MINTHROTTLE] =
|
||||
{
|
||||
"motormix_minthrottle", COMMAND_ID_MOTORMIX_MINTHROTTLE, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_MAXTHROTTLE] =
|
||||
{
|
||||
"motormix_maxthrottle", COMMAND_ID_MOTORMIX_MAXTHROTTLE, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_MINCOMMAND] =
|
||||
{
|
||||
"motormix_mincommand", COMMAND_ID_MOTORMIX_MINCOMMAND, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_MAXCOMMAND] =
|
||||
{
|
||||
"motormix_maxcommand", COMMAND_ID_MOTORMIX_MAXCOMMAND, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 6, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_MINCHECK] =
|
||||
{
|
||||
"motormix_mincheck", COMMAND_ID_MOTORMIX_MINCHECK, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 8, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_PID_AT_MINTHROTTLE] =
|
||||
{
|
||||
"motormix_pid_at_minthrottle", COMMAND_ID_MOTORMIX_PID_AT_MINTHROTTLE, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 12, VAL_BOOL, .valueRange = {0, 1}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_MOTORSTOP] =
|
||||
{
|
||||
"motormix_motorstop", COMMAND_ID_MOTORMIX_MOTORSTOP, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 16, VAL_BOOL, .valueRange = {0, 1}
|
||||
},
|
||||
[COMMAND_ID_MOTORMIX_YAW_REVERSE_DIRECTION] =
|
||||
{
|
||||
"motormix_yaw_reverse_direction", COMMAND_ID_MOTORMIX_YAW_REVERSE_DIRECTION, EEPROM_MOTORMIX_CONFIG, EEPROM_VALUE_TYPE_SYSTEM, 20, VAL_BOOL, .valueRange = {0, 1}
|
||||
},
|
||||
|
||||
|
||||
/* Commands for changing flag toggles from RC */
|
||||
[COMMAND_ID_FLAG_ARM_MINRANGE] =
|
||||
{
|
||||
"flag_arm_minrange", COMMAND_ID_FLAG_ARM_MINRANGE, EEPROM_FLAG_ARM, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_ARM_MAXRANGE] =
|
||||
{
|
||||
"flag_arm_maxrange", COMMAND_ID_FLAG_ARM_MAXRANGE, EEPROM_FLAG_ARM, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_ARM_CHANNEL] =
|
||||
{
|
||||
"flag_arm_channel", COMMAND_ID_FLAG_ARM_CHANNEL, EEPROM_FLAG_ARM, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_accelerometer_minrange", COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MINRANGE, EEPROM_FLAG_FLIGHTMODE_ACCELEROMETER, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_accelerometer_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_ACCELEROMETER, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_accelerometer_channel", COMMAND_ID_FLAG_FLIGHTMODE_ACCELEROMETER_CHANNEL, EEPROM_FLAG_FLIGHTMODE_ACCELEROMETER, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_barometer_minrange", COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MINRANGE, EEPROM_FLAG_FLIGHTMODE_BAROMETER, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_barometer_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_BAROMETER, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_barometer_channel", COMMAND_ID_FLAG_FLIGHTMODE_BAROMETER_CHANNEL, EEPROM_FLAG_FLIGHTMODE_BAROMETER, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_compass_minrange", COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MINRANGE, EEPROM_FLAG_FLIGHTMODE_COMPASS, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_compass_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_COMPASS, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_compass_channel", COMMAND_ID_FLAG_FLIGHTMODE_COMPASS_CHANNEL, EEPROM_FLAG_FLIGHTMODE_COMPASS, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_GPS_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_gps_minrange", COMMAND_ID_FLAG_FLIGHTMODE_GPS_MINRANGE, EEPROM_FLAG_FLIGHTMODE_GPS, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_GPS_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_gps_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_GPS_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_GPS, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_GPS_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_gps_channel", COMMAND_ID_FLAG_FLIGHTMODE_GPS_CHANNEL, EEPROM_FLAG_FLIGHTMODE_GPS, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_AIRMODE_MINRANGE] =
|
||||
{
|
||||
"flag_airmode_minrange", COMMAND_ID_FLAG_AIRMODE_MINRANGE, EEPROM_FLAG_AIRMODE, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_AIRMODE_MAXRANGE] =
|
||||
{
|
||||
"flag_airmode_maxrange", COMMAND_ID_FLAG_AIRMODE_MAXRANGE, EEPROM_FLAG_AIRMODE, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_AIRMODE_CHANNEL] =
|
||||
{
|
||||
"flag_airmode_channel", COMMAND_ID_FLAG_AIRMODE_CHANNEL, EEPROM_FLAG_AIRMODE, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_2_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_2_minrange", COMMAND_ID_FLAG_FLIGHTMODE_2_MINRANGE, EEPROM_FLAG_FLIGHTMODE_2, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_2_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_2_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_2_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_2, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_2_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_2_channel", COMMAND_ID_FLAG_FLIGHTMODE_2_CHANNEL, EEPROM_FLAG_FLIGHTMODE_2, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_3_MINRANGE] =
|
||||
{
|
||||
"flag_flightmode_3_minrange", COMMAND_ID_FLAG_FLIGHTMODE_3_MINRANGE, EEPROM_FLAG_FLIGHTMODE_3, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_3_MAXRANGE] =
|
||||
{
|
||||
"flag_flightmode_3_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_3_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_3, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
|
||||
},
|
||||
[COMMAND_ID_FLAG_FLIGHTMODE_3_CHANNEL] =
|
||||
{
|
||||
"flag_flightmode_3_channel", COMMAND_ID_FLAG_FLIGHTMODE_3_CHANNEL, EEPROM_FLAG_FLIGHTMODE_3, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
@ -547,11 +746,48 @@ bool processCommand(uint8_t action, uint16_t id, uint64_t value)
|
||||
case VAL_INT_64:
|
||||
*((int64_t *)valuePointer) = value;
|
||||
break;
|
||||
case VAL_BOOL:
|
||||
*((bool *)valuePointer) = value;
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void valuePointerToString(char * dst, uint16_t id, void * address)
|
||||
{
|
||||
switch(commandTable[id].valueType)
|
||||
{
|
||||
case VAL_UINT_8:
|
||||
sprintf(dst,"%d", *((uint8_t *)address));
|
||||
break;
|
||||
case VAL_INT_8:
|
||||
sprintf(dst,"%d", *((int8_t *)address));
|
||||
break;
|
||||
case VAL_UINT_16:
|
||||
sprintf(dst,"%d", *((uint16_t *)address));
|
||||
break;
|
||||
case VAL_INT_16:
|
||||
sprintf(dst,"%d", *((int16_t *)address));
|
||||
break;
|
||||
case VAL_UINT_32:
|
||||
sprintf(dst,"%d", *((uint32_t *)address));
|
||||
break;
|
||||
case VAL_INT_32:
|
||||
sprintf(dst,"%d", *((int32_t *)address));
|
||||
break;
|
||||
case VAL_UINT_64:
|
||||
sprintf(dst,"%d", *((uint64_t *)address));
|
||||
break;
|
||||
case VAL_INT_64:
|
||||
sprintf(dst,"%d", *((int64_t *)address));
|
||||
break;
|
||||
case VAL_BOOL:
|
||||
sprintf(dst,"%d", *((bool *)address));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF: Will loop and read input from serial.
|
||||
* INFORMATION: Will read input for the serial in a loop and will add
|
||||
@ -747,16 +983,72 @@ void writeTaskInformation(uint16_t id)
|
||||
{
|
||||
//buffer
|
||||
char buffer[maxStringSize_CLI];
|
||||
|
||||
char valBuffer[16];
|
||||
//Get the correct pointer to the data
|
||||
void * valuePointer = getDataAddresFromID(commandTable[id].valueId, commandTable[id].valueIdLoc);
|
||||
|
||||
//adjust to the correct addres with the offset
|
||||
valuePointer += commandTable[id].addressValueOffset;
|
||||
|
||||
valuePointerToString(valBuffer, id, valuePointer);
|
||||
//Formats the string so that it will be printed nicely
|
||||
sprintf(buffer,"- %-35s Value: %-20d allowed range: %d - %d\n\r", commandTable[id].name, *((int *)valuePointer), (int)commandTable[id].valueRange.min, (int)commandTable[id].valueRange.max);
|
||||
sprintf(buffer,"- %-40s Value: %-20s allowed range: %d - %d", commandTable[id].name, valBuffer, (int)commandTable[id].valueRange.min, (int)commandTable[id].valueRange.max);
|
||||
TransmitBack(buffer);
|
||||
TransmitBack("\n\r");
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF: Will transmit some system stats over the usart
|
||||
* INFORMATION: Will transmit some system stats, including scheduler
|
||||
* data, individial task data potentially more.
|
||||
***********************************************************************/
|
||||
void TransmitSystemStats()
|
||||
{
|
||||
char * buffer[maxStringSize_CLI*2];
|
||||
float taskExecEfficiency = ((float)systemSchedulerStatistics.totalTaskRuntime/(float)systemSchedulerStatistics.totalSystemRuntime)*100.f;
|
||||
float taskschedulingUptime = ((float)systemSchedulerStatistics.totalTasksScheduled/(float)systemSchedulerStatistics.totalSchedulerCalls)*100.f;
|
||||
float averageOverHead = ((float)systemSchedulerStatistics.totalOverHead/(float)systemSchedulerStatistics.totalSchedulerCalls)*100.f;
|
||||
//initial start message "
|
||||
TransmitBack("- System statistics\n\r-------------------\n\n\r- Scheduler stats: \n\r");
|
||||
TransmitBack("------------------------------------------------------\n\r");
|
||||
sprintf(buffer,"- %-35s%-16d ms\n\r", "System runtime:", systemSchedulerStatistics.totalSystemRuntime/1000);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d ms\n\r", "Tasks runtime:", systemSchedulerStatistics.totalTaskRuntime/1000);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d ms\n\r", "Overhead:", systemSchedulerStatistics.totalOverHead/1000);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d micro\n\r", "Average Overhead:", ((int)taskschedulingUptime));
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d percent\n\r", "Task exec by runtime:", ((int)taskExecEfficiency));
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d times\n\r", "Scheduler calls:", systemSchedulerStatistics.totalSchedulerCalls);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d times\n\r", "Task scheduled:", systemSchedulerStatistics.totalTasksScheduled);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d percent\n\r", "Task schedule load:", ((int)taskschedulingUptime));
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d times\n\r", "Missed periods:", systemSchedulerStatistics.totalMissedPeriods);
|
||||
TransmitBack(buffer);
|
||||
|
||||
|
||||
TransmitBack("\n\n\r- Individual task stats: \n\r");
|
||||
TransmitBack("------------------------------------------------------\n\r");
|
||||
for (int i = 0; i < TASK_COUNT; i++)
|
||||
{
|
||||
sprintf(buffer,"- %-35s%s\n\r", "Task name: ", SystemTasks[i].taskName);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d ms\n\r", "Total execution time: ", SystemTasks[i].totalExecutionTime/1000);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d micro\n\r", "Max execution time: ", SystemTasks[i].maxExecutionTime);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d micro\n\r", "Average execution time: ", SystemTasks[i].averageExecutionTime);
|
||||
TransmitBack(buffer);
|
||||
sprintf(buffer,"- %-35s%-16d micro\n\r", "Average time between exec: ", SystemTasks[i].taskAverageDeltaTime);
|
||||
TransmitBack(buffer);
|
||||
|
||||
TransmitBack("\n\r");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@ -964,6 +1256,9 @@ void cliRun()
|
||||
TransmitBack("- Values unchanged...\n\n\r");
|
||||
}
|
||||
break;
|
||||
case commandMask(commandSize_1, ACTION_STATS):
|
||||
TransmitSystemStats();
|
||||
break;
|
||||
default:
|
||||
if (actionId != ACTION_NOACTION)
|
||||
TransmitCommandInstruction(actionId);
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include "utilities.h"
|
||||
#include "stm32f4xx_revo.h"
|
||||
#include "Scheduler/scheduler.h"
|
||||
#include "drivers/failsafe_toggles.h"
|
||||
#include "drivers/motormix.h"
|
||||
|
||||
/* Reads the EEPROM version from EEPROM - Is compared to EEPROM_SYS_VERSION */
|
||||
uint8_t stored_eeprom_identifier;
|
||||
@ -93,6 +95,7 @@ EEPROM_DATA_t eeprom_sys_Arr[EEPROM_SYS_COUNT] = {
|
||||
.dataPtr = &uart1_rx_inverter,
|
||||
},
|
||||
|
||||
/* Task eeprom values */
|
||||
[EEPROM_PERIOD_SYSTEM] =
|
||||
{
|
||||
.size = sizeof(SystemTasks[TASK_SYSTEM].desiredPeriod),
|
||||
@ -185,6 +188,55 @@ EEPROM_DATA_t eeprom_sys_Arr[EEPROM_SYS_COUNT] = {
|
||||
#endif
|
||||
|
||||
|
||||
/* Motormix values */
|
||||
[EEPROM_MOTORMIX_CONFIG] =
|
||||
{
|
||||
.size = sizeof(mixerConfig_s),
|
||||
.dataPtr = &(mixerConfig),
|
||||
},
|
||||
|
||||
|
||||
/* Flags eeprom values */
|
||||
[EEPROM_FLAG_ARM] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_ARM]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_ACCELEROMETER] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_ACCELEROMETER]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_BAROMETER] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_BAROMETER]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_COMPASS] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_COMPASS]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_GPS] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_GPS]),
|
||||
},
|
||||
[EEPROM_FLAG_AIRMODE] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_AIRMODE]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_2] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_2]),
|
||||
},
|
||||
[EEPROM_FLAG_FLIGHTMODE_3] =
|
||||
{
|
||||
.size = sizeof(flags_Configuration_t),
|
||||
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_3]),
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
166
UAV-ControlSystem/src/drivers/failsafe_toggles.c
Normal file
166
UAV-ControlSystem/src/drivers/failsafe_toggles.c
Normal file
@ -0,0 +1,166 @@
|
||||
/*
|
||||
* failsafe_toggles.c
|
||||
*
|
||||
* Created on: 10 okt. 2016
|
||||
* Author: holmis
|
||||
*/
|
||||
|
||||
#include "drivers/failsafe_toggles.h"
|
||||
|
||||
/* Stuct containing values for all the flags and failsafe booleans sin the system */
|
||||
boolFlags_t systemFlags = {{0}};
|
||||
|
||||
/* Array of flag configurations. These are values that can be set by RC, should be read from eeprom. */
|
||||
flags_Configuration_t flagConfigArr[FLAG_CONFIGURATION_COUNT] = {
|
||||
[FLAG_CONFIGURATION_ARM] = {
|
||||
.minRange = 1500,
|
||||
.maxRange = 2000,
|
||||
.channelNumber = 8,
|
||||
.flagId = systemFlags_armed_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_ACCELEROMETER] = {
|
||||
.minRange = 1600,
|
||||
.maxRange = 2000,
|
||||
.channelNumber = 5,
|
||||
.flagId = systemFlags_flightmode_acceleromter_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_BAROMETER] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_flightmode_barometer_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_COMPASS] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_flightmode_compass_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_GPS] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_flightmode_gps_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_AIRMODE] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_airmode_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_2] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_flightMode_2_id,
|
||||
},
|
||||
[FLAG_CONFIGURATION_FLIGHTMODE_3] = {
|
||||
.minRange = 0,
|
||||
.maxRange = 0,
|
||||
.channelNumber = 0,
|
||||
.flagId = systemFlags_flightMode_3_id,
|
||||
}
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void initFlags()
|
||||
{
|
||||
systemFlags.intRepresentation = 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_ProcessRcChannel(int rcChannel_ID, int value)
|
||||
{
|
||||
for (int i = 0; i < FLAG_CONFIGURATION_COUNT; i++)
|
||||
{
|
||||
if (flagConfigArr[i].channelNumber == rcChannel_ID)
|
||||
{
|
||||
if(value >= flagConfigArr[i].minRange && value <= flagConfigArr[i].maxRange)
|
||||
{
|
||||
flags_Set_ID(flagConfigArr[i].flagId);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags_Clear_ID(flagConfigArr[i].flagId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Set_MASK(int mask)
|
||||
{
|
||||
systemFlags.intRepresentation |= mask;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Clear_MASK(int mask)
|
||||
{
|
||||
systemFlags.intRepresentation &= ~(mask);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Toggle_MASK(int mask)
|
||||
{
|
||||
systemFlags.intRepresentation ^= mask;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
bool flags_IsSet_MASK(int mask)
|
||||
{
|
||||
return !( (systemFlags.intRepresentation ^ mask) & mask );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Set_ID(int id)
|
||||
{
|
||||
flags_Set_MASK(getFlagMaskValue(id));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Clear_ID(int id)
|
||||
{
|
||||
flags_Clear_MASK(getFlagMaskValue(id));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
void flags_Toggle_ID(int id)
|
||||
{
|
||||
flags_Toggle_MASK(getFlagMaskValue(id));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF:
|
||||
* INFORMATION:
|
||||
***********************************************************************/
|
||||
bool flags_IsSet_ID(int id)
|
||||
{
|
||||
return flags_IsSet_MASK(getFlagMaskValue(id));
|
||||
}
|
@ -19,6 +19,7 @@
|
||||
#include "drivers/motors.h"
|
||||
#include "utilities.h"
|
||||
#include "drivers/sbus.h"
|
||||
#include "drivers/failsafe_toggles.h"
|
||||
|
||||
/* An illustration of the motor configuration
|
||||
|
||||
@ -35,7 +36,7 @@
|
||||
|
||||
/* Set by EEPROM - This variable decides whether the control
|
||||
* system should be active or not when throttle is below min_throttle */
|
||||
bool pid_at_min_throttle = true;
|
||||
//bool pid_at_min_throttle = true;
|
||||
|
||||
/* An array containing the calculated motor outputs */
|
||||
uint16_t motor_output[MOTOR_COUNT];
|
||||
@ -43,12 +44,14 @@ uint16_t motor_output[MOTOR_COUNT];
|
||||
/* Default values for the mixerConfig */
|
||||
// TODO: Implement in EEPROM
|
||||
mixerConfig_s mixerConfig = {
|
||||
.yaw_motor_direction = 1,
|
||||
.minThrottle = 1000,
|
||||
.maxThrottle = 2000,
|
||||
.minCommand = 1050,
|
||||
.maxCommand = 1950,
|
||||
.minCheck = 1010
|
||||
.minCheck = 1010,
|
||||
.pid_at_min_throttle = true,
|
||||
.motorstop = false,
|
||||
.yaw_reverse_direction = false
|
||||
};
|
||||
|
||||
/* Used in "mixerUAV" to create the dynamic model of the UAV */
|
||||
@ -101,7 +104,7 @@ void mix()
|
||||
// Might be used for some debug if necessary
|
||||
static bool motorLimitReached;
|
||||
|
||||
if (false) // TODO: replace with check for Airmode
|
||||
if (flags_IsSet_ID(systemFlags_airmode_id)) // TODO: replace with check for Airmode
|
||||
{
|
||||
for (int i = 0; i < MOTOR_COUNT; i++)
|
||||
{
|
||||
@ -206,7 +209,7 @@ void mix()
|
||||
for (int i = 0; i < MOTOR_COUNT; i++)
|
||||
{
|
||||
/* If engines are armed then give the output to the motors */
|
||||
if (true) // TODO: replace with check for armed (IF ARMED)
|
||||
if (flags_IsSet_ID(systemFlags_armed_id)) // TODO: replace with check for armed (IF ARMED)
|
||||
motor_output[i] = constrain(motor_output[i], mixerConfig.minCommand, mixerConfig.maxCommand);
|
||||
/* If not then stop motors */
|
||||
else
|
||||
|
@ -167,3 +167,74 @@ void sbus_read()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF: Give the value of a channel in "sbusChannelData" *
|
||||
* INFORMATION: Given a channel id the value of that channel will be *
|
||||
* returned. *
|
||||
***********************************************************************/
|
||||
int getChannelValue(sbusFrame_s frame, int id)
|
||||
{
|
||||
int toReturn = 0;
|
||||
//find the correct channel from the provided value id
|
||||
switch (id)
|
||||
{
|
||||
case 1:
|
||||
toReturn = frame.chan1;
|
||||
break;
|
||||
case 2:
|
||||
toReturn = frame.chan2;
|
||||
break;
|
||||
case 3:
|
||||
toReturn = frame.chan3;
|
||||
break;
|
||||
case 4:
|
||||
toReturn = frame.chan4;
|
||||
break;
|
||||
case 5:
|
||||
toReturn = frame.chan5;
|
||||
break;
|
||||
case 6:
|
||||
toReturn = frame.chan6;
|
||||
break;
|
||||
case 7:
|
||||
toReturn = frame.chan7;
|
||||
break;
|
||||
case 8:
|
||||
toReturn = frame.chan8;
|
||||
break;
|
||||
#if ((STICK_CHANNEL_COUNT + AUX_CHANNEL_COUNT) > 8)
|
||||
case 9:
|
||||
toReturn = frame.chan9;
|
||||
break;
|
||||
case 10:
|
||||
toReturn = frame.chan10;
|
||||
break;
|
||||
case 11:
|
||||
toReturn = frame.chan11;
|
||||
break;
|
||||
case 12:
|
||||
toReturn = frame.chan12;
|
||||
break;
|
||||
case 13:
|
||||
toReturn = frame.chan13;
|
||||
break;
|
||||
case 14:
|
||||
toReturn = frame.chan14;
|
||||
break;
|
||||
case 15:
|
||||
toReturn = frame.chan15;
|
||||
break;
|
||||
case 16:
|
||||
toReturn = frame.chan16;
|
||||
break;
|
||||
case 17:
|
||||
toReturn = frame.flag_DChannel_17;
|
||||
break;
|
||||
case 18:
|
||||
toReturn = frame.flag_DChannel_18;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ void system_clock_config(void)
|
||||
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
|
||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
|
||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;//RCC_HCLK_DIV4; //change to div4 if it broke. Changed to 2 to get usart3 to work.
|
||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
|
||||
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
|
||||
|
||||
|
@ -383,7 +383,6 @@ uint32_t usart_poll(usart_profile *profile, // The USART profile to receive data
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* BRIEF: Get the DMA buffer that was most recently completed
|
||||
* INFORMATION:
|
||||
|
@ -23,6 +23,9 @@
|
||||
#include "drivers/uart1_inverter.h"
|
||||
#include "config/cli.h"
|
||||
#include "config/eeprom.h"
|
||||
#include "drivers/failsafe_toggles.h"
|
||||
#include "drivers/sbus.h"
|
||||
#include "drivers/motormix.h"
|
||||
|
||||
/**************************************************************************
|
||||
* BRIEF: Should contain all the initializations of the system, needs to
|
||||
@ -40,12 +43,16 @@ void init_system()
|
||||
//Configure the clock
|
||||
system_clock_config();
|
||||
|
||||
/* read saved variables from eeprom */
|
||||
/* read saved variables from eeprom, in most cases eeprom should be read after a lot of the initializes */
|
||||
readEEPROM();
|
||||
|
||||
|
||||
//initialize the CLI
|
||||
cliInit(USART1);
|
||||
|
||||
//init sbus
|
||||
//sbus_init();
|
||||
|
||||
#ifdef USE_LEDS
|
||||
//Initialize the on board leds
|
||||
ledReavoEnable();
|
||||
|
@ -36,12 +36,17 @@
|
||||
#include "config/eeprom.h"
|
||||
#include "config/cli.h"
|
||||
#include "drivers/sbus.h"
|
||||
|
||||
|
||||
#include "drivers/failsafe_toggles.h"
|
||||
#include "drivers/I2C.h"
|
||||
#include "drivers/accel_gyro.h"
|
||||
|
||||
void systemTaskGyroPid(void)
|
||||
{
|
||||
//Read gyro and update PID and finally update the motors. The most important task in the system
|
||||
|
||||
uint8_t c = 102;
|
||||
if (flags_IsSet_ID(systemFlags_Failsafe_noRcReceived_id))
|
||||
usart_transmit(&cliUsart, &c, 1, 1000000000);
|
||||
}
|
||||
|
||||
void systemTaskAccelerometer(void)
|
||||
@ -56,19 +61,51 @@ void systemTaskAttitude(void)
|
||||
|
||||
}
|
||||
|
||||
#define GET_CHANNEL_VALUE(id) { \
|
||||
frame.chan##id \
|
||||
}
|
||||
|
||||
void systemTaskRx(void)
|
||||
{
|
||||
//Interpret commands to the vehicle
|
||||
sbus_read();
|
||||
sbusFrame_s frame = sbusChannelData;
|
||||
|
||||
/* Process channel data for switches and toggles on the controller, starts after "stick" channels */
|
||||
for (int i = 1; i < STICK_CHANNEL_COUNT + AUX_CHANNEL_COUNT; i++) //ToDo: add define for the number of channels to process, /if not work change i to start at numb of stick channels
|
||||
{
|
||||
flags_ProcessRcChannel(i+1, getChannelValue(frame, i+1));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool systemTaskRxCheck(uint32_t currentDeltaTime)
|
||||
{
|
||||
//This task is what is controlling the event activation of the systemTaskRx
|
||||
//check if there is anything that has be received.
|
||||
const uint32_t maxReceiveTrigger = 3000000; //3 seconds
|
||||
static uint32_t lastRecievedCommand = 0;
|
||||
|
||||
|
||||
|
||||
bool isReady = sbus_frame_available();
|
||||
if (isReady == true)
|
||||
{
|
||||
flags_Clear_ID(systemFlags_Failsafe_noRcReceived_id);
|
||||
lastRecievedCommand = clock_get_us();
|
||||
return isReady;
|
||||
}
|
||||
else
|
||||
{
|
||||
//check for failsafe
|
||||
if ((clock_get_us() - lastRecievedCommand) > maxReceiveTrigger)
|
||||
{
|
||||
flags_Set_ID(systemFlags_Failsafe_noRcReceived_id);
|
||||
}
|
||||
|
||||
return isReady;
|
||||
}
|
||||
|
||||
return sbus_frame_available();
|
||||
}
|
||||
|
||||
void systemTaskRxCli(void)
|
||||
@ -91,8 +128,13 @@ bool systemTaskRxCliCheck(uint32_t currentDeltaTime)
|
||||
|
||||
void systemTaskSerial(void)
|
||||
{
|
||||
uint8_t c = 115;
|
||||
uint8_t c = 118;
|
||||
usart_transmit(&cliUsart, &c, 1, 1000000000);
|
||||
if (flags_IsSet_ID(systemFlags_armed_id))
|
||||
ledOnInverted(Led0_PIN, Led0_GPIO_PORT);
|
||||
else
|
||||
ledOffInverted(Led0_PIN, Led0_GPIO_PORT);
|
||||
|
||||
}
|
||||
|
||||
void systemTaskBattery(void)
|
||||
@ -100,6 +142,10 @@ void systemTaskBattery(void)
|
||||
//Keep track of the battery level of the system
|
||||
uint8_t c = 98;
|
||||
usart_transmit(&cliUsart, &c, 1, 1000000000);
|
||||
if (flags_IsSet_MASK((systemFlags_flightmode_acceleromter_mask | systemFlags_armed_mask)))
|
||||
ledOnInverted(Led1, Led1_GPIO_PORT);
|
||||
else
|
||||
ledOffInverted(Led1, Led1_GPIO_PORT);
|
||||
}
|
||||
|
||||
void systemTaskBaro(void)
|
||||
|
Reference in New Issue
Block a user