车载信息服务软件开发包使用指南(21)
4.10 平台
- EFS备份和恢复
- OTA操作
- Ecall操作
4.10.1 EFS的备份和恢复
这个示例应用程序演示了如何使用api来请求EFS备份,并侦听EFS恢复和备份指示。
- 获取平台工厂实例
auto &platformFactory = telux::platform::PlatformFactory::getInstance();
- 准备一个在文件系统子系统初始化完成时被调用的回调
std::promise<telux::common::ServiceStatus> p;
auto initCb = [&p](telux::common::ServiceStatus status) {
std::cout << "Received service status: " << static_cast<int>(status) << std::endl;
p.set_value(status);
};
- 获取文件系统管理器
std::shared_ptr<telux::platform::IFsManager> fsManager = platformFactory.getFsManager(initCb);
if (fsManager == nullptr) {
std::cout << "filesystem manager is nullptr" << std::endl;
exit(1);
}
std::cout << "Obtained filesystem manager" << std::endl;
- 等待初始化完成后再进行
p.get_future().get();
if (fsManager->getServiceStatus() != telux::common::ServiceStatus::SERVICE_AVAILABLE) {
std::cout << "Filesystem service not available" << std::endl;
exit(1);
}
std::cout << "Filesystem service is now available" << std::endl;
- 创建侦听器对象并注册为侦听器
std::shared_ptr<EfsEventListener> efsEventListener = std::make_shared<EfsEventListener>();
fsManager->registerListener(efsEventListener);
- 接收服务状态通知
virtual void onServiceStatusChange(telux::common::ServiceStatus serviceStatus) override {
PRINT_NOTIFICATION << "Filesystem service status: ";
std::string status;
switch (serviceStatus) {
case telux::common::ServiceStatus::SERVICE_AVAILABLE: {
status = "Available";
break;
}
case telux::common::ServiceStatus::SERVICE_UNAVAILABLE: {
status = "Unavailable";
break;
}
case telux::common::ServiceStatus::SERVICE_FAILED: {
status = "Failed";
break;
}
default: {
status = "Unknown";
break;
}
}
std::cout << status << std::endl;
}
- 可在必要时启动EFS备份
telux::common::Status status = fsManager->startEfsBackup();
if(status != telux::common::Status::SUCCESS) {
std::cout << "Unable to start EFS backup: ";
Utils::printStatus(status);
}
- 接收EFS恢复和备份通知
virtual void OnEfsRestoreEvent(telux::platform::EfsEventInfo event) override {
PRINT_NOTIFICATION
<< ": Received efs event: Restore"
<< ((event.event == telux::platform::EfsEvent::START) ? " started" : "ended");
if (event.event == telux::platform::EfsEvent::END) {
std::cout << " with result: " << Utils::getErrorCodeAsString(event.error) << std::endl;
}
}
virtual void OnEfsBackupEvent(telux::platform::EfsEventInfo event) override {
PRINT_NOTIFICATION
<< ": Received efs event: Backup"
<< ((event.event == telux::platform::EfsEvent::START) ? " started" : "ended");
if (event.event == telux::platform::EfsEvent::END) {
std::cout << " with result: " << Utils::getErrorCodeAsString(event.error) << std::endl;
}
}
- 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(efsEventListener);
efsEventListener = nullptr;
fsManager = nullptr;
4.10.2 OTA操作
这个示例应用程序演示了如何准备操作操作,何时启动操作更新和处理操作后操作。
- 获取平台工厂实例
auto &platformFactory = telux::platform::PlatformFactory::getInstance();
- 准备一个在文件系统子系统初始化完成时被调用的回调
std::promise<telux::common::ServiceStatus> p;
auto initCb = [&p](telux::common::ServiceStatus status) {
std::cout << "Received service status: " << static_cast<int>(status) << std::endl;
p.set_value(status);
}
- 获取文件系统管理器
if (fsManager == nullptr) {
std::cout << "filesystem manager is nullptr" << std::endl;
exit(1);
}
std::cout << "Obtained filesystem manager" << std::endl;
- 等待初始化完成后再进行
p.get_future().get();
if (fsManager->getServiceStatus() != telux::common::ServiceStatus::SERVICE_AVAILABLE) {
std::cout << "Filesystem service not available" << std::endl;
exit(1);
}
std::cout << "Filesystem service is now available" << std::endl;
- 创建侦听器对象并注册为侦听器
std::shared_ptr<OtaOperationsListener> otaOperationsListener
= std::make_shared<OtaOperationsListener>();
fsManager->registerListener(otaOperationsListener);
- 接收服务状态通知
virtual void onServiceStatusChange(telux::common::ServiceStatus serviceStatus) override {
PRINT_NOTIFICATION << "Ota operation service status: ";
std::string status;
switch (serviceStatus) {
case ServiceStatus::SERVICE_AVAILABLE: {
status = "Available";
break;
}
case ServiceStatus::SERVICE_UNAVAILABLE: {
status = "Unavailable";
break;
}
case ServiceStatus::SERVICE_FAILED: {
status = "Failed";
break;
}
default: {
status = "Unknown";
break;
}
}
std::cout << status << std::endl;
}
-
下载软件包
-
准备OTA启动
telux::common::Status otaStartStatus = telux::common::Status::FAILED;
OtaOperation otaOperation = OtaOperation::START;
std::promise<ErrorCode> p;
otaStartStatus = fsManager->prepareForOta(
otaOperation, [&p, fsManager](ErrorCode error) { p.set_value(error); });
if (otaStartStatus != telux::common::Status::SUCCESS) {
std::cout << "Request to prepare for ota start : ";
Utils::printStatus(otaStartStatus);
exit(1);
} else {
std::cout << "Request to prepare for ota start successful";
ErrorCode error = p.get_future().get();
std::cout << "Prepare for ota start with result: " << Utils::getErrorCodeAsString(error)
<< std::endl;
}
-
客户端可以启动OTA更新
-
OTA完成后,向文件系统管理器的更新状态
OperationStatus operationStatus = OperationStatus::SUCCESS;
std::promise<ErrorCode> p;
otaEndStatus = fsManager->otaCompleted(
operationStatus, [&p, fsManager](ErrorCode error) { p.set_value(error); });
if (otaEndStatus != telux::common::Status::SUCCESS) {
std::cout << "Ota completion for update succeed request : ";
Utils::printStatus(otaEndStatus);
// Note: If OTA completion result in a failure, the client needs to start
// with prepareForOta
} else {
std::cout << "Ota completion for update succeed request successful";
ErrorCode error = p.get_future().get();
std::cout << " ota completed for update succeed with result: " << Utils::getErrorCodeAsString(error)
<< std::endl;
}
- 如果用户决定镜像文件系统,请启动AB同步
telux::common::Status abSyncStatus = telux::common::Status::FAILED;
std::promise<ErrorCode> p;
abSyncStatus = fsManager->startAbSync([&p, fsManager](ErrorCode error) { p.set_value(error); });
if (abSyncStatus != telux::common::Status::SUCCESS) {
std::cout << "Request to start absync : ";
Utils::printStatus(abSyncStatus);
} else {
std::cout << "Request to start absync successful";
ErrorCode error = p.get_future().get();
std::cout << "Start absync with result: " << Utils::getErrorCodeAsString(error) << std::endl;
}
- 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(otaOperationsListener);
otaOperationsListener = nullptr;
fsManager = nullptr;
4.10.3 Ecall操作
这个示例应用程序演示了如何准备eCall操作并指示eCall完成。
- 获取平台工厂实例
auto &platformFactory = PlatformFactory::getInstance();
- 准备一个在文件系统子系统初始化完成时被调用的回调
std::promise<telux::common::ServiceStatus> p;
auto initCb = [&p](telux::common::ServiceStatus status) {
std::cout << "Received service status: " << static_cast<int>(status) << std::endl;
p.set_value(status);
};
- 获取文件系统管理器
std::shared_ptr<telux::platform::IFsManager> fsManager = platformFactory.getFsManager(initCb);
if (fsManager == nullptr) {
std::cout << "filesystem manager is nullptr" << std::endl;
exit(1);
}
std::cout << "Obtained filesystem manager" << std::endl;
- 等待初始化完成后再进行
p.get_future().get();
if (fsManager->getServiceStatus() != telux::common::ServiceStatus::SERVICE_AVAILABLE) {
std::cout << "Filesystem service not available" << std::endl;
exit(1);
}
std::cout << "Filesystem service is now available" << std::endl
- 创建侦听器对象并注册为侦听器
std::shared_ptr<EcallOperationListener> ecallOperationListener
= std::make_shared<EcallOperationListener>();
fsManager->registerListener(ecallOperationListener);
- 接收服务状态通知
virtual void onServiceStatusChange(telux::common::ServiceStatus serviceStatus) override {
PRINT_NOTIFICATION << "Ecall operation service status: ";
std::string status;
switch (serviceStatus) {
case ServiceStatus::SERVICE_AVAILABLE: {
status = "Available";
break;
}
case ServiceStatus::SERVICE_UNAVAILABLE: {
status = "Unavailable";
break;
}
case ServiceStatus::SERVICE_FAILED: {
status = "Failed";
break;
}
default: {
status = "Unknown";
break;
}
}
std::cout << status << std::endl;
}
- 在启动eCall之前,请为eCall准备文件系统管理器
注意:即使准备eCall的请求失败,也建议启动eCall。此API可以在执行eCall时重新调用。
telux::common::Status ecallStartStatus = telux::common::Status::FAILED;
std::cout << "Request to prepare for eCall start invoked " << std::endl;
ecallStartStatus = fsManager->prepareForEcall();
if (ecallStartStatus == telux::common::Status::SUCCESS) {
std::cout << "Request to prepare for eCall start successful";
} else {
std::cout << "Request to prepare for eCall start failed : ";
Utils::printStatus(ecallStartStatus);
}
-
启动eCall
-
当文件系统操作即将在秒内恢复时接收通知
注意:在此通知中,客户端仍然可以暂停文件系统操作,并通过调用预先设置为eCall的API来继续ecall(步骤[7])
virtual void OnFsOperationImminentEvent(uint32_t timeLeftToStart) override {
PRINT_NOTIFICATION << "Filesystem operation resumes in seconds: ";
std::cout << timeLeftToStart << std::endl;
}
- 当eCall完成后,请向文件系统管理器进行指示
telux::common::Status ecallEndStatus = telux::common::Status::FAILED;
std::cout << "eCall completion request being invoked " << std::endl;
ecallEndStatus = fsManager->eCallCompleted();
if (ecallEndStatus == telux::common::Status::SUCCESS) {
std::cout << "eCall completion request successful";
} else {
std::cout << "eCall completion request failed : ";
Utils::printStatus(ecallEndStatus);
}
- 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(ecallOperationListener);
ecallOperationListener = nullptr;
fsManager = nullptr;