车载信息服务软件开发包使用指南(18)
4.7 电源
- 获取 TCU 电源状态更新
- 在主动模式下设置 TCU 活动状态
- 在被动模式下设置 TCU 活动状态
4.7.1 获取 TCU 电源状态更新
此示例应用程序演示了如何注册 TCU 活动电源状态通知,以便在电源状态转换之前执行任何任务。 这些在 ACTIVE 和 PASSIVE 模式下均有效。
- 实现ITcuActivityListener和IServiceStatusListener接口
class MyTcuActivityStateListener : public ITcuActivityListener, public IServiceStatusListener {
public:
void onTcuActivityStateUpdate(TcuActivityState state) override;
void onServiceStatusChange(ServiceStatus status) override;
};
-
获取PowerFactory实例
auto &powerFactory = PowerFactory::getInstance();
-
获取 clientType 为 SLAVE 的 TCU-activity manager 实例
auto tcuActivityManager = powerFactory.getTcuActivityManager(ClientType::SLAVE);
-
等待TCU-活动管理服务初始化就绪
bool isReady = tcuActivityManager->isReady();
if(!isReady) {
std::cout << "TCU-activity management service is not ready" << std::endl;
std::cout << "Waiting uncondotionally for it to be ready " << std::endl;
std::future<bool> f = tcuActivityManager->onReady();
isReady = f.get();
}
- 如果SDK无法初始化tcu活动管理服务,则退出应用程序
if(isReady) {
std::cout << " *** TCU-activity management service is Ready *** " << std::endl;
} else {
std::cout << " *** ERROR - Unable to initialize TCU-activity management service" << std::endl;
return 1;
}
-
实例化MyTcuActivityStateListener
auto myTcuStateListener = std::make_shared<MyTcuActivityStateListener>();
-
注册以更新tcu活动状态及其管理服务状态
tcuActivityManager->registerListener(myTcuStateListener);
tcuActivityManager->registerServiceStateListener(myTcuStateListener);
- 等待 TCU 活动状态更新
void MyTcuActivityStateListener::onTcuActivityStateUpdate(TcuActivityState state) {
std::cout << std::endl << "********* TCU-activity state update *********" << std::endl;
// Avoid long blocking calls when handling notifications
}
-
在SUSPEND/SHUTDOWN通知上,保存任何必需的信息并发送一个(尽管有多个侦听器)确认
tcuActivityManager->sendActivityStateAck(TcuActivityStateAck);
-
实现onServiceStatusChange回调,以了解tcu活动管理服务何时停止
// When the TCU-activity management service goes down, this API is invoked
// with status UNAVAILABLE. All TCU-activity state notifications will be
// stopped until the status becomes AVAILABLE again.
void MyTcuActivityStateListener::onServiceStatusChange(ServiceStatus status) {
std::cout << std::endl << "****** TCU-activity management service status update ******" << std::endl;
// Avoid long blocking calls when handling notifications
}
4.7.2 在主动模式下设置 TCU 活动状态
这个示例应用程序演示了如何在活动模式下更改tcu活动电源状态。
- 实现一个命令响应回调方法
// This is invoked with error code indicating whether the request
// was SUCCESS or FAILURE
void commandResponse(ErrorCode error) {
if (error == ErrorCode::SUCCESS) {
std::cout << " Command executed successfully" << std::endl;
} else {
std::cout << " Command failed, errorCode: " << static_cast<int>(error) << std::endl;
}
}
- 实现ITcuActivityListener和IServiceStatusListener接口
class MyTcuActivityStateListener : public ITcuActivityListener, public IServiceStatusListener {
public:
void onTcuActivityStateUpdate(TcuActivityState state) override;
void onServiceStatusChange(ServiceStatus status) override;
};
-
获取一个PowerFactory实例
auto &powerFactory = PowerFactory::getInstance();
-
获取ClientType为MASTER的tcu活动管理器实例
auto tcuActivityManager = powerFactory.getTcuActivityManager(ClientType::MASTER);
-
等待TCU-活动管理服务初始化就绪
bool isReady = tcuActivityManager->isReady();
if(!isReady) {
std::cout << "TCU-activity management service is not ready" << std::endl;
std::cout << "Waiting uncondotionally for it to be ready " << std::endl;
std::future<bool> f = tcuActivityManager->onReady();
isReady = f.get();
}
- 如果SDK无法初始化TCU-activity management服务,则退出应用
if(isReady) {
std::cout << " *** TCU-activity management service is Ready *** " << std::endl;
} else {
std::cout << " *** ERROR - Unable to initialize TCU-activity management service" << std::endl;
return 1;
}
-
实例化MyTcuActivityStateListener
auto myTcuStateListener = std::make_shared<MyTcuActivityStateListener>();
-
注册更新 TCU 活动状态及其管理服务状态
tcuActivityManager->registerListener(myTcuStateListener);
tcuActivityManager->registerServiceStateListener(myTcuStateListener);
-
设置TCU活动电源状态
tcuActivityManager->setActivityState(state,&commandResponse);
-
实施 onTcuActivityStateUpdate,它被调用以通知 TCU 活动状态正在更改为所需状态
void MyTcuActivityStateListener::onTcuActivityStateUpdate(TcuActivityState state) {
std::cout << std::endl << "********* TCU-activity state update *********" << std::endl;
// Avoid long blocking calls when handling notifications
}
-
在 SUSPEND/SHUTDOWN 通知中,保存所有需要的信息并发送一个(尽管有多个监听者)确认
tcuActivityManager->sendActivityStateAck(TcuActivityStateAck);
-
实施 onServiceStatusChange 回调以了解 TCU 活动管理服务何时关闭
// When the TCU-activity management service goes down, this API is invoked
// with status UNAVAILABLE. All TCU-activity state notifications will be
// stopped until the status becomes AVAILABLE again.
void MyTcuActivityStateListener::onServiceStatusChange(ServiceStatus status) {
std::cout << std::endl << "****** TCU-activity management service status update ******" << std::endl;
// Avoid long blocking calls when handling notifications
}
4.7.3 设置TCU被动激活状态
此示例应用演示了如何在被动模式下更改 TCU 活动电源状态。
- 实现命令响应回调方法
// This is invoked with error code indicating whether the request
// was SUCCESS or FAILURE
void commandResponse(ErrorCode error) {
if (error == ErrorCode::SUCCESS) {
std::cout << " Command executed successfully" << std::endl;
} else {
std::cout << " Command failed, errorCode: " << static_cast<int>(error) << std::endl;
}
}
- 实现ITcuActivityListener和IServiceStatusListener接口
class MyTcuActivityStateListener : public ITcuActivityListener, public IServiceStatusListener {
public:
void onTcuActivityStateUpdate(TcuActivityState state) override;
void onSlaveAckStatusUpdate(telux::common::Status status);
void onServiceStatusChange(ServiceStatus status) override;
};
-
获取一个PowerFactory实例
auto &powerFactory = PowerFactory::getInstance();
-
获取 ClientType 为 MASTER 的 TCU 活动管理器实例
auto tcuActivityManager = powerFactory.getTcuActivityManager(ClientType::MASTER);
-
等待TCU-活动管理服务初始化就绪
bool isReady = tcuActivityManager->isReady();
if(!isReady) {
std::cout << "TCU-activity management service is not ready" << std::endl;
std::cout << "Waiting uncondotionally for it to be ready " << std::endl;
std::future<bool> f = tcuActivityManager->onReady();
isReady = f.get();
}
- 如果SDK无法初始化TCU-activity management服务,则退出应用
if(isReady) {
std::cout << " *** TCU-activity management service is Ready *** " << std::endl;
} else {
std::cout << " *** ERROR - Unable to initialize TCU-activity management service" << std::endl;
return 1;
}
-
实例化MyTcuActivityStateListener
auto myTcuStateListener = std::make_shared<MyTcuActivityStateListener>();
-
注册更新 TCU 活动状态及其管理服务状态
tcuActivityManager->registerListener(myTcuStateListener);
tcuActivityManager->registerServiceStateListener(myTcuStateListener);
-
设置 TCU 活动状态
tcuActivityManager->setActivityState(state,&commandResponse);
-
实施 onTcuActivityStateUpdate,它被调用以通知 TCU 活动状态正在更改为所需状态
void MyTcuActivityStateListener::onTcuActivityStateUpdate(TcuActivityState state) {
std::cout << std::endl << "********* TCU-activity state update *********" << std::endl;
// Avoid long blocking calls when handling notifications
}
-
在 SUSPEND/SHUTDOWN 通知中,保存所有需要的信息并发送一个(尽管有多个监听者)确认
tcuActivityManager->sendActivityStateAck(TcuActivityStateAck);
-
调用下面的监听API通知系统中所有客户端的确认状态
void MyTcuActivityStateListener::onSlaveAckStatusUpdate(telux::common::Status status) {
if (status == telux::common::Status::SUCCESS) {
std::cout << " All clients acknowledged successfully" << std::endl;
} else if (status == telux::common::Status::EXPIRED) {
std::cout << " Timeout occured while waiting for all acknowledgements" << std::endl;
} else {
std::cout << " Failed to receive all acknowledgements, status: " << static_cast<int>(status) <<
std::endl;
}
}
- 实施 onServiceStatusChange 回调以了解 TCU 活动管理服务何时关闭
// When the TCU-activity management service goes down, this API is invoked
// with status UNAVAILABLE. All TCU-activity state notifications will be
// stopped until the status becomes AVAILABLE again.
void MyTcuActivityStateListener::onServiceStatusChange(ServiceStatus status) {
std::cout << std::endl << "****** TCU-activity management service status update ******" << std::endl;
// Avoid long blocking calls when handling notifications
}