event_record.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <stdbool.h>
  2. #include <string.h>
  3. #include "event_record.h"
  4. #include "libs/shark_task.h"
  5. #define MAX_EVENT_SIZE 120
  6. static event_record_t _event[MAX_EVENT_SIZE];
  7. static int event_w_idx = 0;
  8. static bool _event_full = false;
  9. void push_event(event_id_t id, s32 data) {
  10. if (id == Aux_Current_Short) {//when multi aux short, only recode the old
  11. for (int i = 0; i < MAX_EVENT_SIZE; i++) {
  12. if (_event[i].id == Aux_Current_Short) {
  13. if (shark_get_seconds() - _event[i].timestamp <= 1) {
  14. return;
  15. }
  16. }
  17. }
  18. }
  19. event_record_t *pevent = &_event[event_w_idx];
  20. event_w_idx = (event_w_idx + 1) % MAX_EVENT_SIZE;
  21. if (event_w_idx == 0) {
  22. _event_full = true;
  23. }
  24. pevent->id = id;
  25. pevent->timestamp = shark_get_seconds();
  26. pevent->data = data;
  27. }
  28. void push_event_persit(event_id_t id, s32 data) {
  29. if (id == Discharger_Operate_Off || id == Discharger_Operate_On) {
  30. for (int i = 0; i < MAX_EVENT_SIZE; i++) {
  31. if (_event[i].id == id) {
  32. _event[i].timestamp = shark_get_seconds();
  33. _event[i].data = data;
  34. return;
  35. }
  36. }
  37. }
  38. push_event(id, data);
  39. }
  40. static int _event_size(void) {
  41. if (_event_full) {
  42. return MAX_EVENT_SIZE;
  43. }
  44. return event_w_idx;
  45. }
  46. int get_event(int num, int offset, u8 *recoder) {
  47. if (offset >= _event_size()) {
  48. return 0;
  49. }
  50. num = MIN(num, _event_size()-offset);
  51. int rtn = 0;
  52. if (_event_full) {
  53. offset += event_w_idx;
  54. }
  55. while(num > 0) {
  56. memcpy(recoder, _event + offset % MAX_EVENT_SIZE, sizeof(event_record_t));
  57. num --;
  58. offset ++;
  59. recoder += sizeof(event_record_t);
  60. rtn ++;
  61. }
  62. return rtn;
  63. }