| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DIAGNOSTICS_H_ |
| #define DIAGNOSTICS_H_ |
| |
| #include <cstdint> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <base/time/time.h> |
| #include <base/timer/timer.h> |
| |
| #include "hid_message.h" |
| #include "hidraw_device.h" |
| |
| namespace atrusctl { |
| |
| class Diagnostics { |
| public: |
| struct DiagCommand { |
| uint16_t id; |
| const char* description; |
| }; |
| |
| Diagnostics(); |
| ~Diagnostics(); |
| |
| void Start(const base::TimeDelta& diag_interval, |
| const base::TimeDelta& ext_diag_interval, |
| const std::string& device_path); |
| void Stop(); |
| void UpdateNumberOfDevices(int new_value); |
| |
| int number_of_connected_slaves() const { |
| return number_of_connected_slaves_; |
| }; |
| |
| private: |
| void Run(); |
| void QueryDeviceWithCommands(const std::vector<DiagCommand>& commands); |
| void Poll(); |
| void LogResponse(const std::string& cmd_desc, const HIDMessage& response); |
| void LogQueryError(HIDRawDevice::QueryResult code, const HIDMessage& request); |
| void HandleQueryResult(const std::string& cmd_desc, |
| HIDRawDevice::QueryResult code, |
| const HIDMessage& request, |
| const HIDMessage& response); |
| void HandlePollQueryResult(const std::string& cmd_desc, |
| HIDRawDevice::QueryResult code, |
| const HIDMessage& request, |
| const HIDMessage& response); |
| void UpdateUptime(int new_value); |
| // Returns true if |number_of_connected_slaves_| was set to |new_value| |
| bool UpdateNumberOfConnectedSlaves(int new_value); |
| void ResetSessionState(); |
| bool SessionStateHasChanged() const; |
| |
| const std::vector<DiagCommand> commands_; |
| const std::vector<DiagCommand> commands_extended_; |
| const std::vector<DiagCommand> commands_poll_; |
| const std::vector<DiagCommand> commands_truevoice_; |
| |
| HIDRawDevice device_; |
| |
| // Determines if the next call of Run() should perform an extended diagnose |
| bool should_do_extended_diagnose_ = true; |
| |
| // This timer determines how often Run() should be called, i.e. how often |
| // diagnostics should be fetched from the device, after calling Start(). |
| base::RepeatingTimer diag_timer_; |
| |
| // Used to determine how often extended diagnostics should be run per default, |
| // i.e. how often we also send the commands in |commands_extended_| to the |
| // device when Run() is called. |
| base::TimeDelta ext_diag_interval_; |
| base::TimeTicks last_extended_diag_time_; |
| |
| // Below state is fetched from the device each time Run() is called. Whenever |
| // a certain change in these values is detected on the device, we flag for |
| // doing an extended diagnose on the next call of Run() (same |
| // effect as explained above for |ext_diag_interval_|). |
| int uptime_ = 0; |
| int number_of_connected_devices_ = 0; |
| int number_of_connected_slaves_ = 0; |
| |
| // State that is polled more often from the device. When a change in these |
| // values is detected, the updated value is written to syslog along with its |
| // command ID |
| std::string mic_selected_; |
| std::string spk_selected_; |
| std::string spk_silence_; |
| std::string call_status_; |
| std::string dfu_status_; |
| |
| base::RepeatingTimer poll_timer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Diagnostics); |
| }; |
| |
| } // namespace atrusctl |
| |
| #endif // DIAGNOSTICS_H_ |