Files
ChronoDisplay/ChronoReadingManager.cpp
T
2026-08-17 12:55:33 -04:00

194 lines
5.8 KiB
C++

#include "ChronoReadingManager.h"
#include "FileManager.h"
#include <Preferences.h>
static const char* PROFILE_NS = "profile";
static const char* GUN_ID_KEY = "gunId";
static const char* PROJ_ID_KEY = "projId";
// Constructor implementation
ChronoReadingManager::ChronoReadingManager() {}
void ChronoReadingManager::initializeProfiles(){
FileManager& files = FileManager::getInstance();
files.loadGunProfiles(_gunProfiles);
files.loadProjectileProfiles(_projectileProfiles);
Preferences prefs;
prefs.begin(PROFILE_NS, true);
int savedGunId = prefs.getInt(GUN_ID_KEY, -1);
int savedProjId = prefs.getInt(PROJ_ID_KEY, -1);
prefs.end();
GunProfile gp("", GunProfile::PROFILE_TYPE_AIR_GUN_FAC);
ProjectileProfile pp("", ProjectileProfile::PELLET, 0.0, 0.0);
if (savedGunId >= 0 && savedGunId < _gunProfiles.size()) {
gp = _gunProfiles.get(savedGunId);
} else if (_gunProfiles.size() > 0) {
gp = _gunProfiles.get(0);
}
if (savedProjId >= 0 && savedProjId < _projectileProfiles.size()) {
pp = _projectileProfiles.get(savedProjId);
} else if (_projectileProfiles.size() > 0) {
pp = _projectileProfiles.get(0);
}
_currentProfile = new ChronoProfile(gp, pp);
}
ChronoReadingManager& ChronoReadingManager::getInstance(){
static ChronoReadingManager instance;
return instance;
}
LinkedList<GunProfile>& ChronoReadingManager::getGunProfiles(){return _gunProfiles;}
void ChronoReadingManager::setGunProfile(int id){
GunProfile p=_gunProfiles.get(id);
_currentProfile->setGunProfile(p);
Preferences prefs;
prefs.begin(PROFILE_NS, false);
prefs.putInt(GUN_ID_KEY, id);
prefs.end();
}
void ChronoReadingManager::addGunProfile(GunProfile profile, bool writeToDisk){
if (writeToDisk){
FileManager& files = FileManager::getInstance();
files.saveGunProfile(profile);
}
_gunProfiles.add(profile);
}
void ChronoReadingManager::removeGunProfile(int id){
//remove from disk
GunProfile profile=_gunProfiles.get(id);
FileManager& files = FileManager::getInstance();
files.removeGunProfile(profile);
//now remove from local list
for (int i=0; i<_gunProfiles.size();i++){
GunProfile gp=_gunProfiles.get(i);
if (gp.getName()==profile.getName() &&
gp.getPowerLevel()==profile.getPowerLevel()){
_gunProfiles.remove(i);
break;
}
}
}
LinkedList<ProjectileProfile>& ChronoReadingManager::getProjectileProfiles(){return _projectileProfiles;}
void ChronoReadingManager::setProjectileProfile(int id){
ProjectileProfile pp=_projectileProfiles.get(id);
_currentProfile->setProjectileProfile(pp);
Preferences prefs;
prefs.begin(PROFILE_NS, false);
prefs.putInt(PROJ_ID_KEY, id);
prefs.end();
}
void ChronoReadingManager::addProjectileProfile(ProjectileProfile profile, bool writeToDisk){
if (writeToDisk){
FileManager& files = FileManager::getInstance();
files.saveProjectileProfile(profile);
}
_projectileProfiles.add(profile);
}
void ChronoReadingManager::removeProjectileProfile(int id){
//remove from disk
ProjectileProfile profile=_projectileProfiles.get(id);
FileManager& files = FileManager::getInstance();
files.removeProjectileProfile(profile);
//now remove from local list
for (int i=0; i<_projectileProfiles.size();i++){
ProjectileProfile p=_projectileProfiles.get(i);
if (p.getName()==profile.getName() &&
p.getType()==profile.getType() &&
p.getCaliber()==profile.getCaliber() &&
p.getWeight()==profile.getWeight()){
_projectileProfiles.remove(i);
break;
}
}
}
int ChronoReadingManager::getShotCount(){return _chronoReadings.size();}
int ChronoReadingManager::getLastFPS(){
if (_chronoReadings.size()>0){
return _chronoReadings.get(_chronoReadings.size()-1).getFPS();
}
else{
return 0;
}
}
int ChronoReadingManager::getLastFPE(){
if (_chronoReadings.size()>0){
return _chronoReadings.get(_chronoReadings.size()-1).getFPE();
}
else{
return 0;
}
}
ChronoProfile& ChronoReadingManager::getProfile(){return *_currentProfile;}
LinkedList<ChronoReading>& ChronoReadingManager::getChronographReadings(){return _chronoReadings;}
void ChronoReadingManager::addReading(int fps){
ChronoReading reading(fps,*_currentProfile);
_chronoReadings.add(reading);
}
int ChronoReadingManager::getLowFPS() {
int low=0;
for(int i=0;i<_chronoReadings.size();i++){
if (i==0 || _chronoReadings.get(i).getFPS()<low){
low=_chronoReadings.get(i).getFPS();
}
}
return low;
}
int ChronoReadingManager::getHighFPS() {
int high=0;
for(int i=0;i<_chronoReadings.size();i++){
if (i==0 || _chronoReadings.get(i).getFPS()>high){
high=_chronoReadings.get(i).getFPS();
}
}
return high;
}
int ChronoReadingManager::getAvgFPS(){
int avg=0;
if (_chronoReadings.size()>0){
int total=0;
for (int i=0;i<_chronoReadings.size();i++){
total=total+_chronoReadings.get(i).getFPS();
}
avg=total/_chronoReadings.size();
}
return avg;
}
float ChronoReadingManager::getStandardDeviation(){
float sd=0.0;
float total=0.0;
float avg=0.0;
if (_chronoReadings.size()==0){
return 0;
}
//get the average
for (int i = 0; i < _chronoReadings.size(); i++) { // Loop through the array elements
total=total+_chronoReadings.get(i).getFPS();
}
avg=total/_chronoReadings.size();
//get the sum of squared differences
float squaredTotal=0.0;
for (int i = 0; i < _chronoReadings.size(); i++) { // Loop through the array elements
float diff=_chronoReadings.get(i).getFPS()-avg;
squaredTotal=squaredTotal+(diff*diff);
}
float squaredAvg=squaredTotal/_chronoReadings.size();
sd=sqrt(squaredAvg);
return sd;
}
int ChronoReadingManager::getSpread(){
int low=getLowFPS();
int high=getHighFPS();
return high-low;
}
void ChronoReadingManager::reset(){
_chronoReadings.clear();
}