1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker //==============================================================================
15*61c4878aSAndroid Build Coastguard Worker // BUILD
16*61c4878aSAndroid Build Coastguard Worker // ninja -C out
17*61c4878aSAndroid Build Coastguard Worker // pw_strict_host_clang_debug/obj/pw_trace_tokenized/bin/trace_tokenized_example_trigger
18*61c4878aSAndroid Build Coastguard Worker //
19*61c4878aSAndroid Build Coastguard Worker // RUN
20*61c4878aSAndroid Build Coastguard Worker // ./out/pw_strict_host_clang_debug/obj/pw_trace_tokenized/bin/trace_tokenized_example_trigger
21*61c4878aSAndroid Build Coastguard Worker // trace.bin
22*61c4878aSAndroid Build Coastguard Worker //
23*61c4878aSAndroid Build Coastguard Worker // DECODE
24*61c4878aSAndroid Build Coastguard Worker // python pw_trace_tokenized/py/trace_tokenized.py -i trace.bin -o trace.json
25*61c4878aSAndroid Build Coastguard Worker // ./out/pw_strict_host_clang_debug/obj/pw_trace_tokenized/bin/trace_tokenized_example_basic#trace
26*61c4878aSAndroid Build Coastguard Worker //
27*61c4878aSAndroid Build Coastguard Worker // VIEW
28*61c4878aSAndroid Build Coastguard Worker // In chrome navigate to chrome://tracing, and load the trace.json file.
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Worker #include "pw_log/log.h"
31*61c4878aSAndroid Build Coastguard Worker #include "pw_trace/example/sample_app.h"
32*61c4878aSAndroid Build Coastguard Worker #include "pw_trace/trace.h"
33*61c4878aSAndroid Build Coastguard Worker #include "pw_trace_tokenized/example/trace_to_file.h"
34*61c4878aSAndroid Build Coastguard Worker #include "pw_trace_tokenized/trace_callback.h"
35*61c4878aSAndroid Build Coastguard Worker #include "pw_trace_tokenized/trace_tokenized.h"
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker namespace {
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kTriggerId = 3;
40*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kTriggerStartTraceRef =
41*61c4878aSAndroid Build Coastguard Worker PW_TRACE_REF_DATA(PW_TRACE_TYPE_ASYNC_START,
42*61c4878aSAndroid Build Coastguard Worker "Processing", // Module
43*61c4878aSAndroid Build Coastguard Worker "Job", // Label
44*61c4878aSAndroid Build Coastguard Worker PW_TRACE_FLAGS_DEFAULT,
45*61c4878aSAndroid Build Coastguard Worker "Process",
46*61c4878aSAndroid Build Coastguard Worker "@pw_py_struct_fmt:B");
47*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kTriggerEndTraceRef = PW_TRACE_REF(PW_TRACE_TYPE_ASYNC_END,
48*61c4878aSAndroid Build Coastguard Worker "Processing", // Module
49*61c4878aSAndroid Build Coastguard Worker "Job", // Label
50*61c4878aSAndroid Build Coastguard Worker PW_TRACE_FLAGS_DEFAULT,
51*61c4878aSAndroid Build Coastguard Worker "Process");
52*61c4878aSAndroid Build Coastguard Worker
53*61c4878aSAndroid Build Coastguard Worker } // namespace
54*61c4878aSAndroid Build Coastguard Worker
TraceEventCallback(void *,pw_trace_tokenized_TraceEvent * event)55*61c4878aSAndroid Build Coastguard Worker pw_trace_TraceEventReturnFlags TraceEventCallback(
56*61c4878aSAndroid Build Coastguard Worker void* /* user_data */, pw_trace_tokenized_TraceEvent* event) {
57*61c4878aSAndroid Build Coastguard Worker if (event->trace_token == kTriggerStartTraceRef &&
58*61c4878aSAndroid Build Coastguard Worker event->trace_id == kTriggerId) {
59*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Trace capture started!");
60*61c4878aSAndroid Build Coastguard Worker PW_TRACE_SET_ENABLED(true);
61*61c4878aSAndroid Build Coastguard Worker }
62*61c4878aSAndroid Build Coastguard Worker if (event->trace_token == kTriggerEndTraceRef &&
63*61c4878aSAndroid Build Coastguard Worker event->trace_id == kTriggerId) {
64*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Trace capture ended!");
65*61c4878aSAndroid Build Coastguard Worker return PW_TRACE_EVENT_RETURN_FLAGS_DISABLE_AFTER_PROCESSING;
66*61c4878aSAndroid Build Coastguard Worker }
67*61c4878aSAndroid Build Coastguard Worker return 0;
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker
main(int argc,char ** argv)70*61c4878aSAndroid Build Coastguard Worker int main(int argc, char** argv) { // Take filename as arg
71*61c4878aSAndroid Build Coastguard Worker if (argc != 2) {
72*61c4878aSAndroid Build Coastguard Worker PW_LOG_ERROR("Expected output file name as argument.\n");
73*61c4878aSAndroid Build Coastguard Worker return -1;
74*61c4878aSAndroid Build Coastguard Worker }
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker // Register trigger callback
77*61c4878aSAndroid Build Coastguard Worker pw::trace::Callbacks& callbacks = pw::trace::GetCallbacks();
78*61c4878aSAndroid Build Coastguard Worker callbacks
79*61c4878aSAndroid Build Coastguard Worker .RegisterEventCallback(TraceEventCallback,
80*61c4878aSAndroid Build Coastguard Worker pw::trace::Callbacks::kCallOnEveryEvent)
81*61c4878aSAndroid Build Coastguard Worker .IgnoreError(); // TODO: b/242598609 - Handle Status properly
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker // Ensure tracing is off at start, the trigger will turn it on.
84*61c4878aSAndroid Build Coastguard Worker PW_TRACE_SET_ENABLED(false);
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker // Dump trace data to the file passed in.
87*61c4878aSAndroid Build Coastguard Worker pw::trace::TraceToFile trace_to_file(callbacks, argv[1]);
88*61c4878aSAndroid Build Coastguard Worker
89*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Running trigger example...");
90*61c4878aSAndroid Build Coastguard Worker RunTraceSampleApp();
91*61c4878aSAndroid Build Coastguard Worker return 0;
92*61c4878aSAndroid Build Coastguard Worker }
93