Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

212 lines
6.1 KiB

/*
* application.c
*
* Created on: 22.09.2022
* Author: jonas
*/
#include "platform.h"
#include "McuRTOS.h"
#include "application.h"
#include "McuWait.h"
#include "McuLED.h"
#include "McuGPIO.h"
#include "McuULN2003.h"
#include "splitflap_pins.h"
#include "splitflap.h"
#include "multi-splitflap.h"
#include "McuLog.h"
/* blue led pins */
#define LED_BLUE_GPIO GPIOC
#define LED_BLUE_PORT PORTC
#define LED_BLUE_PIN 2U
/* vars */
static McuLED_Handle_t LED_blue;
static SF_Handle_t splitflap0, splitflap1;
static uint32_t taskParameter1 = 5;
static TaskHandle_t appTaskHandle = NULL;
/* function declaration */
void configureSplitflaps(void);
/* Application initialization */
void App_Init(void){
/* configure blue LED */
McuLED_Config_t config;
McuLED_GetDefaultConfig(&config);
config.isLowActive = true;
config.isOnInit = false;
config.hw.gpio = LED_BLUE_GPIO;
config.hw.port = LED_BLUE_PORT;
config.hw.pin = LED_BLUE_PIN;
LED_blue = McuLED_InitLed(&config);
configureSplitflaps();
MultiSplitFlap_Init(2);
MultiSplitFlap_AddFlap(splitflap0);
MultiSplitFlap_AddFlap(splitflap1);
}
/* App Task */
static void App_Task(void* pv){
McuLog_info("Application Task starting");
McuLog_info("Initializing split flap motors.");
SF_MoveMotorToZeroPositionAsync(splitflap0);
SF_MoveMotorToZeroPositionAsync(splitflap1);
// timeout of 35sec
bool initSuccess = false;
for (int i = 0; i < 700; ++i) {
vTaskDelay(pdMS_TO_TICKS(50));
if(SF_IS_RDY_TO_MOVE((SF_t*)splitflap0) && SF_IS_RDY_TO_MOVE((SF_t*)splitflap1)){
initSuccess = true;
break; // end loop
}
}
McuLog_info("Init of splitflaps done. success=%s\n\n", initSuccess ? "true" : "false");
#ifndef APP_DEBUG
if(initSuccess == false)
{
// end here
for(;;) {}
}
#else
// fake set to ready
((SF_t*)splitflap0)->state = SF_STATE_READY;
((SF_t*)splitflap1)->state = SF_STATE_READY;
#endif
/* MULTI SPLIT FLAP TESTING */
char sentence[] = "JONAS!";
MultiSplitFlap_Display(sentence);
// endless loop (no return! this would produce an bkpt0)
for(;;) {}
/* SINGLE SPLIT FLAP TESTING */
// go through the following letters
char* letters[] = {"J", "O", "N", "A", "S", "!"};
//char* letters[] = { " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
// "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
// "!", "?", ":"};
McuLog_info("Amount of letters %i", sizeof(letters)/sizeof(letters[0]));
while(1){
for(int i = 0; i < sizeof(letters)/sizeof(letters[0]); i++){
McuWait_Waitms(1000);
McuLog_info("Moving to letter '%s', position is %i", letters[i], (int)SF_GetMotorPosition(splitflap0));
SF_MoveToFlap(splitflap0, letters[i]);
McuLog_info("Position after move is is %i", (int)SF_GetMotorPosition(splitflap0));
}
}
}
/* Application run */
void App_Run(void){
BaseType_t res;
res = xTaskCreate( App_Task,
"appTask",
900/sizeof(StackType_t),
&taskParameter1,
tskIDLE_PRIORITY,
&appTaskHandle);
if(res != pdPASS) // task creation not successful?
{
McuLog_info("Task creation of app task failed");
for(;;) {} // Endless loop
}
vTaskStartScheduler();
}
/* Application de-initialization */
void App_Deinit(void){
}
void configureSplitflaps(void){
/* SPLITFLAP 0 */
/* configure the motor */
McuULN2003_Config_t motor0Config;
McuULN2003_GetDefaultConfig(&motor0Config);
motor0Config.hw[0].gpio = STEPPER_MOTOR0_IN1_GPIO;
motor0Config.hw[0].port = STEPPER_MOTOR0_IN1_PORT;
motor0Config.hw[0].pin = STEPPER_MOTOR0_IN1_PIN;
motor0Config.hw[1].gpio = STEPPER_MOTOR0_IN2_GPIO;
motor0Config.hw[1].port = STEPPER_MOTOR0_IN2_PORT;
motor0Config.hw[1].pin = STEPPER_MOTOR0_IN2_PIN;
motor0Config.hw[2].gpio = STEPPER_MOTOR0_IN3_GPIO;
motor0Config.hw[2].port = STEPPER_MOTOR0_IN3_PORT;
motor0Config.hw[2].pin = STEPPER_MOTOR0_IN3_PIN;
motor0Config.hw[3].gpio = STEPPER_MOTOR0_IN4_GPIO;
motor0Config.hw[3].port = STEPPER_MOTOR0_IN4_PORT;
motor0Config.hw[3].pin = STEPPER_MOTOR0_IN4_PIN;
motor0Config.inverted = true;
/* configure magnetic sensor for motor 0 */
McuGPIO_Config_t magSensor0Config;
McuGPIO_GetDefaultConfig(&magSensor0Config);
magSensor0Config.hw.gpio = MAG_MOTOR0_GPIO;
magSensor0Config.hw.port = MAG_MOTOR0_PORT;
magSensor0Config.hw.pin = MAG_MOTOR0_PIN;
magSensor0Config.isInput = true;
magSensor0Config.hw.pull = McuGPIO_PULL_UP;
/* create config instance for splitflap 0 */
SF_Config_t sf0Config;
sf0Config.setupIdentifier = 0;
sf0Config.hardwareIdentifier = 34;
sf0Config.magSensorConfig = magSensor0Config;
sf0Config.motorConfig = motor0Config;
/* instanciate splitflap 0 */
splitflap0 = SF_Init(&sf0Config);
/* SPLITFLAP 1 */
/* configure the motor */
McuULN2003_Config_t motor1Config;
McuULN2003_GetDefaultConfig(&motor1Config);
motor1Config.hw[0].gpio = STEPPER_MOTOR1_IN1_GPIO;
motor1Config.hw[0].port = STEPPER_MOTOR1_IN1_PORT;
motor1Config.hw[0].pin = STEPPER_MOTOR1_IN1_PIN;
motor1Config.hw[1].gpio = STEPPER_MOTOR1_IN2_GPIO;
motor1Config.hw[1].port = STEPPER_MOTOR1_IN2_PORT;
motor1Config.hw[1].pin = STEPPER_MOTOR1_IN2_PIN;
motor1Config.hw[2].gpio = STEPPER_MOTOR1_IN3_GPIO;
motor1Config.hw[2].port = STEPPER_MOTOR1_IN3_PORT;
motor1Config.hw[2].pin = STEPPER_MOTOR1_IN3_PIN;
motor1Config.hw[3].gpio = STEPPER_MOTOR1_IN4_GPIO;
motor1Config.hw[3].port = STEPPER_MOTOR1_IN4_PORT;
motor1Config.hw[3].pin = STEPPER_MOTOR1_IN4_PIN;
motor1Config.inverted = true;
/* configure magnetic sensor for motor 0 */
McuGPIO_Config_t magSensor1Config;
McuGPIO_GetDefaultConfig(&magSensor1Config);
magSensor1Config.hw.gpio = MAG_MOTOR1_GPIO;
magSensor1Config.hw.port = MAG_MOTOR1_PORT;
magSensor1Config.hw.pin = MAG_MOTOR1_PIN;
magSensor1Config.isInput = true;
magSensor1Config.hw.pull = McuGPIO_PULL_UP;
/* create config instance for splitflap 0 */
SF_Config_t sf1Config;
sf1Config.setupIdentifier = 1;
sf1Config.hardwareIdentifier = 35;
sf1Config.magSensorConfig = magSensor1Config;
sf1Config.motorConfig = motor1Config;
/* instanciate splitflap 1 */
splitflap1 = SF_Init(&sf1Config);
}