trace_recorder_parser/snapshot/event/
mod.rs

1use crate::time::Timestamp;
2use crate::types::{ObjectClass, UserEventArgRecordCount};
3use derive_more::{Binary, Deref, Display, Into, LowerHex, Octal, UpperHex};
4
5pub use isr::{IsrBeginEvent, IsrEvent, IsrResumeEvent};
6pub use low_power::{LowPowerBeginEvent, LowPowerEndEvent, LowPowerEvent};
7pub use parser::EventParser;
8pub use task::{TaskBeginEvent, TaskCreateEvent, TaskEvent, TaskReadyEvent, TaskResumeEvent};
9pub use user::UserEvent;
10
11pub mod isr;
12pub mod low_power;
13pub mod parser;
14pub mod task;
15pub mod user;
16
17#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display)]
18#[display(fmt = "{_0:X?}")]
19pub struct EventRecord([u8; EventRecord::SIZE]);
20
21impl EventRecord {
22    pub(crate) const SIZE: usize = 4;
23
24    pub(crate) fn new(record: [u8; EventRecord::SIZE]) -> Self {
25        Self(record)
26    }
27
28    pub fn as_slice(&self) -> &[u8] {
29        &self.0
30    }
31
32    pub fn event_code(&self) -> EventCode {
33        EventCode(self.0[0])
34    }
35}
36
37/// Event codes for snapshot mode
38#[derive(
39    Copy,
40    Clone,
41    Eq,
42    PartialEq,
43    Ord,
44    PartialOrd,
45    Hash,
46    Debug,
47    Into,
48    Display,
49    Binary,
50    Octal,
51    LowerHex,
52    UpperHex,
53)]
54#[display(fmt = "{_0:X}")]
55pub struct EventCode(u8);
56
57#[derive(
58    Copy,
59    Clone,
60    Eq,
61    PartialEq,
62    Ord,
63    PartialOrd,
64    Hash,
65    Debug,
66    Into,
67    Display,
68    Binary,
69    Octal,
70    LowerHex,
71    UpperHex,
72    Deref,
73)]
74#[display(fmt = "{}", "self.into_class()")]
75pub struct ObjectClassCode(pub(crate) u8);
76
77impl ObjectClassCode {
78    /// Extract the object class code from an event code (lower 3 bits)
79    pub(crate) fn from_raw(ec: u8) -> Self {
80        Self(ec & 0x07)
81    }
82
83    pub(crate) fn into_raw(self) -> u8 {
84        self.0
85    }
86
87    pub fn into_class(self) -> ObjectClass {
88        use ObjectClass::*;
89        match self.0 {
90            0 => Queue,
91            1 => Semaphore,
92            2 => Mutex,
93            3 => Task,
94            4 => Isr,
95            5 => Timer,
96            6 => EventGroup,
97            // Class codes are only 3 bits, they don't represent Streambuffer/Messagebuffer
98            _ => StreamBuffer,
99        }
100    }
101}
102
103/// Event types for snapshot mode
104#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display)]
105pub enum EventType {
106    #[display(fmt = "NULL")]
107    Null,
108
109    // EVENTGROUP_DIV
110    // Miscellaneous events
111    #[display(fmt = "XPS")]
112    Xps,
113    #[display(fmt = "TASK_READY")]
114    TaskReady,
115    #[display(fmt = "NEW_TIME")]
116    NewTime,
117
118    // EVENTGROUP_TS
119    // Events for storing task-switches and interrupts.
120    // The RESUME events are generated if the task/interrupt is already marked active.
121    #[display(fmt = "TS_ISR_BEGIN")]
122    TaskSwitchIsrBegin,
123    #[display(fmt = "TS_ISR_RESUME")]
124    TaskSwitchIsrResume,
125    #[display(fmt = "TS_TASK_BEGIN")]
126    TaskSwitchTaskBegin,
127    #[display(fmt = "TS_TASK_RESUME")]
128    TaskSwitchTaskResume,
129
130    // EVENTGROUP_OBJCLOSE_NAME
131    #[display(fmt = "OBJCLOSE_NAME({_0})")]
132    ObjectCloseName(ObjectClassCode),
133
134    // EVENTGROUP_OBJCLOSE_PROP
135    #[display(fmt = "OBJCLOSE_PROPERTY({_0})")]
136    ObjectCloseProperty(ObjectClassCode),
137
138    // EVENTGROUP_CREATE
139    #[display(fmt = "CREATE_OBJECT({_0})")]
140    CreateObject(ObjectClassCode),
141
142    // EVENTGROUP_SEND
143    #[display(fmt = "SEND({_0})")]
144    Send(ObjectClassCode),
145
146    // EVENTGROUP_RECEIVE
147    #[display(fmt = "RECEIVE({_0})")]
148    Receive(ObjectClassCode),
149
150    // Send/Give operations, from ISR
151    #[display(fmt = "SEND_FROM_ISR({_0})")]
152    SendFromIsr(ObjectClassCode),
153
154    // Receive/Take operations, from ISR
155    #[display(fmt = "RECEIVE_FROM_ISR({_0})")]
156    ReceiveFromIsr(ObjectClassCode),
157
158    // Failed create calls - memory allocation failed
159    #[display(fmt = "CREATE_OBJECT_FAILED({_0})")]
160    CreateObjectFailed(ObjectClassCode),
161
162    // Failed send/give - timeout
163    #[display(fmt = "SEND_FAILED({_0})")]
164    SendFailed(ObjectClassCode),
165
166    // Failed receive/take - timeout
167    #[display(fmt = "RECEIVE_FAILED({_0})")]
168    ReceiveFailed(ObjectClassCode),
169
170    // Failed non-blocking send/give - queue full
171    #[display(fmt = "SEND_FROM_ISR_FAILED({_0})")]
172    SendFromIsrFailed(ObjectClassCode),
173
174    // Failed non-blocking receive/take - queue empty
175    #[display(fmt = "RECEIVE_FROM_ISR_FAILED({_0})")]
176    ReceiveFromIsrFailed(ObjectClassCode),
177
178    // Events when blocking on receive/take
179    #[display(fmt = "RECEIVE_BLOCK({_0})")]
180    ReceiveBlock(ObjectClassCode),
181
182    // Events when blocking on send/give
183    #[display(fmt = "SEND_BLOCK({_0})")]
184    SendBlock(ObjectClassCode),
185
186    // Events on queue peek (receive)
187    #[display(fmt = "PEEK({_0})")]
188    Peek(ObjectClassCode),
189
190    // Events on object delete (vTaskDelete or vQueueDelete)
191    #[display(fmt = "DELETE_OBJECT({_0})")]
192    DeleteObject(ObjectClassCode),
193
194    // Other events - object class is implied: TASK
195    #[display(fmt = "TASK_DELAY_UNTIL")]
196    TaskDelayUntil,
197    #[display(fmt = "TASK_DELAY")]
198    TaskDelay,
199    #[display(fmt = "TASK_SUSPEND")]
200    TaskSuspend,
201    #[display(fmt = "TASK_RESUME")]
202    TaskResume,
203    #[display(fmt = "TASK_RESUME_FROM_ISR")]
204    TaskResumeFromIsr,
205    #[display(fmt = "TASK_PRIORITY_SET")]
206    TaskPrioritySet,
207    #[display(fmt = "TASK_PRIORITY_INHERIT")]
208    TaskPriorityInherit,
209    #[display(fmt = "TASK_PRIORITY_DISINHERIT")]
210    TaskPriorityDisinherit,
211
212    #[display(fmt = "PEND_FUNC_CALL")]
213    PendFuncCall,
214    #[display(fmt = "PEND_FUNC_CALL_FROM_ISR")]
215    PendFuncCallFromIsr,
216    #[display(fmt = "PEND_FUNC_CALL_FAILED")]
217    PendFuncCallFailed,
218    #[display(fmt = "PEND_FUNC_CALL_FROM_ISR_FAILED")]
219    PendFuncCallFromIsrFailed,
220    #[display(fmt = "MEM_MALLOC_SIZE")]
221    MemoryMallocSize,
222    #[display(fmt = "MEM_MALLOC_ADDRESS")]
223    MemoryMallocAddress,
224    #[display(fmt = "MEM_FREE_SIZE")]
225    MemoryFreeSize,
226    #[display(fmt = "MEM_FREE_ADDRESS")]
227    MemoryFreeAddress,
228
229    // EVENTGROUP_USEREVENT
230    // User events
231    // Note that user event code range is 0x98..=0xA7
232    // Allow for 0-15 arguments (the number of arg *records* (not arg count) is added to event code)
233    // num_arg_records = EventCode - 0x98
234    #[display(fmt = "USER_EVENT")]
235    UserEvent(UserEventArgRecordCount),
236
237    // EVENTGROUP_SYS
238    #[display(fmt = "XTS8")]
239    Xts8,
240    #[display(fmt = "XTS16")]
241    Xts16,
242    #[display(fmt = "EVENT_BEING_WRITTEN")]
243    EventBeingWritten,
244    #[display(fmt = "RESERVED_DUMMY_CODE")]
245    ReservedDummyCode,
246    #[display(fmt = "LOW_POWER_BEGIN")]
247    LowPowerBegin,
248    #[display(fmt = "LOW_POWER_END")]
249    LowPowerEnd,
250    #[display(fmt = "XID")]
251    Xid,
252    #[display(fmt = "XTS16L")]
253    Xts16l,
254
255    // EVENTGROUP_TIMER
256    #[display(fmt = "TIMER_CREATE")]
257    TimerCreate,
258    #[display(fmt = "TIMER_START")]
259    TimerStart,
260    #[display(fmt = "TIMER_RESET")]
261    TimerReset,
262    #[display(fmt = "TIMER_STOP")]
263    TimerStop,
264    #[display(fmt = "TIMER_CHANGE_PERIOD")]
265    TimerChangePeriod,
266    #[display(fmt = "TIMER_DELETE_OBJECT")]
267    TimerDeleteObject,
268    #[display(fmt = "TIMER_START_FROM_ISR")]
269    TimerStartFromIsr,
270    #[display(fmt = "TIMER_RESET_FROM_ISR")]
271    TimerResetFromIsr,
272    #[display(fmt = "TIMER_STOP_FROM_ISR")]
273    TimerStopFromIsr,
274    #[display(fmt = "TIMER_CREATE_FAILED")]
275    TimerCreateFailed,
276    #[display(fmt = "TIMER_START_FAILED")]
277    TimerStartFailed,
278    #[display(fmt = "TIMER_RESET_FAILED")]
279    TimerResetFailed,
280    #[display(fmt = "TIMER_STOP_FAILED")]
281    TimerStopFailed,
282    #[display(fmt = "TIMER_CHANGE_PERIOD_FAILED")]
283    TimerChangePeriodFailed,
284    #[display(fmt = "TIMER_DELETE_FAILED")]
285    TimerDeleteFailed,
286    #[display(fmt = "TIMER_START_FROM_ISR_FAILED")]
287    TimerStartFromIsrFailed,
288    #[display(fmt = "TIMER_RESET_FROM_ISR_FAILED")]
289    TimerResetFromIsrFailed,
290    #[display(fmt = "TIMER_STOP_FROM_ISR_FAILED")]
291    TimerStopFromIsrFailed,
292
293    // EVENTGROUP_EG
294    #[display(fmt = "EVENT_GROUP_CREATE")]
295    EventGroupCreate,
296    #[display(fmt = "EVENT_GROUP_CREATE_FAILED")]
297    EventGroupCreateFailed,
298    #[display(fmt = "EVENT_GROUP_SYNC_BLOCK")]
299    EventGroupSyncBlock,
300    #[display(fmt = "EVENT_GROUP_SYNC_END")]
301    EventGroupSyncEnd,
302    #[display(fmt = "EVENT_GROUP_WAIT_BITS_BLOCK")]
303    EventGroupWaitBitsBlock,
304    #[display(fmt = "EVENT_GROUP_WAIT_BITS_END")]
305    EventGroupWaitBitsEnd,
306    #[display(fmt = "EVENT_GROUP_CLEAR_BITS")]
307    EventGroupClearBits,
308    #[display(fmt = "EVENT_GROUP_CLEAR_BITS_FROM_ISR")]
309    EventGroupClearBitsFromIsr,
310    #[display(fmt = "EVENT_GROUP_SET_BITS")]
311    EventGroupSetBits,
312    #[display(fmt = "EVENT_GROUP_DELETE_OBJECT")]
313    EventGroupDeleteObject,
314    #[display(fmt = "EVENT_GROUP_SYNC_END_FAILED")]
315    EventGroupSyncEndFailed,
316    #[display(fmt = "EVENT_GROUP_WAIT_BITS_END_FAILED")]
317    EventGroupWaitBitsEndFailed,
318    #[display(fmt = "EVENT_GROUP_SET_BITS_FROM_ISR")]
319    EventGroupSetBitsFromIsr,
320    #[display(fmt = "EVENT_GROUP_SET_BITS_FROM_ISR_FAILED")]
321    EventGroupSetBitsFromIsrFailed,
322
323    #[display(fmt = "TASK_INSTANCE_FINISHED_NEXT_KSE")]
324    TaskInstanceFinishedNextKse,
325    #[display(fmt = "TASK_INSTANCE_FINISHED_DIRECT")]
326    TaskInstanceFinishedDirect,
327
328    // TRACE_TASK_NOTIFY_GROUP
329    #[display(fmt = "TASK_NOTIFY")]
330    TaskNotify,
331    #[display(fmt = "TASK_NOTIFY_TAKE")]
332    TaskNotifyTake,
333    #[display(fmt = "TASK_NOTIFY_TAKE_BLOCK")]
334    TaskNotifyTakeBlock,
335    #[display(fmt = "TASK_NOTIFY_FAILED")]
336    TaskNotifyTakeFailed,
337    #[display(fmt = "TASK_NOTIFY_WAIT")]
338    TaskNotifyWait,
339    #[display(fmt = "TASK_NOTIFY_WAIT_BLOCK")]
340    TaskNotifyWaitBlock,
341    #[display(fmt = "TASK_NOTIFY_WAIT_FAILED")]
342    TaskNotifyWaitFailed,
343    #[display(fmt = "TASK_NOTIFY_FROM_ISR")]
344    TaskNotifyFromIsr,
345    #[display(fmt = "TASK_NOTIFY_GIVE_FROM_ISR")]
346    TaskNotifyGiveFromIsr,
347
348    #[display(fmt = "TIMER_EXPIRED")]
349    TimerExpired,
350
351    // Events on queue peek (receive)
352    #[display(fmt = "QUEUE_PEEK_BLOCK")]
353    QueuePeekBlock,
354    #[display(fmt = "SEMAPHORE_PEEK_BLOCK")]
355    SemaphortPeekBlock,
356    #[display(fmt = "MUTEX_PEEK_BLOCK")]
357    MutexPeekBlock,
358
359    // Events on queue peek (receive)
360    #[display(fmt = "QUEUE_PEEK_FAILED")]
361    QueuePeekFailed,
362    #[display(fmt = "SEMAPHORE_PEEK_FAILED")]
363    SemaphortPeekFailed,
364    #[display(fmt = "MUTEX_PEEK_FAILED")]
365    MutexPeekFailed,
366
367    // EVENTGROUP_STREAMBUFFER_DIV
368    #[display(fmt = "STREAMBUFFER_RESET")]
369    StreambufferReset,
370    #[display(fmt = "MESSAGEBUFFER_RESET")]
371    MessagebufferReset,
372    #[display(fmt = "STREAMBUFFER_OBJCLOSE_NAME")]
373    StreambufferObjectCloseName,
374    #[display(fmt = "MESSAGEBUFFER_OBJCLOSE_NAME")]
375    MessagebufferObjectCloseName,
376    #[display(fmt = "STREAMBUFFER_OBJCLOSE_PROPERTY")]
377    StreambufferObjectCloseProperty,
378    #[display(fmt = "MESSAGEBUFFER_OBJCLOSE_PROPERTY")]
379    MessagebufferObjectCloseProperty,
380
381    // EVENTGROUP_MALLOC_FAILED
382    #[display(fmt = "MEM_MALLOC_SIZE_FAILED")]
383    MemoryMallocSizeFailed,
384    #[display(fmt = "MEM_MALLOC_ADDRESS_FAILED")]
385    MemoryFreeAddressFailed,
386
387    #[display(fmt = "UNUSED_STACK")]
388    UnusedStack,
389
390    // Variant to handle unknown/unsupported event code
391    #[display(fmt = "UNKNOWN({_0})")]
392    Unknown(EventCode),
393}
394
395impl From<EventCode> for EventType {
396    fn from(ec: EventCode) -> Self {
397        use EventType::*;
398        match u8::from(ec) {
399            0x00 => Null,
400
401            0x01 => Xps,
402            0x02 => TaskReady,
403            0x03 => NewTime,
404
405            0x04 => TaskSwitchIsrBegin,
406            0x05 => TaskSwitchIsrResume,
407            0x06 => TaskSwitchTaskBegin,
408            0x07 => TaskSwitchTaskResume,
409
410            raw @ 0x08..=0x0F => ObjectCloseName(ObjectClassCode::from_raw(raw)),
411
412            raw @ 0x10..=0x17 => ObjectCloseProperty(ObjectClassCode::from_raw(raw)),
413
414            raw @ 0x18..=0x1F => CreateObject(ObjectClassCode::from_raw(raw)),
415
416            raw @ 0x20..=0x27 => Send(ObjectClassCode::from_raw(raw)),
417
418            raw @ 0x28..=0x2F => Receive(ObjectClassCode::from_raw(raw)),
419
420            raw @ 0x30..=0x37 => SendFromIsr(ObjectClassCode::from_raw(raw)),
421
422            raw @ 0x38..=0x3F => ReceiveFromIsr(ObjectClassCode::from_raw(raw)),
423
424            raw @ 0x40..=0x47 => CreateObjectFailed(ObjectClassCode::from_raw(raw)),
425
426            raw @ 0x48..=0x4F => SendFailed(ObjectClassCode::from_raw(raw)),
427
428            raw @ 0x50..=0x57 => ReceiveFailed(ObjectClassCode::from_raw(raw)),
429
430            raw @ 0x58..=0x5F => SendFromIsrFailed(ObjectClassCode::from_raw(raw)),
431
432            raw @ 0x60..=0x67 => ReceiveFromIsrFailed(ObjectClassCode::from_raw(raw)),
433
434            raw @ 0x68..=0x6F => ReceiveBlock(ObjectClassCode::from_raw(raw)),
435
436            raw @ 0x70..=0x77 => SendBlock(ObjectClassCode::from_raw(raw)),
437
438            raw @ 0x78..=0x7F => Peek(ObjectClassCode::from_raw(raw)),
439
440            raw @ 0x80..=0x87 => DeleteObject(ObjectClassCode::from_raw(raw)),
441
442            0x88 => TaskDelayUntil,
443            0x89 => TaskDelay,
444            0x8A => TaskSuspend,
445            0x8B => TaskResume,
446            0x8C => TaskResumeFromIsr,
447            0x8D => TaskPrioritySet,
448            0x8E => TaskPriorityInherit,
449            0x8F => TaskPriorityDisinherit,
450
451            0x90 => PendFuncCall,
452            0x91 => PendFuncCallFromIsr,
453            0x92 => PendFuncCallFailed,
454            0x93 => PendFuncCallFromIsrFailed,
455            0x94 => MemoryMallocSize,
456            0x95 => MemoryMallocAddress,
457            0x96 => MemoryFreeSize,
458            0x97 => MemoryFreeAddress,
459
460            raw @ 0x98..=0xA7 => UserEvent(UserEventArgRecordCount(raw - 0x98)),
461
462            0xA8 => Xts8,
463            0xA9 => Xts16,
464            0xAA => EventBeingWritten,
465            0xAB => ReservedDummyCode,
466            0xAC => LowPowerBegin,
467            0xAD => LowPowerEnd,
468            0xAE => Xid,
469            0xAF => Xts16l,
470
471            0xB0 => TimerCreate,
472            0xB1 => TimerStart,
473            0xB2 => TimerReset,
474            0xB3 => TimerStop,
475            0xB4 => TimerChangePeriod,
476            0xB5 => TimerDeleteObject,
477            0xB6 => TimerStartFromIsr,
478            0xB7 => TimerResetFromIsr,
479            0xB8 => TimerStopFromIsr,
480            0xB9 => TimerCreateFailed,
481            0xBA => TimerStartFailed,
482            0xBB => TimerResetFailed,
483            0xBC => TimerStopFailed,
484            0xBD => TimerChangePeriodFailed,
485            0xBE => TimerDeleteFailed,
486            0xBF => TimerStartFromIsrFailed,
487            0xC0 => TimerResetFromIsrFailed,
488            0xC1 => TimerStopFromIsrFailed,
489
490            0xC2 => EventGroupCreate,
491            0xC3 => EventGroupCreateFailed,
492            0xC4 => EventGroupSyncBlock,
493            0xC5 => EventGroupSyncEnd,
494            0xC6 => EventGroupWaitBitsBlock,
495            0xC7 => EventGroupWaitBitsEnd,
496            0xC8 => EventGroupClearBits,
497            0xC9 => EventGroupClearBitsFromIsr,
498            0xCA => EventGroupSetBits,
499            0xCB => EventGroupDeleteObject,
500            0xCC => EventGroupSyncEndFailed,
501            0xCD => EventGroupWaitBitsEndFailed,
502            0xCE => EventGroupSetBitsFromIsr,
503            0xCF => EventGroupSetBitsFromIsrFailed,
504
505            0xD0 => TaskInstanceFinishedNextKse,
506            0xD1 => TaskInstanceFinishedDirect,
507
508            0xD2 => TaskNotify,
509            0xD3 => TaskNotifyTake,
510            0xD4 => TaskNotifyTakeBlock,
511            0xD5 => TaskNotifyTakeFailed,
512            0xD6 => TaskNotifyWait,
513            0xD7 => TaskNotifyWaitBlock,
514            0xD8 => TaskNotifyWaitFailed,
515            0xD9 => TaskNotifyFromIsr,
516            0xDA => TaskNotifyGiveFromIsr,
517
518            0xDB => TimerExpired,
519
520            0xDC => QueuePeekBlock,
521            0xDD => SemaphortPeekBlock,
522            0xDE => MutexPeekBlock,
523
524            0xDF => QueuePeekFailed,
525            0xE0 => SemaphortPeekFailed,
526            0xE1 => MutexPeekFailed,
527
528            0xE2 => StreambufferReset,
529            0xE3 => MessagebufferReset,
530            0xE4 => StreambufferObjectCloseName,
531            0xE5 => MessagebufferObjectCloseName,
532            0xE6 => StreambufferObjectCloseProperty,
533            0xE7 => MessagebufferObjectCloseProperty,
534
535            0xE8 => MemoryMallocSizeFailed,
536            0xE9 => MemoryFreeAddressFailed,
537
538            0xEA => UnusedStack,
539
540            _ => Unknown(ec),
541        }
542    }
543}
544
545impl From<EventType> for EventCode {
546    fn from(et: EventType) -> Self {
547        use EventType::*;
548        let ec = match et {
549            Null => 0x00,
550
551            Xps => 0x01,
552            TaskReady => 0x02,
553            NewTime => 0x03,
554
555            TaskSwitchIsrBegin => 0x04,
556            TaskSwitchIsrResume => 0x05,
557            TaskSwitchTaskBegin => 0x06,
558            TaskSwitchTaskResume => 0x07,
559
560            ObjectCloseName(occ) => 0x08 + occ.into_raw(),
561
562            ObjectCloseProperty(occ) => 0x10 + occ.into_raw(),
563
564            CreateObject(occ) => 0x18 + occ.into_raw(),
565
566            Send(occ) => 0x20 + occ.into_raw(),
567
568            Receive(occ) => 0x28 + occ.into_raw(),
569
570            SendFromIsr(occ) => 0x30 + occ.into_raw(),
571
572            ReceiveFromIsr(occ) => 0x38 + occ.into_raw(),
573
574            CreateObjectFailed(occ) => 0x40 + occ.into_raw(),
575
576            SendFailed(occ) => 0x48 + occ.into_raw(),
577
578            ReceiveFailed(occ) => 0x50 + occ.into_raw(),
579
580            SendFromIsrFailed(occ) => 0x58 + occ.into_raw(),
581
582            ReceiveFromIsrFailed(occ) => 0x60 + occ.into_raw(),
583
584            ReceiveBlock(occ) => 0x68 + occ.into_raw(),
585
586            SendBlock(occ) => 0x70 + occ.into_raw(),
587
588            Peek(occ) => 0x78 + occ.into_raw(),
589
590            DeleteObject(occ) => 0x80 + occ.into_raw(),
591
592            TaskDelayUntil => 0x88,
593            TaskDelay => 0x89,
594            TaskSuspend => 0x8A,
595            TaskResume => 0x8B,
596            TaskResumeFromIsr => 0x8C,
597            TaskPrioritySet => 0x8D,
598            TaskPriorityInherit => 0x8E,
599            TaskPriorityDisinherit => 0x8F,
600
601            PendFuncCall => 0x90,
602            PendFuncCallFromIsr => 0x91,
603            PendFuncCallFailed => 0x92,
604            PendFuncCallFromIsrFailed => 0x93,
605            MemoryMallocSize => 0x94,
606            MemoryMallocAddress => 0x95,
607            MemoryFreeSize => 0x96,
608            MemoryFreeAddress => 0x97,
609
610            UserEvent(arc) => 0x98 + arc.0,
611
612            Xts8 => 0xA8,
613            Xts16 => 0xA9,
614            EventBeingWritten => 0xAA,
615            ReservedDummyCode => 0xAB,
616            LowPowerBegin => 0xAC,
617            LowPowerEnd => 0xAD,
618            Xid => 0xAE,
619            Xts16l => 0xAF,
620
621            TimerCreate => 0xB0,
622            TimerStart => 0xB1,
623            TimerReset => 0xB2,
624            TimerStop => 0xB3,
625            TimerChangePeriod => 0xB4,
626            TimerDeleteObject => 0xB5,
627            TimerStartFromIsr => 0xB6,
628            TimerResetFromIsr => 0xB7,
629            TimerStopFromIsr => 0xB8,
630            TimerCreateFailed => 0xB9,
631            TimerStartFailed => 0xBA,
632            TimerResetFailed => 0xBB,
633            TimerStopFailed => 0xBC,
634            TimerChangePeriodFailed => 0xBD,
635            TimerDeleteFailed => 0xBE,
636            TimerStartFromIsrFailed => 0xBF,
637            TimerResetFromIsrFailed => 0xC0,
638            TimerStopFromIsrFailed => 0xC1,
639
640            EventGroupCreate => 0xC2,
641            EventGroupCreateFailed => 0xC3,
642            EventGroupSyncBlock => 0xC4,
643            EventGroupSyncEnd => 0xC5,
644            EventGroupWaitBitsBlock => 0xC6,
645            EventGroupWaitBitsEnd => 0xC7,
646            EventGroupClearBits => 0xC8,
647            EventGroupClearBitsFromIsr => 0xC9,
648            EventGroupSetBits => 0xCA,
649            EventGroupDeleteObject => 0xCB,
650            EventGroupSyncEndFailed => 0xCC,
651            EventGroupWaitBitsEndFailed => 0xCD,
652            EventGroupSetBitsFromIsr => 0xCE,
653            EventGroupSetBitsFromIsrFailed => 0xCF,
654
655            TaskInstanceFinishedNextKse => 0xD0,
656            TaskInstanceFinishedDirect => 0xD1,
657
658            TaskNotify => 0xD2,
659            TaskNotifyTake => 0xD3,
660            TaskNotifyTakeBlock => 0xD4,
661            TaskNotifyTakeFailed => 0xD5,
662            TaskNotifyWait => 0xD6,
663            TaskNotifyWaitBlock => 0xD7,
664            TaskNotifyWaitFailed => 0xD8,
665            TaskNotifyFromIsr => 0xD9,
666            TaskNotifyGiveFromIsr => 0xDA,
667
668            TimerExpired => 0xDB,
669
670            QueuePeekBlock => 0xDC,
671            SemaphortPeekBlock => 0xDD,
672            MutexPeekBlock => 0xDE,
673
674            QueuePeekFailed => 0xDF,
675            SemaphortPeekFailed => 0xE0,
676            MutexPeekFailed => 0xE1,
677
678            StreambufferReset => 0xE2,
679            MessagebufferReset => 0xE3,
680            StreambufferObjectCloseName => 0xE4,
681            MessagebufferObjectCloseName => 0xE5,
682            StreambufferObjectCloseProperty => 0xE6,
683            MessagebufferObjectCloseProperty => 0xE7,
684
685            MemoryMallocSizeFailed => 0xE8,
686            MemoryFreeAddressFailed => 0xE9,
687
688            UnusedStack => 0xEA,
689
690            Unknown(raw) => raw.0,
691        };
692        EventCode(ec)
693    }
694}
695
696#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display)]
697pub enum Event {
698    #[display(fmt = "TaskBegin({_0})")]
699    IsrBegin(IsrBeginEvent),
700    #[display(fmt = "IsrResume({_0})")]
701    IsrResume(IsrResumeEvent),
702
703    #[display(fmt = "TaskBegin({_0})")]
704    TaskBegin(TaskBeginEvent),
705    #[display(fmt = "TaskReady({_0})")]
706    TaskReady(TaskReadyEvent),
707    #[display(fmt = "TaskResume({_0})")]
708    TaskResume(TaskResumeEvent),
709    #[display(fmt = "TaskCreate({_0})")]
710    TaskCreate(TaskCreateEvent),
711
712    #[display(fmt = "LowPowerBegin({_0})")]
713    LowPowerBegin(LowPowerBeginEvent),
714    #[display(fmt = "LowPowerEnd({_0})")]
715    LowPowerEnd(LowPowerEndEvent),
716
717    #[display(fmt = "User({_0})")]
718    User(UserEvent),
719
720    #[display(fmt = "EventRecord({_0})")]
721    Unknown(Timestamp, EventRecord),
722}
723
724impl Event {
725    pub fn timestamp(&self) -> Timestamp {
726        use Event::*;
727        match self {
728            IsrBegin(e) => e.timestamp,
729            IsrResume(e) => e.timestamp,
730            TaskBegin(e) => e.timestamp,
731            TaskReady(e) => e.timestamp,
732            TaskResume(e) => e.timestamp,
733            TaskCreate(e) => e.timestamp,
734            LowPowerBegin(e) => e.timestamp,
735            LowPowerEnd(e) => e.timestamp,
736            User(e) => e.timestamp,
737            Unknown(t, _e) => *t,
738        }
739    }
740}
741
742#[cfg(test)]
743mod test {
744    use super::*;
745
746    #[test]
747    fn event_type_roundtrip() {
748        for raw in 0..=0xFF {
749            let ec = EventCode(raw);
750            let et = EventType::from(ec);
751            assert_eq!(ec, EventCode::from(et));
752        }
753    }
754
755    #[test]
756    fn obj_class_code_roundtrip() {
757        for raw in 0..=0x07 {
758            let occ = ObjectClassCode(raw);
759            let oc = occ.into_class();
760            assert_eq!(raw as usize, oc.into_usize());
761        }
762    }
763}