1010#include " FFBoardMain.h"
1111#include " cppmain.h"
1212#include " critical.hpp"
13+ #include < span>
1314
1415std::vector<ErrorHandler*> ErrorHandler::errorHandlers;
15- std::vector<Error> ErrorHandler::errors;
16+ // std::vector<Error> ErrorHandler::errors;
17+ std::array<Error,ERRORHANDLER_MAXERRORS> ErrorHandler::errors;
1618
1719
1820std::string Error::toString (){
@@ -37,7 +39,7 @@ std::string Error::toString(){
3739
3840
3941ErrorHandler::ErrorHandler (){
40- errors.reserve (10 );
42+ // errors.reserve(10);
4143 addCallbackHandler (errorHandlers,this );
4244}
4345
@@ -54,7 +56,7 @@ void ErrorHandler::clearAll(){
5456 for (Error& error : errors)
5557 e->errorCallback (error, true );
5658 }
57- errors.clear ( );
59+ errors.fill ( Error () );
5860}
5961
6062/*
@@ -63,10 +65,12 @@ void ErrorHandler::clearAll(){
6365void ErrorHandler::clearTemp (){
6466 for (uint8_t i = 0 ; i < errors.size (); i++){
6567 if ((errors)[i].type == ErrorType::temporary){
66- errors.erase (errors.begin ()+i);
68+ // errors.erase(errors.begin()+i);
69+ errors[i] = Error (); // Empty
6770 break ;
6871 }
6972 }
73+ sortErrors ();
7074}
7175
7276void ErrorHandler::addError (const Error &error){
@@ -75,7 +79,12 @@ void ErrorHandler::addError(const Error &error){
7579 return ;
7680 }
7781 }
78- errors.push_back (error);
82+ // errors.push_back(error);
83+ auto errIt = std::find_if (errors.begin (), errors.end (), [](const Error& err){return !err.isError ();});
84+ if (errIt != errors.end ()){
85+ *errIt = error; // If buffer is full do not store error but still call callbacks.
86+ }
87+
7988
8089 // Call all error handler with this error
8190 // cpp_freertos::CriticalSection::SuspendScheduler();
@@ -88,7 +97,8 @@ void ErrorHandler::addError(const Error &error){
8897void ErrorHandler::clearError (const Error &error){
8998 for (uint8_t i = 0 ; i < errors.size (); i++){
9099 if (errors[i] == error){
91- errors.erase (errors.begin ()+i);
100+ // errors.erase(errors.begin()+i);
101+ errors[i] = Error (); // Empty
92102 break ;
93103 }
94104 }
@@ -97,6 +107,7 @@ void ErrorHandler::clearError(const Error &error){
97107 for (ErrorHandler* e : errorHandlers){
98108 e->errorCallback (error, true );
99109 }
110+ sortErrors ();
100111}
101112
102113/*
@@ -105,22 +116,31 @@ void ErrorHandler::clearError(const Error &error){
105116void ErrorHandler::clearError (ErrorCode errorcode){
106117 for (uint8_t i = 0 ; i < errors.size (); i++){
107118 if (errors[i].code == errorcode){
108- errors.erase (errors.begin ()+i);
119+ // errors.erase(errors.begin()+i);
120+ errors[i] = Error (); // Empty
109121 for (ErrorHandler* e : errorHandlers){
110122 e->errorCallback (errors[i], true );
111123 }
112124 }
113125 }
126+ sortErrors ();
114127}
115128
116- std::vector <Error>* ErrorHandler::getErrors (){
117- return & errors;
129+ std::span <Error> ErrorHandler::getErrors (){
130+ return std::span<Error>( errors. begin (), std::find_if (errors. begin (), errors. end (), []( const Error& err){ return err. type == ErrorType::none;})) ;
118131}
119132
120133void ErrorHandler::errorCallback (const Error &error, bool cleared){
121134
122135}
123136
137+ void ErrorHandler::sortErrors (){
138+ auto errSortFun = [](const Error& a, const Error& b){
139+ return a.code < b.code ;
140+ };
141+ std::sort (errors.begin (),errors.end (),errSortFun);
142+ }
143+
124144
125145// ClassIdentifier ErrorPrinter::info = {
126146// .name = "Errorprinter",
0 commit comments