Fiexed small errors and added more commands for RC things in CLI

Also added some statistical values that can be veiwed in CLI to see how
they sytem performs.
This commit is contained in:
Jonas Holmberg 2016-10-12 14:58:21 +02:00
parent 09daa76d63
commit 2b05c843a1
11 changed files with 225 additions and 35 deletions

View File

@ -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 */

View File

@ -175,13 +175,16 @@ typedef enum {
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_FLIGHTMODE_1,
EEPROM_FLAG_AIRMODE,
EEPROM_FLAG_FLIGHTMODE_2,
EEPROM_FLAG_FLIGHTMODE_3,

View File

@ -27,7 +27,7 @@
#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_flightMode_1_id 5 + 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
@ -43,7 +43,7 @@
#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_flightMode_1_mask getFlagMaskValue(systemFlags_flightMode_1_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)
@ -67,7 +67,7 @@ typedef union bitSetRegion
booleanValue_t barometer : 1;
booleanValue_t compass : 1;
booleanValue_t gps : 1;
booleanValue_t flightMode_1 : 1;
booleanValue_t airmode : 1;
booleanValue_t flightMode_2 : 1;
booleanValue_t flightMode_3 : 1;
}bitField;
@ -90,7 +90,7 @@ typedef enum
FLAG_CONFIGURATION_FLIGHTMODE_BAROMETER,
FLAG_CONFIGURATION_FLIGHTMODE_COMPASS,
FLAG_CONFIGURATION_FLIGHTMODE_GPS,
FLAG_CONFIGURATION_FLIGHTMODE_1,
FLAG_CONFIGURATION_AIRMODE,
FLAG_CONFIGURATION_FLIGHTMODE_2,
FLAG_CONFIGURATION_FLIGHTMODE_3,

View File

@ -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

View File

@ -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();
}

View File

@ -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,6 +176,18 @@ 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,
@ -191,9 +209,9 @@ typedef enum
COMMAND_ID_FLAG_FLIGHTMODE_GPS_MAXRANGE,
COMMAND_ID_FLAG_FLIGHTMODE_GPS_CHANNEL,
COMMAND_ID_FLAG_FLIGHTMODE_1_MINRANGE,
COMMAND_ID_FLAG_FLIGHTMODE_1_MAXRANGE,
COMMAND_ID_FLAG_FLIGHTMODE_1_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,
@ -203,8 +221,11 @@ typedef enum
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;
@ -318,6 +339,41 @@ const cliCommandConfig_t commandTable[COMMAND_ID_COUNT] = {
#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] =
{
@ -384,17 +440,17 @@ const cliCommandConfig_t commandTable[COMMAND_ID_COUNT] = {
"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_FLIGHTMODE_1_MINRANGE] =
[COMMAND_ID_FLAG_AIRMODE_MINRANGE] =
{
"flag_flightmode_1_minrange", COMMAND_ID_FLAG_FLIGHTMODE_1_MINRANGE, EEPROM_FLAG_FLIGHTMODE_1, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_16, .valueRange = {0, 2500}
"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_FLIGHTMODE_1_MAXRANGE] =
[COMMAND_ID_FLAG_AIRMODE_MAXRANGE] =
{
"flag_flightmode_1_maxrange", COMMAND_ID_FLAG_FLIGHTMODE_1_MAXRANGE, EEPROM_FLAG_FLIGHTMODE_1, EEPROM_VALUE_TYPE_SYSTEM, 2, VAL_UINT_16, .valueRange = {0, 2500}
"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_FLIGHTMODE_1_CHANNEL] =
[COMMAND_ID_FLAG_AIRMODE_CHANNEL] =
{
"flag_flightmode_1_channel", COMMAND_ID_FLAG_FLIGHTMODE_1_CHANNEL, EEPROM_FLAG_FLIGHTMODE_1, EEPROM_VALUE_TYPE_SYSTEM, 4, VAL_UINT_8, .valueRange = {0, 18}
"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] =
@ -690,6 +746,9 @@ 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;
@ -723,6 +782,9 @@ void valuePointerToString(char * dst, uint16_t id, void * address)
case VAL_INT_64:
sprintf(dst,"%d", *((int64_t *)address));
break;
case VAL_BOOL:
sprintf(dst,"%d", *((bool *)address));
break;
}
}
@ -921,7 +983,7 @@ void writeTaskInformation(uint16_t id)
{
//buffer
char buffer[maxStringSize_CLI];
char valBuffer[15];
char valBuffer[16];
//Get the correct pointer to the data
void * valuePointer = getDataAddresFromID(commandTable[id].valueId, commandTable[id].valueIdLoc);
@ -934,6 +996,61 @@ void writeTaskInformation(uint16_t id)
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");
}
}
/***********************************************************************
* BRIEF: Will print informations of all the the commands
* INFORMATION: Will loop through all the commands in the system and
@ -1139,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);

View File

@ -22,6 +22,7 @@
#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;
@ -186,6 +187,15 @@ 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] =
{
@ -212,10 +222,10 @@ EEPROM_DATA_t eeprom_sys_Arr[EEPROM_SYS_COUNT] = {
.size = sizeof(flags_Configuration_t),
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_GPS]),
},
[EEPROM_FLAG_FLIGHTMODE_1] =
[EEPROM_FLAG_AIRMODE] =
{
.size = sizeof(flags_Configuration_t),
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_FLIGHTMODE_1]),
.dataPtr = &(flagConfigArr[FLAG_CONFIGURATION_AIRMODE]),
},
[EEPROM_FLAG_FLIGHTMODE_2] =
{

View File

@ -42,11 +42,11 @@ flags_Configuration_t flagConfigArr[FLAG_CONFIGURATION_COUNT] = {
.channelNumber = 0,
.flagId = systemFlags_flightmode_gps_id,
},
[FLAG_CONFIGURATION_FLIGHTMODE_1] = {
[FLAG_CONFIGURATION_AIRMODE] = {
.minRange = 0,
.maxRange = 0,
.channelNumber = 0,
.flagId = systemFlags_flightMode_1_id,
.flagId = systemFlags_airmode_id,
},
[FLAG_CONFIGURATION_FLIGHTMODE_2] = {
.minRange = 0,

View File

@ -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

View File

@ -25,6 +25,7 @@
#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
@ -47,10 +48,10 @@ void init_system()
//initialize the CLI
cliInit(USART6);
cliInit(USART1);
//init sbus
sbus_init();
//sbus_init();
#ifdef USE_LEDS
//Initialize the on board leds

View File

@ -43,6 +43,10 @@
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)
@ -68,7 +72,7 @@ void systemTaskRx(void)
sbusFrame_s frame = sbusChannelData;
/* Process channel data for switches and toggles on the controller, starts after "stick" channels */
for (int i = STICK_CHANNEL_COUNT; i < STICK_CHANNEL_COUNT + AUX_CHANNEL_COUNT; i++) //ToDo: add define for the number of channels to process
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));
}
@ -79,10 +83,29 @@ 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;
}
flags_Set_ID(systemFlags_Failsafe_noRcReceived_id);
//ToDo: add failsafe for no command revieved
return sbus_frame_available();
}
void systemTaskRxCli(void)