blob: a54f1eaf61b3370e93cf1bfc49be9378e0c6b807 [file] [log] [blame]
/*
* Copyright (c) 2017 FH Dortmund and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Description:
* CPU Utilization Logger Task for Rover / Raspberry Pi
*
* Authors:
* M. Ozcelikors, R.Hottger
* <mozcelikors@gmail.com> <robert.hoettger@fh-dortmund.de>
*
*/
#include "cpu_logger_task.h"
#include <string.h>
#include <wiringPi.h>
#include <ctime>
#include <unistd.h>
#include "../timing/timing.h"
#include "../api/basic_psys_rover.h"
#include "../interfaces.h"
#include <pthread.h>
#include "../RaspberryTest.h"
#include <softPwm.h>
#include "../pthread_monitoring/collect_thread_name.h"
void *Cpu_Logger_Task(void * arg)
{
FILE* fileptr;
char buf[20];
int core_num = 0;
double roverUtilCpu[4];
timing cpu_logger_task_tmr;
cpu_logger_task_tmr.setTaskID("CpuTsk");
cpu_logger_task_tmr.setDeadline(1);
cpu_logger_task_tmr.setPeriod(1);
CollectThreadName("Cpu_Logger_Task");
while (1)
{
cpu_logger_task_tmr.recordStartTime();
cpu_logger_task_tmr.calculatePreviousSlackTime();
//Task content starts here -----------------------------------------------
core_num = 0;
// Read from file
fileptr = fopen ("/var/www/html/core_usage_rpi.inc", "r");
if (!fileptr)
{
fprintf(stderr, "Unable to read from file");
abort(); //Dump the core
}
else
{
// Get the data
fgets(buf, 20, fileptr);
#ifdef DEBUG_CPU_LOGGER
printf("buf=%s\n", buf);
#endif
// Parse the read file to get core usage information, Splitting operation with tokens
char *token = strtok(buf, ",");
while (token != NULL && core_num<=4)
{
#ifdef DEBUG_CPU_LOGGER
printf("token=%s\n", token);
#endif
sscanf(token, "%lf", &roverUtilCpu[core_num]);
token = strtok(NULL, ",");
core_num++;
}
#ifdef DEBUG_CPU_LOGGER
printf("CPU_Util=%f %f %f %f\n",roverUtilCpu[0],roverUtilCpu[1],roverUtilCpu[2],roverUtilCpu[3]);
#endif
// Write it to a shared variable for further usage in the application
pthread_mutex_lock(&cpu_util_shared_lock);
for (int i = 0; i < 4; i++)
cpu_util_shared[i] = roverUtilCpu[i];
pthread_mutex_unlock(&cpu_util_shared_lock);
}
//Task content ends here -------------------------------------------------
cpu_logger_task_tmr.recordEndTime();
cpu_logger_task_tmr.calculateExecutionTime();
cpu_logger_task_tmr.calculateDeadlineMissPercentage();
cpu_logger_task_tmr.incrementTotalCycles();
pthread_mutex_lock(&cpu_logger_task_ti_l);
cpu_logger_task_ti.deadline = cpu_logger_task_tmr.getDeadline();
cpu_logger_task_ti.deadline_miss_percentage = cpu_logger_task_tmr.getDeadlineMissPercentage();
cpu_logger_task_ti.execution_time = cpu_logger_task_tmr.getExecutionTime();
cpu_logger_task_ti.period = cpu_logger_task_tmr.getPeriod();
cpu_logger_task_ti.prev_slack_time = cpu_logger_task_tmr.getPrevSlackTime();
cpu_logger_task_ti.task_id = cpu_logger_task_tmr.getTaskID();
cpu_logger_task_ti.start_time = cpu_logger_task_tmr.getStartTime();
cpu_logger_task_ti.end_time = cpu_logger_task_tmr.getEndTime();
pthread_mutex_unlock(&cpu_logger_task_ti_l);
cpu_logger_task_tmr.sleepToMatchPeriod();
}
/* the function must return something - NULL will do */
return NULL;
}