event_record.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <stdbool.h>
  2. #include <string.h>
  3. #include "event_record.h"
  4. #include "libs/shark_task.h"
  5. #define MAX_EVENT_SIZE 100
  6. static event_record_t _event[MAX_EVENT_SIZE];
  7. static event_record_t _max_current;
  8. static int event_w_idx = 0;
  9. static bool _event_full = false;
  10. void push_event(event_id_t id, s32 data) {
  11. event_record_t *pevent = &_event[event_w_idx];
  12. event_w_idx = (event_w_idx + 1) % MAX_EVENT_SIZE;
  13. if (event_w_idx == 0) {
  14. _event_full = true;
  15. }
  16. pevent->id = id;
  17. pevent->timestamp = shark_get_seconds();
  18. pevent->data = data;
  19. }
  20. void push_max_current(s32 current) {
  21. _max_current.id = Max_current_persis;
  22. _max_current.timestamp = shark_get_seconds();
  23. if (abs(current) > abs(_max_current.data)) {
  24. _max_current.data = current;
  25. }
  26. }
  27. static int _event_size(void) {
  28. if (_event_full) {
  29. return MAX_EVENT_SIZE;
  30. }
  31. return event_w_idx;
  32. }
  33. int get_event(int num, int offset, u8 *recoder) {
  34. if (offset >= _event_size()) {
  35. if (offset == _event_size()) {
  36. memcpy(recoder, &_max_current, sizeof(event_record_t));
  37. return 1;
  38. }
  39. return 0;
  40. }
  41. num = MIN(num, _event_size()-offset);
  42. int rtn = 0;
  43. if (_event_full) {
  44. offset += event_w_idx;
  45. }
  46. while(num > 0) {
  47. memcpy(recoder, _event + offset % MAX_EVENT_SIZE, sizeof(event_record_t));
  48. num --;
  49. offset ++;
  50. recoder += sizeof(event_record_t);
  51. rtn ++;
  52. }
  53. return rtn;
  54. }