Mats van Reenen 7769a07681 big update
2021-01-21 21:56:54 +01:00

116 lines
2.4 KiB
C

#include <stdint.h>
#include <pthread.h>
#include <ti/drivers/GPIO.h>
#include <ti/sysbios/BIOS.h>
#include "debug.h"
#include "global.h"
#include "communicatie.h"
#include "noodstop.h"
#include "MPPT.h"
#include "spi.h"
struct mainTreads {
pthread_t comm;
pthread_t noodstop;
pthread_t mppt;
pthread_t sysBeheer;
} treads;
void * mainTask(void *arg);
//TODO: maybe detach pthread?
//TODO: add stacksize option
pthread_t createSimplePTread(int prio, void * fn){
struct sched_param priParam;
priParam.sched_priority = prio;
pthread_attr_t pAttrs;
pthread_attr_init(&pAttrs);
pthread_attr_setschedparam(&pAttrs, &priParam);
pthread_t thread;
if( pthread_create(&thread, &pAttrs, fn, NULL) != 0 ){
ERROR("could not create thread")
return 0;
}
return thread;
}
void startInit(){
SPI_Init();
treads.comm = createSimplePTread(3, &comm_init);
treads.noodstop = createSimplePTread(1, &noodstop_init);
treads.mppt = createSimplePTread(1, &mppt_init);
//TODO: add systeembeheer
}
void startSys(){
treads.mppt = createSimplePTread(2, &mppt_start);
treads.noodstop = createSimplePTread(4, &noodstop_start);
}
void stopSys(){
// pthread_exit(treads.comm);
pthread_exit(treads.noodstop);
pthread_exit(treads.mppt);
treads.noodstop = createSimplePTread(3, &noodstop_deinit);
}
void initISR(){
if(Status == WORKING || Status == INIT)
return;
Status = INIT;
treads.sysBeheer = createSimplePTread(1, mainTask);
}
void startSysISR(){
if(GPIO_read(CONFIG_GPIO_START)){
if(Status != ALL_READY){
Status = EXT_NOODSTOP;
noodstop_activeerNoodstop();
stopSys();
return;
}else{
Status = WORKING;
}
}else{
Status = SLEEP;
}
}
void * mainTask(void *arg){
Status_t lastState;
while(1){
switch (Status){
case SLEEP:
stopSys();
break;
case INIT:
startInit();
break;
case WORKING:
startSys();
break;
case OVERHEAD:
case OVERLOAD:
case OVERSPEED:
case EXT_NOODSTOP:
stopSys();
return;
}
lastState = Status;
while(Status == lastState)
usleep(10);
}
}
int main(void){
Status = SLEEP;
Board_init(); // initialise board
treads.sysBeheer = createSimplePTread(1, mainTask);
BIOS_start(); // start the BIOS
while(1)
usleep(1E6);
}