Merge remote-tracking branch 'refs/remotes/origin/Failsafe-and-toggles'

This commit is contained in:
Jonas Holmberg 2016-10-12 15:00:50 +02:00
commit d3112e7128
15 changed files with 879 additions and 21 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

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

View 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_ */

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

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

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,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);

View File

@ -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]),
},

View 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));
}

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

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

View File

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

View File

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

View File

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

View File

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