BMS_Error_Stack.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /*
  2. * BMS_Error_Stack.c
  3. *
  4. * Created on: Oct 10, 2016
  5. * Author: le8041
  6. */
  7. #include "BMS_Master.h"
  8. uint32_t ErrorStackPushSlaveError(MASTER_CAN0_STRUCT_t* s,uint8_t slaveNr,uint32_t ErrorCode,uint8_t CellNr,uint8_t ErrorClass) {
  9. BMS_ERROR_STATE_t TempError;
  10. TempError.Slave.CellNr=CellNr;
  11. TempError.Slave.ErrorType=ErrorCode;
  12. TempError.Slave.SubsystemNr=slaveNr;
  13. TempError.Slave.active=TRUE;
  14. if(ErrorClass==BMS_ERROR_CLASS_1) {
  15. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  16. // Error has already been stored
  17. return TRUE;
  18. }
  19. // Error has not been recorded yet
  20. s->ErrorBuffer.ES1_Error[s->ErrorBuffer.ES1_ErrorCounter].Word=TempError.Word;
  21. // write FRAM
  22. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_1,s->ErrorBuffer.ES1_ErrorCounter);
  23. s->ErrorBuffer.ES1_ErrorCounter++;
  24. return TRUE;
  25. }
  26. else if(ErrorClass == BMS_ERROR_CLASS_2){
  27. // write Error Buffer 2
  28. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  29. // Error has already been stored
  30. return TRUE;
  31. }
  32. // Error has not been recorded yet
  33. s->ErrorBuffer.ES2_Error[s->ErrorBuffer.ES2_ErrorCounter].Word=TempError.Word;
  34. // write FRAM
  35. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_2,s->ErrorBuffer.ES2_ErrorCounter);
  36. s->ErrorBuffer.ES2_New_Error=TRUE;
  37. s->ErrorBuffer.ES2_ErrorCounter++;
  38. return TRUE;
  39. }
  40. else {
  41. // write Error Buffer 3
  42. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  43. // Error has already been stored
  44. return TRUE;
  45. }
  46. // Error has not been recorded yet
  47. s->ErrorBuffer.ES3_Error[s->ErrorBuffer.ES3_ErrorCounter].Word=TempError.Word;
  48. // write FRAM
  49. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_3,s->ErrorBuffer.ES3_ErrorCounter);
  50. s->ErrorBuffer.ES3_ErrorCounter++;
  51. return TRUE;
  52. }
  53. return TRUE;
  54. }
  55. uint32_t ErrorStackPushUiError(MASTER_CAN0_STRUCT_t* s,uint32_t ErrorCode,uint8_t ErrorClass) {
  56. BMS_ERROR_STATE_t TempError;
  57. TempError.UI.ErrorCode=ErrorCode;
  58. TempError.UI.SubsystemNr=BMS_ERROR_UI_ID;
  59. TempError.UI.active=TRUE;
  60. if(ErrorClass==BMS_ERROR_CLASS_1) {
  61. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  62. // Error has already been stored
  63. return TRUE;
  64. }
  65. // Error has not been recorded yet
  66. s->ErrorBuffer.ES1_Error[s->ErrorBuffer.ES1_ErrorCounter].Word=TempError.Word;
  67. // write FRAM
  68. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_1,s->ErrorBuffer.ES1_ErrorCounter);
  69. s->ErrorBuffer.ES1_ErrorCounter++;
  70. return TRUE;
  71. }
  72. else if(ErrorClass == BMS_ERROR_CLASS_2){
  73. // write Error Buffer 2
  74. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  75. // Error has already been stored
  76. return TRUE;
  77. }
  78. // Error has not been recorded yet
  79. s->ErrorBuffer.ES2_Error[s->ErrorBuffer.ES2_ErrorCounter].Word=TempError.Word;
  80. // write FRAM
  81. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_2,s->ErrorBuffer.ES2_ErrorCounter);
  82. s->ErrorBuffer.ES2_ErrorCounter++;
  83. return TRUE;
  84. }
  85. else {
  86. // write Error Buffer 3
  87. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  88. // Error has already been stored
  89. return TRUE;
  90. }
  91. // Error has not been recorded yet
  92. s->ErrorBuffer.ES3_Error[s->ErrorBuffer.ES3_ErrorCounter].Word=TempError.Word;
  93. // write FRAM
  94. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_3,s->ErrorBuffer.ES3_ErrorCounter);
  95. s->ErrorBuffer.ES3_ErrorCounter++;
  96. return TRUE;
  97. }
  98. return TRUE;
  99. }
  100. uint32_t ErrorStackPushMasterError(MASTER_CAN0_STRUCT_t* s,uint32_t ErrorCode,uint8_t ErrorClass) {
  101. BMS_ERROR_STATE_t TempError;
  102. TempError.Master.ErrorCode=ErrorCode;
  103. TempError.Master.SubsystemNr=BMS_ERROR_MASTER_ID;
  104. TempError.Master.active=TRUE;
  105. if(ErrorClass==BMS_ERROR_CLASS_1) {
  106. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  107. // Error has already been stored
  108. return TRUE;
  109. }
  110. // Error has not been recorded yet
  111. s->ErrorBuffer.ES1_Error[s->ErrorBuffer.ES1_ErrorCounter].Word=TempError.Word;
  112. // write FRAM
  113. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_1,s->ErrorBuffer.ES1_ErrorCounter);
  114. s->ErrorBuffer.ES1_ErrorCounter++;
  115. return TRUE;
  116. }
  117. else if(ErrorClass == BMS_ERROR_CLASS_2){
  118. // write Error Buffer 2
  119. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  120. // Error has already been stored
  121. return TRUE;
  122. }
  123. // Error has not been recorded yet
  124. s->ErrorBuffer.ES2_Error[s->ErrorBuffer.ES2_ErrorCounter].Word=TempError.Word;
  125. // write FRAM
  126. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_2,s->ErrorBuffer.ES2_ErrorCounter);
  127. // set new error flag
  128. s->ErrorBuffer.ES2_New_Error=TRUE;
  129. s->ErrorBuffer.ES2_ErrorCounter++;
  130. return TRUE;
  131. }
  132. else {
  133. // write Error Buffer 3
  134. if (ErrorStackCheckBufferForError(s,TempError.Word,ErrorClass)) {
  135. // Error has already been stored
  136. return TRUE;
  137. }
  138. // Error has not been recorded yet
  139. s->ErrorBuffer.ES3_Error[s->ErrorBuffer.ES3_ErrorCounter].Word=TempError.Word;
  140. // write FRAM
  141. write_fram_write_error(TempError.Word,BMS_ERROR_CLASS_3,s->ErrorBuffer.ES3_ErrorCounter);
  142. s->ErrorBuffer.ES3_ErrorCounter++;
  143. return TRUE;
  144. }
  145. return TRUE;
  146. }
  147. uint32_t ErrorStackGenerateStatusPkg(uint8_t* targetBuffer,uint8_t* ErrorCode) {
  148. uint32_t id=CAN1_TX_BATTERY_STATUS;
  149. uint8_t* id_addr=(uint8_t*)&id;
  150. // generate ID
  151. shuffle_lsb_msb_can1((uint8_t*)&id);
  152. targetBuffer[0]=id_addr[0];
  153. targetBuffer[1]=id_addr[1];
  154. targetBuffer[2]=id_addr[2];
  155. targetBuffer[3]=id_addr[3];
  156. targetBuffer[4]=ErrorCode[3];
  157. targetBuffer[5]=ErrorCode[2];
  158. targetBuffer[6]=ErrorCode[1];
  159. targetBuffer[7]=ErrorCode[0];
  160. return TRUE;
  161. }
  162. /*
  163. * @brief check if error is already in Error buffer
  164. * @return True if error is already stroed
  165. * @return FALSE errhr has not been stred yet
  166. */
  167. uint32_t ErrorStackCheckBufferForError(MASTER_CAN0_STRUCT_t* s,uint32_t ErrorWord,uint8_t ErrorClass) {
  168. uint8_t i;
  169. if(ErrorClass==BMS_ERROR_CLASS_1) {
  170. // check Error Buffer 1
  171. for(i=0;i<(s->ErrorBuffer.ES1_ErrorCounter);i++ ) {
  172. if(s->ErrorBuffer.ES1_Error[i].Word == ErrorWord) {
  173. return TRUE; // Error has been detected before
  174. }
  175. }
  176. return FALSE;
  177. }
  178. else if(ErrorClass==BMS_ERROR_CLASS_2) {
  179. // check Error Buffer 2
  180. for(i=0;i<(s->ErrorBuffer.ES2_ErrorCounter);i++ ) {
  181. if(s->ErrorBuffer.ES2_Error[i].Word == ErrorWord) {
  182. return TRUE; // Error has been detected before
  183. }
  184. }
  185. return FALSE;
  186. }
  187. else {
  188. // check Error Buffer 3
  189. //get Error Code from latest entry
  190. for(i=0;i<(s->ErrorBuffer.ES3_ErrorCounter);i++ ) {
  191. if(s->ErrorBuffer.ES3_Error[i].Word == ErrorWord) {
  192. return TRUE; // Error has been detected before
  193. }
  194. }
  195. return FALSE;
  196. }
  197. }
  198. /*
  199. * @brief check if active errors remain
  200. * @return true = error is active
  201. * @return false = error not active
  202. */
  203. uint32_t ErrorStackCheckForActiveErrors(MASTER_CAN0_STRUCT_t* s,uint8_t ErrorClass) {
  204. uint8_t i;
  205. if(ErrorClass==BMS_ERROR_CLASS_1) {
  206. for(i=0;i<s->ErrorBuffer.ES1_ErrorCounter;i++) {
  207. if(s->ErrorBuffer.ES1_Error[i].Word & 0x00000001) {
  208. // Error is active
  209. if(s->ErrorBuffer.ES1_Error_Recovery[i].recoveryPending == FALSE) {
  210. return TRUE;
  211. }
  212. else {
  213. // error recovery is in progress
  214. // return no error
  215. if(s->ErrorBuffer.ES1_Error[i].Master.SubsystemNr==BMS_ERROR_MASTER_ID) {
  216. // Error is master Error
  217. BMS_Clear_Error_State_Master(s,&(s->ErrorBuffer.ES1_Error[i]),i,ErrorClass);
  218. }
  219. else if(s->ErrorBuffer.ES1_Error[i].Master.SubsystemNr==BMS_ERROR_UI_ID) {
  220. // Error is UI Error
  221. }
  222. else{
  223. // Error is Slave Error
  224. BMS_Clear_Error_State_Slave(s,&(s->ErrorBuffer.ES1_Error[i])) ;
  225. }
  226. return FALSE;
  227. }
  228. }
  229. }
  230. // no Active Error
  231. return FALSE;
  232. }
  233. else if(ErrorClass==BMS_ERROR_CLASS_2) {
  234. for(i=0;i<s->ErrorBuffer.ES2_ErrorCounter;i++) {
  235. if(s->ErrorBuffer.ES2_Error[i].Word & 0x00000001) {
  236. // Error is active
  237. if(s->ErrorBuffer.ES2_Error_Recovery[i].recoveryPending == FALSE || s->ErrorBuffer.ES2_New_Error == TRUE) {
  238. return TRUE;
  239. }
  240. else {
  241. // error recovery is in progress
  242. // return no error
  243. if(s->ErrorBuffer.ES2_Error[i].Master.SubsystemNr==BMS_ERROR_MASTER_ID) {
  244. // Error is master Error
  245. BMS_Clear_Error_State_Master(s,&(s->ErrorBuffer.ES2_Error[i]),i,ErrorClass);
  246. }
  247. else if(s->ErrorBuffer.ES2_Error[i].Master.SubsystemNr==BMS_ERROR_UI_ID) {
  248. // Error is UI Error
  249. }
  250. else{
  251. // Error is Slave Error
  252. BMS_Clear_Error_State_Slave(s,&(s->ErrorBuffer.ES2_Error[i])) ;
  253. }
  254. return FALSE;
  255. }
  256. }
  257. }
  258. // no Active Error
  259. return FALSE;
  260. }
  261. else {
  262. for(i=0;i<s->ErrorBuffer.ES3_ErrorCounter;i++) {
  263. if(s->ErrorBuffer.ES3_Error[i].Word & 0x00000001) {
  264. // Error is active
  265. return TRUE;
  266. }
  267. }
  268. // no Active Error
  269. return FALSE;
  270. }
  271. }
  272. uint32_t ErrorStackClearBuffer(MASTER_CAN0_STRUCT_t* s) {
  273. uint8_t i;
  274. for(i=0;i<BMS_ERROR_ERROR_STACK_SIZE;i++) {
  275. s->ErrorBuffer.ES1_Error[i].Word=0;
  276. s->ErrorBuffer.ES2_Error[i].Word=0;
  277. s->ErrorBuffer.ES3_Error[i].Word=0;
  278. }
  279. }
  280. /*
  281. * @ brief check if error recovery is pending
  282. * if pending return TRUE else return FALSE
  283. */
  284. uint32_t ErrorStackCheckifUmin1ErrorRecoveryPending(MASTER_CAN0_STRUCT_t* s) {
  285. uint8_t i;
  286. for(i=0;i< BMS_ERROR_ERROR_STACK_SIZE;i++) {
  287. if(s->ErrorBuffer.ES1_Error[i].Master.active && s->ErrorBuffer.ES1_Error[i].Master.ErrorCode==BMS_ERROR_STACK_MASTER_UMIN_1 ) {
  288. if(s->ErrorBuffer.ES1_Error_Recovery[i].recoveryPending==TRUE) {
  289. return TRUE;
  290. }
  291. }
  292. }
  293. // no pending umin1 error recovery
  294. return FALSE;
  295. }
  296. /*
  297. * @ brief check if error recovery is pending
  298. * if pending return TRUE else return FALSE
  299. */
  300. uint32_t ErrorStackCheckifUmin2ErrorRecoveryPending(MASTER_CAN0_STRUCT_t* s) {
  301. uint8_t i;
  302. for(i=0;i< BMS_ERROR_ERROR_STACK_SIZE;i++) {
  303. if(s->ErrorBuffer.ES2_Error[i].Master.active && s->ErrorBuffer.ES2_Error[i].Master.ErrorCode==BMS_ERROR_STACK_MASTER_UMIN_2 ) {
  304. if(s->ErrorBuffer.ES2_Error_Recovery[i].recoveryPending==TRUE) {
  305. return TRUE;
  306. }
  307. }
  308. }
  309. // no pending umin1 error recovery
  310. return FALSE;
  311. }
  312. /*
  313. * @ brief check if error recovery is pending
  314. * if pending return TRUE else return FALSE
  315. */
  316. uint32_t ErrorStackCheckifAnyErrorRecoveryPending(MASTER_CAN0_STRUCT_t* s) {
  317. uint8_t i;
  318. for(i=0;i< BMS_ERROR_ERROR_STACK_SIZE;i++) {
  319. if(s->ErrorBuffer.ES1_Error_Recovery[i].recoveryPending==TRUE) {
  320. return TRUE;
  321. }
  322. if(s->ErrorBuffer.ES2_Error_Recovery[i].recoveryPending==TRUE) {
  323. return TRUE;
  324. }
  325. }
  326. // no pending umin1 error recovery
  327. return FALSE;
  328. }