C2A_Core
event_logger.c
[詳解]
1 #pragma section REPRO
10 #include "event_logger.h"
11 #include "event_handler.h"
12 #include <string.h>
13 #include "../TimeManager/time_manager.h"
14 #include "../WatchdogTimer/watchdog_timer.h"
16 #include "../../TlmCmd/common_cmd_packet_util.h"
17 
18 
19 #ifdef EL_IS_ENABLE_CLOG
25 typedef enum
26 {
30 #endif
31 
32 
41 static EL_Event EL_init_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note);
42 
52 static EL_ACK EL_record_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note);
53 
54 #ifdef EL_IS_ENABLE_TLOG
62 static EL_ACK EL_record_event_to_tlog_(const EL_Event* event);
63 
73 static void EL_check_tlog_wp_(EL_ERROR_LEVEL err_level);
74 
79 static void EL_clear_all_tlog_(void);
80 
87 static void EL_clear_tlog_(EL_ERROR_LEVEL err_level);
88 #endif
89 
90 #ifdef EL_IS_ENABLE_CLOG
97 static void EL_record_event_to_clog_(const EL_Event* event);
98 
103 static void EL_clear_all_clog_(void);
104 
111 static void EL_clear_clog_(EL_ERROR_LEVEL err_level);
112 
121 static EL_CLOG_LOG_ACK EL_search_clog_(const EL_Event* event, uint16_t* log_idx, uint16_t* order_idx);
122 
129 static void EL_move_to_front_in_clog_(const EL_Event* event);
130 
138 static void EL_create_clog_on_front_(const EL_Event* event);
139 #endif
140 
145 static void EL_clear_latest_event_(void);
146 
151 static void EL_clear_statistics_(void);
152 
153 
156 
157 #ifdef EL_IS_ENABLE_TLOG
159 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
161 #endif
163 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
165 #endif
167 #endif
168 
169 #ifdef EL_IS_ENABLE_CLOG
172 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
175 #endif
178 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
181 #endif
184 #endif
185 
186 
187 void EL_initialize(void)
188 {
189  memset(&event_logger_, 0x00, sizeof(EventLogger));
190 
191  // 最初はすべてのロギングが有効
193 
194 #ifdef EL_IS_ENABLE_TLOG
197 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
200 #endif
203 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
206 #endif
209 
211 
212  // デフォルトでは TLog の上書きは有効
215 #endif // EL_IS_ENABLE_TLOG
216 
217 #ifdef EL_IS_ENABLE_CLOG
221 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
225 #endif
229 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
233 #endif
237 
239 #endif // EL_IS_ENABLE_CLOG
240 
241  // EL_clear_statistics_(); // 冒頭の memset があるので不要
242  // EL_clear_latest_event_(); // 冒頭の memset があるので不要
243 
244  // ユーザーデフォルト設定
246 
248 }
249 
250 
251 static EL_Event EL_init_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
252 {
253  EL_Event event;
254 
255  event.group = group;
256  event.local = local;
257  event.err_level = err_level;
258  event.time = TMGR_get_master_clock();
259 #ifdef EL_IS_ENABLE_EVENT_NOTE
260  event.note = note;
261 #else
262  (void)note;
263 #endif
264 
265  return event;
266 }
267 
268 
269 EL_ACK EL_record_event(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
270 {
271  // ユーザーからのイベント記録で EL_IS_ENABLE_EL_ERROR_LEVEL は禁止
272 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
273  if (err_level == EL_ERROR_LEVEL_EL) return EL_ACK_ILLEGAL_ERROR_LEVEL;
274 #endif
275 
276  return EL_record_event_(group, local, err_level, note);
277 }
278 
279 
280 static EL_ACK EL_record_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
281 {
282  const EL_Event event = EL_init_event_(group, local, err_level, note);
283  EL_ACK ack = EL_ACK_OK;
284 
285  if (event.group >= EL_GROUP_MAX) return EL_ACK_ILLEGAL_GROUP;
286  if (event.group <= (EL_GROUP)EL_CORE_GROUP_NULL) return EL_ACK_ILLEGAL_GROUP; // これは本当に入れてよいか要議論
287  if (event.err_level < 0) return EL_ACK_ILLEGAL_ERROR_LEVEL;
288  if (event.err_level >= EL_ERROR_LEVEL_MAX) return EL_ACK_ILLEGAL_ERROR_LEVEL;
289  if (!EL_is_logging_enable(event.group)) return EL_ACK_DISABLE_LOGGING;
290 
291  event_logger_.latest_event = event; // 再帰呼び出しの可能性があるので,別途コピーして持つ
293  event_logger_.statistics.record_counters[event.err_level]++;
294 
295 #ifdef EL_IS_ENABLE_TLOG
296  ack = EL_record_event_to_tlog_(&event);
297 #endif
298 
299 #ifdef EL_IS_ENABLE_CLOG
300  EL_record_event_to_clog_(&event);
301 #endif
302 
303  // EL_record_event の再帰呼び出しになるので最後に呼び出し.注意!!
304 #ifdef EL_IS_ENABLE_TLOG
305 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
306  // 追記できない場合はスキップ
307  if (ack != EL_ACK_TLOG_FULL)
308  {
309  EL_check_tlog_wp_(event.err_level);
310  }
311 #endif
312 #endif
313 
314  return ack;
315 }
316 
317 
318 #ifdef EL_IS_ENABLE_TLOG
320 {
321  const EL_ERROR_LEVEL err_level = event->err_level;
322  EL_TimeSeriesLog* p_tlog = &event_logger_.tlogs[err_level];
323  const uint16_t wp = p_tlog->log_wp;
324 
325  if ( EL_is_tlog_overwrite_enable(err_level) == 0 && p_tlog->is_table_overflow == 1 )
326  {
327  // 追記できない
328  return EL_ACK_TLOG_FULL;
329  }
330 
331  p_tlog->events[wp] = *event;
332  p_tlog->log_wp++;
333  p_tlog->log_wp %= p_tlog->log_capacity;
334 
335  if ( EL_is_tlog_overwrite_enable(err_level) == 0 && p_tlog->log_wp == 0 )
336  {
337  // 次回から追記できなくなる
338  p_tlog->is_table_overflow = 1;
339  }
340  else
341  {
342  p_tlog->is_table_overflow = 0;
343  }
344  return EL_ACK_OK;
345 }
346 
347 
348 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
349 static void EL_check_tlog_wp_(EL_ERROR_LEVEL err_level)
350 {
351  const uint16_t wp = event_logger_.tlogs[err_level].log_wp;
352  const uint16_t capacity = event_logger_.tlogs[err_level].log_capacity;
353  if (wp == 0) // capacity を超え,一周したとき
354  {
355  switch (err_level)
356  {
357  case EL_ERROR_LEVEL_HIGH:
361  0);
362  break;
363 
364 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
369  0);
370  break;
371 #endif
372 
373  case EL_ERROR_LEVEL_LOW:
377  0);
378  break;
379 
380  default:
381  // EL_ERROR_LEVEL_EL のものは,無限ループの可能性があるので,イベント発行しない
382  break;
383  }
384  }
385 
386  if (wp == (capacity / 2) && (capacity % 2 ) == 0) // 約半分に達したとき
387  {
388  switch (err_level)
389  {
390  case EL_ERROR_LEVEL_HIGH:
394  0);
395  break;
396 
397 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
402  0);
403  break;
404 #endif
405 
406  case EL_ERROR_LEVEL_LOW:
410  0);
411  break;
412 
413  default:
414  // EL_ERROR_LEVEL_EL のものは,無限ループの可能性があるので,イベント発行しない
415  break;
416  }
417  }
418 }
419 #endif
420 
421 
422 static void EL_clear_all_tlog_(void)
423 {
424  uint8_t err_level;
425  for (err_level = 0; err_level < EL_ERROR_LEVEL_MAX; ++err_level)
426  {
427  EL_clear_tlog_((EL_ERROR_LEVEL)err_level);
428  }
429 }
430 
431 
432 static void EL_clear_tlog_(EL_ERROR_LEVEL err_level)
433 {
434  EL_TimeSeriesLog* p_tlog = &event_logger_.tlogs[err_level];
435 
436  p_tlog->is_table_overflow = 0;
437  p_tlog->log_wp = 0;
438 
439  memset(p_tlog->events, 0x00, p_tlog->log_capacity * sizeof(EL_Event));
440 }
441 #endif
442 
443 
444 #ifdef EL_IS_ENABLE_CLOG
445 static void EL_record_event_to_clog_(const EL_Event* event)
446 {
447  uint16_t log_idx;
448  const EL_ERROR_LEVEL err_level = event->err_level;
449  EL_CLogElement* p_newest_clog_log;
450 
452 
453  // 自身のログidx,つまり最も新しいログidxを拾う
454  log_idx = event_logger_.clogs[err_level].log_orders[0];
455  p_newest_clog_log = &event_logger_.clogs[err_level].logs[log_idx];
456 
457  p_newest_clog_log->count++;
458  p_newest_clog_log->delta_record_time = OBCT_diff(&p_newest_clog_log->event.time, &event->time);
459 
460  p_newest_clog_log->event = *event;
461 }
462 
463 
464 static void EL_clear_all_clog_(void)
465 {
466  uint8_t err_level;
467  for (err_level = 0; err_level < EL_ERROR_LEVEL_MAX; ++err_level)
468  {
469  EL_clear_clog_((EL_ERROR_LEVEL)err_level);
470  }
471 }
472 
473 
474 static void EL_clear_clog_(EL_ERROR_LEVEL err_level)
475 {
476  EL_CumulativeLog* p_clog = &event_logger_.clogs[err_level];
477  uint16_t i;
478  const uint16_t capacity = p_clog->log_capacity;
479 
480  memset(p_clog->logs, 0x00, capacity * sizeof(EL_CLogElement));
481 
482  for (i = 0; i < capacity; ++i)
483  {
484  p_clog->log_orders[i] = (uint16_t)i;
485  }
486 }
487 
488 
489 static EL_CLOG_LOG_ACK EL_search_clog_(const EL_Event* event, uint16_t* log_idx, uint16_t* order_idx)
490 {
491  uint16_t i;
492  EL_CumulativeLog* p_clog = &event_logger_.clogs[event->err_level];
493  const uint16_t capacity = p_clog->log_capacity;
494  *log_idx = 0;
495  *order_idx = 0;
496 
497  for (i = 0; i < capacity; ++i)
498  {
499  uint16_t idx = p_clog->log_orders[i];
500  if (p_clog->logs[idx].event.group == (EL_GROUP)EL_CORE_GROUP_NULL)
501  {
503  }
504  if (p_clog->logs[idx].event.group == event->group &&
505  p_clog->logs[idx].event.local == event->local)
506  {
507  *log_idx = idx;
508  *order_idx = i;
509  return EL_CLOG_LOG_ACK_OK;
510  }
511  }
512 
514 }
515 
516 
517 static void EL_move_to_front_in_clog_(const EL_Event* event)
518 {
519  uint16_t log_idx;
520  uint16_t order_idx;
521  EL_CumulativeLog* p_clog = &event_logger_.clogs[event->err_level];
522  EL_CLOG_LOG_ACK log_ret = EL_search_clog_(event, &log_idx, &order_idx);
523 
524  if (log_ret == EL_CLOG_LOG_ACK_NOT_FOUND)
525  {
526  // ログがないので作る
528  return;
529  }
530 
531  memmove(&p_clog->log_orders[1], &p_clog->log_orders[0], sizeof(uint16_t) * order_idx);
532  p_clog->log_orders[0] = log_idx;
533 }
534 
535 
536 static void EL_create_clog_on_front_(const EL_Event* event)
537 {
538  uint16_t log_idx;
539  const EL_ERROR_LEVEL err_level = event->err_level;
540  EL_CumulativeLog* p_clog = &event_logger_.clogs[err_level];
541  const uint16_t capacity = p_clog->log_capacity;
542 
543  // 最も古いログを取得
544  log_idx = p_clog->log_orders[capacity - 1];
545 
546 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
547  {
548  const EL_CLogElement* drop_clog_log = &p_clog->logs[log_idx];
549  if (drop_clog_log->event.group != (EL_GROUP)EL_CORE_GROUP_NULL)
550  {
551  // 一応記録のためにイベントを発行する
552  // ここで, EL も出してしまうと再帰 & 最悪無限ループになる
553  if (err_level != EL_ERROR_LEVEL_EL)
554  {
556  (uint32_t)drop_clog_log->event.group,
558  (uint32_t)drop_clog_log->event.err_level);
560  drop_clog_log->event.local,
562  (uint32_t)drop_clog_log->count);
563  }
564  }
565  }
566 #endif
567 
568  memmove(&p_clog->log_orders[1], &p_clog->log_orders[0], sizeof(uint16_t) * (capacity - 1));
569  p_clog->log_orders[0] = log_idx;
570 
571  // ここで event をいれてしまう
572  // そうすることで,初回の delta_record_time が 0 になる
573  p_clog->logs[log_idx].event = *event;
574  p_clog->logs[log_idx].count = 0;
575 
576  // delta_record_time はとりあえずは消してないが,直後に上書きされるはず
577 }
578 #endif
579 
580 
581 static void EL_clear_latest_event_(void)
582 {
583  memset(&event_logger_.latest_event, 0x00, sizeof(EL_Event));
584 }
585 
586 
587 static void EL_clear_statistics_(void)
588 {
589  memset(&event_logger_.statistics, 0x00, sizeof(EL_EventStatistics));
591 }
592 
593 
595 {
596  uint32_t group_idx = (uint32_t)group / 8;
597  uint32_t group_subidx = 7 - (uint32_t)group % 8; // 反転
598  uint8_t info;
599  uint8_t mask;
600 
601  if (group >= EL_GROUP_MAX) return EL_ACK_ILLEGAL_GROUP;
602  if (group <= (EL_GROUP)EL_CORE_GROUP_NULL) return EL_ACK_ILLEGAL_GROUP; // これは本当に入れてよいか要議論
603 
604  info = event_logger_.is_logging_enable[group_idx];
605  mask = (uint8_t)(0x01 << group_subidx);
606  info = (uint8_t)(info | mask);
607 
608  event_logger_.is_logging_enable[group_idx] = info;
609 
610  return EL_ACK_OK;
611 }
612 
613 
615 {
616  uint32_t group_idx = (uint32_t)group / 8;
617  uint32_t group_subidx = 7 - (uint32_t)group % 8; // 反転
618  uint8_t info;
619  uint8_t mask;
620 
621  if (group >= EL_GROUP_MAX) return EL_ACK_ILLEGAL_GROUP;
622  if (group <= (EL_GROUP)EL_CORE_GROUP_NULL) return EL_ACK_ILLEGAL_GROUP; // これは本当に入れてよいか要議論
623 
624  info = event_logger_.is_logging_enable[group_idx];
625  mask = (uint8_t)(0x01 << group_subidx);
626  mask = (uint8_t)(~mask); // ビット反転
627  info = (uint8_t)(info & mask);
628 
629  event_logger_.is_logging_enable[group_idx] = info;
630 
631  return EL_ACK_OK;
632 }
633 
634 
636 {
637  uint32_t group_idx = (uint32_t)group / 8;
638  uint32_t group_subidx = 7 - (uint32_t)group % 8; // 反転
639  uint8_t info;
640  uint8_t mask;
641  uint8_t ret;
642 
643  // 不正な group は無効判定
644  if (group >= EL_GROUP_MAX) return 0;
645 
646  info = event_logger_.is_logging_enable[group_idx];
647  mask = (uint8_t)(0x01 << group_subidx);
648  ret = (uint8_t)(info & mask);
649 
650  if (ret == 0) return 0;
651  return 1;
652 }
653 
654 
656 {
658 }
659 
660 
662 {
664 }
665 
666 
667 #ifdef EL_IS_ENABLE_TLOG
669 {
670  if (err_level < 0) return EL_ACK_ILLEGAL_ERROR_LEVEL;
671  if (err_level >= EL_ERROR_LEVEL_MAX) return EL_ACK_ILLEGAL_ERROR_LEVEL;
672 
673  event_logger_.tlogs[err_level].is_enable_overwrite = 1;
674  return EL_ACK_OK;
675 }
676 
677 
679 {
680  if (err_level < 0) return EL_ACK_ILLEGAL_ERROR_LEVEL;
681  if (err_level >= EL_ERROR_LEVEL_MAX) return EL_ACK_ILLEGAL_ERROR_LEVEL;
682 
683  event_logger_.tlogs[err_level].is_enable_overwrite = 0;
684  return EL_ACK_OK;
685 }
686 
687 
689 {
690  uint8_t err_level;
691 
692  for (err_level = 0; err_level < EL_ERROR_LEVEL_MAX; ++err_level)
693  {
694  if ((EL_ERROR_LEVEL)err_level == EL_ERROR_LEVEL_EH) continue;
696  }
697 }
698 
699 
701 {
702  uint8_t err_level;
703 
704  for (err_level = 0; err_level < EL_ERROR_LEVEL_MAX; ++err_level)
705  {
706  if ((EL_ERROR_LEVEL)err_level == EL_ERROR_LEVEL_EH) continue;
708  }
709 }
710 
711 
713 {
714  if (err_level < 0) return 0;
715  if (err_level >= EL_ERROR_LEVEL_MAX) return 0;
716 
717  return (int)event_logger_.tlogs[err_level].is_enable_overwrite;
718 }
719 
720 
722 {
723  uint16_t capacity;
724  uint16_t idx;
725  EL_TimeSeriesLog* p_tlog;
726 
727  if (err_level < 0 || err_level >= EL_ERROR_LEVEL_MAX)
728  {
729  // 仕方がないので HIGHを
730  err_level = EL_ERROR_LEVEL_HIGH;
731  }
732 
733  p_tlog = &event_logger_.tlogs[err_level];
734  capacity = p_tlog->log_capacity;
735 
736  if (n >= capacity)
737  {
738  // 仕方がないので,最新のものを
739  idx = 0;
740  }
741  else
742  {
743  idx = (uint16_t)((p_tlog->log_wp - 1 - n + capacity) % capacity);
744  }
745 
746  return &p_tlog->events[idx];
747 }
748 #endif
749 
750 
752 {
753  (void)packet;
754  EL_initialize();
756 }
757 
758 
760 {
761  (void)packet;
762 
763 #ifdef EL_IS_ENABLE_TLOG
765 #endif
766 
767 #ifdef EL_IS_ENABLE_CLOG
769 #endif
770 
773 
775 }
776 
777 
779 {
780  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 0, uint8_t);
781 
784 
785 #ifdef EL_IS_ENABLE_TLOG
786  EL_clear_tlog_(err_level);
787 #endif
788 
789 #ifdef EL_IS_ENABLE_CLOG
790  EL_clear_clog_(err_level);
791 #endif
792 
794 }
795 
796 
798 {
799  (void)packet;
802 }
803 
804 
805 #ifdef EL_IS_ENABLE_TLOG
807 {
808  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 0, uint8_t);
809 
812 
813  EL_clear_tlog_(err_level);
814 
816 }
817 #endif
818 
819 
820 #ifdef EL_IS_ENABLE_CLOG
822 {
823  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 0, uint8_t);
824 
827 
828  EL_clear_clog_(err_level);
829 
831 }
832 #endif
833 
834 
836 {
837  EL_GROUP group = (EL_GROUP)CCP_get_param_from_packet(packet, 0, uint32_t);
838  uint32_t local = CCP_get_param_from_packet(packet, 1, uint32_t);
839  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 2, uint8_t);
840  uint32_t note = CCP_get_param_from_packet(packet, 3, uint32_t);
841 
842  EL_ACK ack = EL_record_event(group, local, err_level, note);
843 
844  switch (ack)
845  {
846  case EL_ACK_OK:
848  case EL_ACK_TLOG_FULL:
849  // 要検討だが,これは正常ではあるのでこれでよし
857  default:
859  }
860 }
861 
862 
863 #ifdef EL_IS_ENABLE_TLOG
865 {
866  uint8_t page_no = CCP_get_param_from_packet(packet, 0, uint8_t);
867  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 1, uint8_t);
868 
869  switch (err_level)
870  {
871  case EL_ERROR_LEVEL_HIGH:
873  break;
874 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
877  break;
878 #endif
879  case EL_ERROR_LEVEL_LOW:
881  break;
882 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
883  case EL_ERROR_LEVEL_EL:
885  break;
886 #endif
887  case EL_ERROR_LEVEL_EH:
889  break;
890  default:
892  }
893 
895  event_logger_.tlm_info.tlog.err_level = err_level;
896 
898 }
899 #endif
900 
901 
902 #ifdef EL_IS_ENABLE_CLOG
904 {
905  uint8_t page_no = CCP_get_param_from_packet(packet, 0, uint8_t);
906  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 1, uint8_t);
907 
908  switch (err_level)
909  {
910  case EL_ERROR_LEVEL_HIGH:
912  break;
913 #ifdef EL_IS_ENABLE_MIDDLE_ERROR_LEVEL
916  break;
917 #endif
918  case EL_ERROR_LEVEL_LOW:
920  break;
921 #ifdef EL_IS_ENABLE_EL_ERROR_LEVEL
922  case EL_ERROR_LEVEL_EL:
924  break;
925 #endif
926  case EL_ERROR_LEVEL_EH:
928  break;
929  default:
931  }
932 
934  event_logger_.tlm_info.clog.err_level = err_level;
935 
937 }
938 #endif
939 
940 
942 {
943  (void)packet;
947 }
948 
949 
951 {
952  EL_GROUP group = (EL_GROUP)CCP_get_param_from_packet(packet, 0, uint32_t);
953 
954  EL_ACK ack = EL_enable_logging(group);
955 
956  switch (ack)
957  {
958  case EL_ACK_OK:
962  default:
964  }
965 }
966 
967 
969 {
970  EL_GROUP group = (EL_GROUP)CCP_get_param_from_packet(packet, 0, uint32_t);
971 
972  EL_ACK ack = EL_disable_logging(group);
973 
974  switch (ack)
975  {
976  case EL_ACK_OK:
980  default:
982  }
983 }
984 
985 
987 {
988  (void)packet;
991 }
992 
993 
995 {
996  (void)packet;
999 }
1000 
1001 
1002 #ifdef EL_IS_ENABLE_TLOG
1004 {
1005  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 0, uint8_t);
1006 
1007  EL_ACK ack = EL_enable_tlog_overwrite(err_level);
1008 
1009  switch (ack)
1010  {
1011  case EL_ACK_OK:
1015  default:
1017  }
1018 }
1019 
1020 
1022 {
1023  EL_ERROR_LEVEL err_level = (EL_ERROR_LEVEL)CCP_get_param_from_packet(packet, 0, uint8_t);
1024 
1025  EL_ACK ack = EL_disable_tlog_overwrite(err_level);
1026 
1027  switch (ack)
1028  {
1029  case EL_ACK_OK:
1033  default:
1035  }
1036 }
1037 
1038 
1040 {
1041  (void)packet;
1044 }
1045 
1046 
1048 {
1049  (void)packet;
1052 }
1053 #endif
1054 
1055 #pragma section
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
void EH_match_event_counter_to_el(void)
イベントカウンタを EL のそれに合わせる
イベント発火型処理を行う
EL_ACK EL_enable_logging(EL_GROUP group)
event_logger の EL_Event.group の有効化
Definition: event_logger.c:594
CCP_CmdRet Cmd_EL_CLEAR_STATISTICS(const CommonCmdPacket *packet)
Definition: event_logger.c:797
static EL_Event EL_init_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
イベント (EL_Event) を初期化
Definition: event_logger.c:251
CCP_CmdRet Cmd_EL_RECORD_EVENT(const CommonCmdPacket *packet)
Definition: event_logger.c:835
static EL_Event EL_tlog_event_table_high_[EL_TLOG_LOG_SIZE_MAX_HIGH]
Definition: event_logger.c:158
static uint16_t EL_clog_log_order_table_eh_[EL_CLOG_LOG_SIZE_MAX_EH]
Definition: event_logger.c:183
static uint16_t EL_clog_log_order_table_el_[EL_CLOG_LOG_SIZE_MAX_EL]
Definition: event_logger.c:180
static EL_CLogElement EL_clog_log_table_el_[EL_CLOG_LOG_SIZE_MAX_EL]
Definition: event_logger.c:179
EL_ACK EL_record_event(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
イベント (EL_Event) を記録
Definition: event_logger.c:269
CCP_CmdRet Cmd_EL_DISABLE_TLOG_OVERWRITE_ALL(const CommonCmdPacket *packet)
static EL_CLogElement EL_clog_log_table_high_[EL_CLOG_LOG_SIZE_MAX_HIGH]
Definition: event_logger.c:170
CCP_CmdRet Cmd_EL_INIT(const CommonCmdPacket *packet)
Definition: event_logger.c:751
static EventLogger event_logger_
Definition: event_logger.c:154
CCP_CmdRet Cmd_EL_TLOG_SET_PAGE_FOR_TLM(const CommonCmdPacket *packet)
Definition: event_logger.c:864
static uint16_t EL_clog_log_order_table_middle_[EL_CLOG_LOG_SIZE_MAX_MIDDLE]
Definition: event_logger.c:174
static EL_CLogElement EL_clog_log_table_low_[EL_CLOG_LOG_SIZE_MAX_LOW]
Definition: event_logger.c:176
int EL_is_logging_enable(EL_GROUP group)
event_logger の EL_Event.group が有効か?
Definition: event_logger.c:635
CCP_CmdRet Cmd_EL_DISABLE_TLOG_OVERWRITE(const CommonCmdPacket *packet)
static uint16_t EL_clog_log_order_table_low_[EL_CLOG_LOG_SIZE_MAX_LOW]
Definition: event_logger.c:177
CCP_CmdRet Cmd_EL_CLEAR_CLOG(const CommonCmdPacket *packet)
Definition: event_logger.c:821
CCP_CmdRet Cmd_EL_DISABLE_LOGGING(const CommonCmdPacket *packet)
Definition: event_logger.c:968
void EL_initialize(void)
event_logger の初期化
Definition: event_logger.c:187
CCP_CmdRet Cmd_EL_ENABLE_LOGGING(const CommonCmdPacket *packet)
Definition: event_logger.c:950
static void EL_move_to_front_in_clog_(const EL_Event *event)
該当イベントの CLog を,イベントテーブルの先頭に出す
Definition: event_logger.c:517
static void EL_create_clog_on_front_(const EL_Event *event)
イベントテーブル先頭に該当イベントの CLog をつくる
Definition: event_logger.c:536
CCP_CmdRet Cmd_EL_CLEAR_TLOG(const CommonCmdPacket *packet)
Definition: event_logger.c:806
static void EL_clear_tlog_(EL_ERROR_LEVEL err_level)
TLogテーブルをクリア
Definition: event_logger.c:432
static void EL_record_event_to_clog_(const EL_Event *event)
イベント (EL_Event) を CLog に記録
Definition: event_logger.c:445
CCP_CmdRet Cmd_EL_ENABLE_TLOG_OVERWRITE(const CommonCmdPacket *packet)
static void EL_clear_clog_(EL_ERROR_LEVEL err_level)
CLogテーブルをクリア
Definition: event_logger.c:474
static EL_CLogElement EL_clog_log_table_middle_[EL_CLOG_LOG_SIZE_MAX_MIDDLE]
Definition: event_logger.c:173
static uint16_t EL_clog_log_order_table_high_[EL_CLOG_LOG_SIZE_MAX_HIGH]
Definition: event_logger.c:171
static void EL_clear_statistics_(void)
統計情報をクリア
Definition: event_logger.c:587
const EL_Event * EL_get_the_nth_tlog_from_the_latest(EL_ERROR_LEVEL err_level, uint16_t n)
TLog のイベントテーブルの最新からn番目のイベントを取得
Definition: event_logger.c:721
static EL_ACK EL_record_event_(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
イベント (EL_Event) を記録
Definition: event_logger.c:280
static EL_Event EL_tlog_event_table_middle_[EL_TLOG_LOG_SIZE_MAX_MIDDLE]
Definition: event_logger.c:160
static EL_ACK EL_record_event_to_tlog_(const EL_Event *event)
イベント (EL_Event) を TLog に記録
Definition: event_logger.c:319
static EL_CLOG_LOG_ACK EL_search_clog_(const EL_Event *event, uint16_t *log_idx, uint16_t *order_idx)
該当イベントの CLog を検索し取得する
Definition: event_logger.c:489
EL_ACK EL_disable_tlog_overwrite(EL_ERROR_LEVEL err_level)
TLog のイベントテーブルの上書きを無効化
Definition: event_logger.c:678
static void EL_clear_all_tlog_(void)
TLogテーブルをすべてクリア
Definition: event_logger.c:422
void EL_enable_all_logging(void)
event_logger の全 EL_Event.group の有効化
Definition: event_logger.c:655
EL_CLOG_LOG_ACK
ログ操作の返り値
Definition: event_logger.c:26
@ EL_CLOG_LOG_ACK_NOT_FOUND
指定ログが見つからず
Definition: event_logger.c:28
@ EL_CLOG_LOG_ACK_OK
正常終了
Definition: event_logger.c:27
static EL_Event EL_tlog_event_table_el_[EL_TLOG_LOG_SIZE_MAX_EL]
Definition: event_logger.c:164
void EL_disable_all_logging(void)
event_logger の全 EL_Event.group の無効化
Definition: event_logger.c:661
static void EL_clear_latest_event_(void)
最新ログをクリア
Definition: event_logger.c:581
EL_ACK EL_enable_tlog_overwrite(EL_ERROR_LEVEL err_level)
TLog のイベントテーブルの上書きを有効化
Definition: event_logger.c:668
void EL_enable_tlog_overwrite_all(void)
TLog のイベントテーブルの上書きをすべて有効化
Definition: event_logger.c:688
static EL_Event EL_tlog_event_table_eh_[EL_TLOG_LOG_SIZE_MAX_EH]
Definition: event_logger.c:166
EL_ACK EL_disable_logging(EL_GROUP group)
event_logger の EL_Event.group の無効化
Definition: event_logger.c:614
CCP_CmdRet Cmd_EL_DISABLE_LOGGING_ALL(const CommonCmdPacket *packet)
Definition: event_logger.c:994
CCP_CmdRet Cmd_EL_ENABLE_LOGGING_ALL(const CommonCmdPacket *packet)
Definition: event_logger.c:986
CCP_CmdRet Cmd_EL_ENABLE_TLOG_OVERWRITE_ALL(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_EL_INIT_LOGGING_SETTINGS(const CommonCmdPacket *packet)
Definition: event_logger.c:941
static void EL_check_tlog_wp_(EL_ERROR_LEVEL err_level)
TLog の wp をチェックし, event を生成する
Definition: event_logger.c:349
const EventLogger *const event_logger
Definition: event_logger.c:155
static EL_Event EL_tlog_event_table_low_[EL_TLOG_LOG_SIZE_MAX_LOW]
Definition: event_logger.c:162
void EL_disable_tlog_overwrite_all(void)
TLog のイベントテーブルの上書きをすべて無効化
Definition: event_logger.c:700
static void EL_clear_all_clog_(void)
CLogテーブルをすべてクリア
Definition: event_logger.c:464
int EL_is_tlog_overwrite_enable(EL_ERROR_LEVEL err_level)
TLog のイベントテーブルの上書きが有効か?
Definition: event_logger.c:712
static EL_CLogElement EL_clog_log_table_eh_[EL_CLOG_LOG_SIZE_MAX_EH]
Definition: event_logger.c:182
CCP_CmdRet Cmd_EL_CLEAR_LOG_ALL(const CommonCmdPacket *packet)
Definition: event_logger.c:759
CCP_CmdRet Cmd_EL_CLOG_SET_PAGE_FOR_TLM(const CommonCmdPacket *packet)
Definition: event_logger.c:903
CCP_CmdRet Cmd_EL_CLEAR_LOG_BY_ERR_LEVEL(const CommonCmdPacket *packet)
Definition: event_logger.c:778
アノマリやエラーなどの各種イベントを記録する
#define EL_CLOG_TLM_PAGE_MAX_MIDDLE
CLogで保存するログのページ数 (EL_ERROR_LEVEL_MIDDLE)
Definition: event_logger.h:57
#define EL_CLOG_TLM_PAGE_MAX_HIGH
CLogで保存するログのページ数 (EL_ERROR_LEVEL_HIGH)
Definition: event_logger.h:56
#define EL_TLOG_LOG_SIZE_MAX_EH
TLogにて保存するログ数 (EL_ERROR_LEVEL_EH) 小さめでOK. EH_MAX_RULE_NUM_OF_EL_ID_DUPLICATES x 多段EHの最大段数ぐらいあれば
Definition: event_logger.h:62
#define EL_CLOG_LOG_SIZE_MAX_EH
CLogにて保存するログ数 (EL_ERROR_LEVEL_EH) これは EH では使われないので小さくて良い
Definition: event_logger.h:63
#define EL_CLOG_LOG_SIZE_MAX_HIGH
Definition: event_logger.h:148
#define EL_TLOG_LOG_SIZE_MAX_LOW
Definition: event_logger.h:108
#define EL_TLOG_TLM_PAGE_MAX_HIGH
TLogで保存するログのページ数 (EL_ERROR_LEVEL_HIGH)
Definition: event_logger.h:52
#define EL_TLOG_TLM_PAGE_SIZE
TLogにて,テレメ1ページにおろせるlog数
Definition: event_logger.h:51
@ EL_CORE_GROUP_EVENT_LOGGER
EL
Definition: event_logger.h:207
@ EL_CORE_GROUP_EL_DROP_CLOG2
EL CLogs で古いエラーを上書きするとき (local, count を保存)
Definition: event_logger.h:224
@ EL_CORE_GROUP_EL_DROP_CLOG1
EL CLogs で古いエラーを上書きするとき (group, err_level を保存)
Definition: event_logger.h:223
@ EL_CORE_GROUP_NULL
初期値 or NULL.これは 0 であることを要求 (clear で memset 0x00 をするなら)
Definition: event_logger.h:206
#define EL_TLOG_LOG_SIZE_MAX_MIDDLE
Definition: event_logger.h:101
#define EL_CLOG_TLM_PAGE_SIZE
CLogにて,テレメ1ページにおろせるlog数
Definition: event_logger.h:55
#define EL_CLOG_TLM_PAGE_MAX_LOW
CLogで保存するログのページ数 (EL_ERROR_LEVEL_LOW)
Definition: event_logger.h:58
EL_ACK
event_logger の汎用返り値
Definition: event_logger.h:282
@ EL_ACK_DISABLE_LOGGING
ロギングが無効により,棄却
Definition: event_logger.h:286
@ EL_ACK_ILLEGAL_GROUP
不正な EL_Event.group
Definition: event_logger.h:284
@ EL_ACK_ILLEGAL_ERROR_LEVEL
不正な EL_Event.err_level
Definition: event_logger.h:285
@ EL_ACK_OK
正常終了
Definition: event_logger.h:283
@ EL_ACK_TLOG_FULL
TLogの追記が不能のため,TLog記録ができず
Definition: event_logger.h:287
#define EL_TLOG_TLM_PAGE_MAX_LOW
TLogで保存するログのページ数 (EL_ERROR_LEVEL_LOW)
Definition: event_logger.h:54
#define EL_CLOG_LOG_SIZE_MAX_MIDDLE
Definition: event_logger.h:153
#define EL_TLOG_LOG_SIZE_MAX_EL
TLogにて保存するログ数 (EL_ERROR_LEVEL_EL)
Definition: event_logger.h:60
#define EL_CLOG_LOG_SIZE_MAX_LOW
Definition: event_logger.h:160
#define EL_TLOG_LOG_SIZE_MAX_HIGH
Definition: event_logger.h:96
#define EL_TLOG_TLM_PAGE_MAX_MIDDLE
TLogで保存するログのページ数 (EL_ERROR_LEVEL_MIDDLE)
Definition: event_logger.h:53
#define EL_CLOG_LOG_SIZE_MAX_EL
CLogにて保存するログ数 (EL_ERROR_LEVEL_EL)
Definition: event_logger.h:61
EL_ERROR_LEVEL
event_logger の エラーレベル
Definition: event_logger.h:261
@ EL_ERROR_LEVEL_MAX
Definition: event_logger.h:272
@ EL_ERROR_LEVEL_MIDDLE
Definition: event_logger.h:264
@ EL_ERROR_LEVEL_EH
Definition: event_logger.h:270
@ EL_ERROR_LEVEL_HIGH
Definition: event_logger.h:262
@ EL_ERROR_LEVEL_LOW
Definition: event_logger.h:266
@ EL_ERROR_LEVEL_EL
Definition: event_logger.h:268
@ EL_EVENT_LOCAL_TLOG_MIDDLE_HALF_FULL
TLog のテーブルの半分が埋まった (MIDDLE)
Definition: event_logger.h:243
@ EL_EVENT_LOCAL_TLOG_MIDDLE_FULL
TLog のテーブルが埋まった.wpは最初に戻り,古いものから上書きしていく (MIDDLE)
Definition: event_logger.h:244
@ EL_EVENT_LOCAL_TLOG_HIGH_HALF_FULL
TLog のテーブルの半分が埋まった (HIGH)
Definition: event_logger.h:240
@ EL_EVENT_LOCAL_TLOG_LOW_HALF_FULL
TLog のテーブルの半分が埋まった (LOW)
Definition: event_logger.h:246
@ EL_EVENT_LOCAL_TLOG_LOW_FULL
TLog のテーブルが埋まった.wpは最初に戻り,古いものから上書きしていく (LOW)
Definition: event_logger.h:247
@ EL_EVENT_LOCAL_TLOG_HIGH_FULL
TLog のテーブルが埋まった.wpは最初に戻り,古いものから上書きしていく (HIGH)
Definition: event_logger.h:241
EL_GROUP
event_logger の Event Group の user 定義部分
@ EL_GROUP_MAX
void EL_load_default_settings(void)
event_logger の設定
ObcTime OBCT_diff(const ObcTime *before, const ObcTime *after)
ObcTime の引き算を行う
Definition: obc_time.c:116
コマンド返り値
Space Packet (コマンド用)
累積ログ (CLog) の1要素 note group, local が同じイベントを同一とみなす
Definition: event_logger.h:346
ObcTime delta_record_time
直近2つのイベント発生時刻の差
Definition: event_logger.h:349
el_clog_counter_t count
累積カウンタ
Definition: event_logger.h:348
EL_Event event
記録するイベントと,最後に記録されたイベント情報
Definition: event_logger.h:347
累積ログ (CLog) のログ構造定義
Definition: event_logger.h:358
uint16_t * log_orders
logs を時系列順に並び替える sort_key(サイズ可変のためポインタ)
Definition: event_logger.h:360
uint16_t log_capacity
イベントテーブルのキャパシティ(サイズ)
Definition: event_logger.h:361
EL_CLogElement * logs
累積カウンタを保持するイベントテーブル.[log_order[0]] が最新.(サイズ可変のためポインタ)
Definition: event_logger.h:359
イベント
Definition: event_logger.h:297
EL_GROUP group
イベントを特定する group id
Definition: event_logger.h:298
uint32_t local
Definition: event_logger.h:299
ObcTime time
発生時刻
Definition: event_logger.h:303
EL_ERROR_LEVEL err_level
エラーレベル
Definition: event_logger.h:302
イベント統計情報
Definition: event_logger.h:317
uint32_t record_counters[EL_ERROR_LEVEL_MAX]
エラーレベルごとの記録数
Definition: event_logger.h:319
uint32_t record_counter_total
イベント記録数
Definition: event_logger.h:318
時系列ログ (TLog) のログ構造定義
Definition: event_logger.h:329
uint16_t log_wp
イベントテーブルの write pointer.次回書き込み場所
Definition: event_logger.h:332
uint8_t is_enable_overwrite
TLogの上書きを許可するか?(デフォルトでは許可)
Definition: event_logger.h:333
uint8_t is_table_overflow
上書きが無効の場合,溢れて追記できなかったか?
Definition: event_logger.h:334
uint16_t log_capacity
イベントテーブルのキャパシティ(サイズ)
Definition: event_logger.h:331
EL_Event * events
記録するイベントテーブル(サイズ可変のためポインタ)
Definition: event_logger.h:330
struct EL_TlmInfo::@13 tlog
struct EL_TlmInfo::@14 clog
uint8_t page_no
tlm で下ろすログページ
Definition: event_logger.h:371
EL_ERROR_LEVEL err_level
tlm で下ろす情報のエラーレベル
Definition: event_logger.h:372
EL_EventStatistics statistics
統計情報
Definition: event_logger.h:394
EL_TlmInfo tlm_info
tlmのための情報
Definition: event_logger.h:395
uint8_t is_logging_enable[EL_GROUP_MAX/8+1]
有効かフラグ.メモリ削減のため, bit 単位で保存
Definition: event_logger.h:397
EL_TimeSeriesLog tlogs[EL_ERROR_LEVEL_MAX]
Definition: event_logger.h:388
EL_Event latest_event
Definition: event_logger.h:399
EL_CumulativeLog clogs[EL_ERROR_LEVEL_MAX]
Definition: event_logger.h:391
ObcTime TMGR_get_master_clock(void)
現在の master_clock_ を取得する
Definition: time_manager.c:80