From 3baf93742c70939779015357a6274c56791cf671 Mon Sep 17 00:00:00 2001 From: atomega Date: Sun, 7 Mar 2021 15:39:32 +0000 Subject: [PATCH] Implementation of a Working Error handler --- developpment/interfacer/Makefile | 21 +++++++++ developpment/interfacer/errorHandling.cpp | 54 ++++++++++++++++++++++ developpment/interfacer/errorHandling.h | 50 ++++++++++++++++++++ developpment/interfacer/errorHandling.o | Bin 0 -> 7084 bytes developpment/interfacer/interfacer.cpp | 47 +++++++++++++++++++ developpment/interfacer/interfacer.o | Bin 0 -> 6676 bytes developpment/interfacer/runtest | Bin 0 -> 15324 bytes 7 files changed, 172 insertions(+) create mode 100644 developpment/interfacer/Makefile create mode 100644 developpment/interfacer/errorHandling.cpp create mode 100644 developpment/interfacer/errorHandling.h create mode 100644 developpment/interfacer/errorHandling.o create mode 100644 developpment/interfacer/interfacer.cpp create mode 100644 developpment/interfacer/interfacer.o create mode 100755 developpment/interfacer/runtest diff --git a/developpment/interfacer/Makefile b/developpment/interfacer/Makefile new file mode 100644 index 0000000..2d7e8f0 --- /dev/null +++ b/developpment/interfacer/Makefile @@ -0,0 +1,21 @@ +cpp_src = $(wildcard *.cpp) +#c_src = $(wildcard ../c/algorithms/*.c) $(wildcard driver/ma120x0/*.c) + +cpp_obj = $(cpp_src:.cpp=.o) +c_obj = $(c_src:.c=.o) +CC = g++ +CFLAGS = -Wall -pedantic +LDFLAGS = +EXEC = runtest + + +all : $(EXEC) + +$(EXEC): $(cpp_obj) $(c_obj) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) + +cleanall: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) diff --git a/developpment/interfacer/errorHandling.cpp b/developpment/interfacer/errorHandling.cpp new file mode 100644 index 0000000..d3b597b --- /dev/null +++ b/developpment/interfacer/errorHandling.cpp @@ -0,0 +1,54 @@ +#include "errorHandling.h" + + +ErrorHandler::ErrorHandler(): emptyIndex(0) +{ +} + +int ErrorHandler::getLookUpIndex(int errNo) +{ + int i = 0; + for(i = 0; i < emptyIndex; i++) + { + if(errNo == errorLookup[i].errNo) + { + return i; + } + } + return -1; +} + +void ErrorHandler::handleError(int errNo) +{ + int index = 0; + + index = getLookUpIndex(errNo); + + if(index < 0) + { + std::cout << "The given error number does not exist\n" << "Tipp: use \"addNewError(Integer, String)\""<< std::endl; + exit(1); + } + + std::cout << "Error | " << errNo << " | \"" << errorLookup[index].errMessage << "\""<= MAX_NUMBER_OF_ERRORS) // Check if list is full + { + std::cout << "Error | Ultimate | List is full" << std::endl; + exit(1); + } + + if(getLookUpIndex(no) >= 0) // Check if Error No already exists + { + std::cout << "Error | Intern | Error No: "<< no << " Exists ! PLease choose a different number !" << std::endl; + exit(1); + } + + errorLookup[emptyIndex].errNo = no; + errorLookup[emptyIndex].errMessage = message; + emptyIndex++; +} diff --git a/developpment/interfacer/errorHandling.h b/developpment/interfacer/errorHandling.h new file mode 100644 index 0000000..8174bd7 --- /dev/null +++ b/developpment/interfacer/errorHandling.h @@ -0,0 +1,50 @@ +/* + * + * + * + * + * + * + * + * + * + * + * TODO : IMplement it as singleton + */ + + +#ifndef _ERRORHANDLIG_H_ +#define _ERRORHANDLIG_H_ + +#include +#include +#include + +#define MAX_NUMBER_OF_ERRORS 255 + + +/* + * Singleton Pattern based on : https://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289 + * + */ + +class ErrorHandler +{ + public: + ErrorHandler(); + void addNewError(const int& no, const std::string& message); + void handleError(int no); + private: + + struct error_t { + int errNo; + std::string errMessage; + }; + + unsigned int emptyIndex; + std::array errorLookup; + + int getLookUpIndex(int errNo); // If error number exists returns the index otherwise -1 +}; + +#endif // _ERRORHANDLIG_H_ diff --git a/developpment/interfacer/errorHandling.o b/developpment/interfacer/errorHandling.o new file mode 100644 index 0000000000000000000000000000000000000000..15bc6d5d8ed8be5932399a401c3eb1bcc9818bdd GIT binary patch literal 7084 zcmb_hPi$1j8K3pD>0+E_A*OM_B@fqW9RizOvVcRPW{p{}W8+v}BULEU%k%C79i&N7 zW_HI9n;NyBJp0Wz^Ud%3Gk?AN?cDIOSS%(q#YB&2NJ30*mpv^R$$HTH4cXrcc?(J# z%3~;BM&Y=}Q4%OyQMRExfx`ADQ94kbLfL_`6NT-aC|^a{h4M6t7})n&^V|;?p$zU35-o(YNy(C zx&8TE;>PlvxFP%K&(9#6{#`fZn3!E6#uc<(Fvbwy98)pIi0te_2V;Qmi8bPv`9@Bf zRnF-{#vBj1!;rNP$cd!Aihm2dh%!l8%`xYRbKHhpBy2U;$hU>qh8jaugos!xx!j(y#qgQ>Acvp3+C7+Bfe;kudWfFoOhe^ z-LPNBFtA1HVz_SC(}k}x_r@G)%$Od7wJ+eGUgs6&P|;QJo2*Cn4Rb2jByzbKTaK~z z*f*A&M1G+KvaRyaiMCF}m(Y1J?5wOPBbsR&&}aS^u-3TmwBGnx&pzY7<&|u&S}j-Y z()84XSG9{}uV$CZf$h!swEzdlxL>Ipwx?^J-Q^aGBi{KO)q4g@fp^BM?zQtl)i0fS zwu@$Emwmxz9Za_IL${xt4E!lK@X$95blb1lr>7?;>-_|+me3mx7%3mNg`J}#HG8)` zI_$Y{qj0ud26OGAfBLjn^-6*EeK+k!b1UcmVdoHr@N7#VUv26v)BD=W&MsM_I9J5@ z686ZiTGYDh9R1#6EPHhEKF$vAf3EX3oNFnbYYMOLC$V?u=HC4-<*clKN7i-!%S!L} zYyjPZ6F5UeuNC@pUGZoYf$bXV=WMmF*VQaTNa3^&DgtbJU6h8FQsP}no|9D zEpVQtR_fwi#v$f^u-H8J(|fyCo=4mv4!Jnq-+$Qd8FOou3EwT*y~!7nseK2Zt5*E< zv!NvVlF)NKcfuF3Zd6+iicOp1vCXm8rftpbvF))Zt&Z4Ju^mmFv0a zNMV0B)}@wpjoiYkA!|0sS45-1lCKF<-Vw3Kmqvpuyf(585jDO(8f3|rh$-)i;O&y* zxt~I65&fu8E`m2$ zC#&S9RgxvTA~JVWgDknjO*uNg?x<93e@e*%QvY#r zIU-+Fcs$FtA)lY9el6dD%=&fJ|992T_h}c_$1b?c^REr<9RG?DLIUmQBl2i78Wpks za-{!SME+Mq#w65<<6nx%W01Mt$CW?7i1dG^AwT1TylWx6uodL<&^IW=lJkzNBV{_WO~9GbevNo>HYGym0oz&{{6YP z02*mMBpr2v{sUoeJ~-f3tM1!_>*(c%&t-Bst-abp9ZOlt2ZtP|Ff)@*r}s~|HG~0= zk&eMaK1invXWgn3R9!!)4Hj~F7azI)^h14Ay&Lqg?!|^8TGR5{{-iT!ykNLoe)D8y zuvGMBa!CHEk&Suf&*aWMI1B0YSuPb%&Xq zDOxYMb%(imSVZVD!9h9$r@3qNdXBiNH%7R54mx?K>YdJw^<|u)eALv%?UUJ}N$>DdA9Q_x_;nx)lCPuAX^ z3fu|spc?YCx>ofjlUOu?NEY3|70HQOO(d)3P|%&p2lkX+sPe8z_KlrL0>hnrqCp?dPK))boOrnn8!+qeUd|gEca}F@M6*tDLB3{!tL> z5gDWZ*F$Y}ZvNlEd=Q0au1FTjQ&ae|KqT?)hL=1(a&jMDO@%jwOsgB<%`q_@c-R1E zs^#fQxPdnCnZ|zS_otfpw&k9E2IYAaKKWRpdN@MrdZ~x#6%9QcTkGOoKp)Qx+U0Se z?LLiq3}q7v=_<-E;j<>{k@y`izIzf`6w)vbq&F~-csLd%9?vSu#M2N18USr1_K}`L zp}wi7``E9CF?P1&D3e6IKd3sH);otf^)@NRZaBrUnzSB|Tp5SbyNSuse&ZOf$MFX0 z(yr1QXOISIU$3DJ^~yyg8tE}VShoN5GKkCsx^(3hKcLRE+f8B + + +ErrorHandler errorHandle; + +int initPlatform() +{ + // Dev. Module initialisation "Ex i2c_init() ...." + + return 0; +} + + + + +int main(int argc, char *argv[]) +{ + + errorHandle.addNewError(-34,"Test eroor 1"); + errorHandle.addNewError(-33,"Test eroor 2"); + errorHandle.addNewError(-23,"Test eroor 3"); + errorHandle.addNewError(-1,"Test eroor 4"); + errorHandle.addNewError(-34, "Test eroor 5"); + errorHandle.addNewError(-34,"Test eroor 6"); +// errorHandle.handleError(-34); + + errorHandle.addNewError(-34,"Test eroor"); + + // Init + std::cout << "Main" << std::endl; + return 1; +} diff --git a/developpment/interfacer/interfacer.o b/developpment/interfacer/interfacer.o new file mode 100644 index 0000000000000000000000000000000000000000..9d535deb16c2b054042e62e3e4a96ed37043c923 GIT binary patch literal 6676 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 RhvnPE+lTR<(i%{_{{d}UrH}vs literal 0 HcmV?d00001 diff --git a/developpment/interfacer/runtest b/developpment/interfacer/runtest new file mode 100755 index 0000000000000000000000000000000000000000..b44a6ae9ccabf638196e01f2439394f594473a31 GIT binary patch literal 15324 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 literal 0 HcmV?d00001