车载信息服务软件开发包使用指南(21)

281 篇文章 30 订阅

车载信息服务软件开发包使用指南(21)


4.10 平台

  • EFS备份和恢复
  • OTA操作
  • Ecall操作

4.10.1 EFS的备份和恢复

这个示例应用程序演示了如何使用api来请求EFS备份,并侦听EFS恢复和备份指示。

  1. 获取平台工厂实例
auto &platformFactory = telux::platform::PlatformFactory::getInstance();
  1. 准备一个在文件系统子系统初始化完成时被调用的回调
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);
};
  1. 获取文件系统管理器
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;
  1. 等待初始化完成后再进行
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;
  1. 创建侦听器对象并注册为侦听器
std::shared_ptr<EfsEventListener> efsEventListener = std::make_shared<EfsEventListener>();
fsManager->registerListener(efsEventListener);
  1. 接收服务状态通知
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;
}
  1. 可在必要时启动EFS备份
telux::common::Status status = fsManager->startEfsBackup();
if(status != telux::common::Status::SUCCESS) {
	std::cout << "Unable to start EFS backup: ";
	Utils::printStatus(status);
}
  1. 接收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;
	}
}
  1. 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(efsEventListener);
efsEventListener = nullptr;
fsManager = nullptr;

4.10.2 OTA操作

这个示例应用程序演示了如何准备操作操作,何时启动操作更新和处理操作后操作。

  1. 获取平台工厂实例
auto &platformFactory = telux::platform::PlatformFactory::getInstance();
  1. 准备一个在文件系统子系统初始化完成时被调用的回调
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);
}
  1. 获取文件系统管理器
if (fsManager == nullptr) {
	std::cout << "filesystem manager is nullptr" << std::endl;
	exit(1);
}
std::cout << "Obtained filesystem manager" << std::endl;
  1. 等待初始化完成后再进行
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;
  1. 创建侦听器对象并注册为侦听器
std::shared_ptr<OtaOperationsListener> otaOperationsListener
= std::make_shared<OtaOperationsListener>();
fsManager->registerListener(otaOperationsListener);
  1. 接收服务状态通知
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;
}
  1. 下载软件包

  2. 准备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;
}
  1. 客户端可以启动OTA更新

  2. 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;
}
  1. 如果用户决定镜像文件系统,请启动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;
}
  1. 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(otaOperationsListener);
otaOperationsListener = nullptr;
fsManager = nullptr;

4.10.3 Ecall操作

这个示例应用程序演示了如何准备eCall操作并指示eCall完成。

  1. 获取平台工厂实例
auto &platformFactory = PlatformFactory::getInstance();
  1. 准备一个在文件系统子系统初始化完成时被调用的回调
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);
};
  1. 获取文件系统管理器
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;
  1. 等待初始化完成后再进行
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
  1. 创建侦听器对象并注册为侦听器
std::shared_ptr<EcallOperationListener> ecallOperationListener
= std::make_shared<EcallOperationListener>();
fsManager->registerListener(ecallOperationListener);
  1. 接收服务状态通知
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;
}
  1. 在启动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);
}
  1. 启动eCall

  2. 当文件系统操作即将在秒内恢复时接收通知
    注意:在此通知中,客户端仍然可以暂停文件系统操作,并通过调用预先设置为eCall的API来继续ecall(步骤[7])

virtual void OnFsOperationImminentEvent(uint32_t timeLeftToStart) override {
	PRINT_NOTIFICATION << "Filesystem operation resumes in seconds: ";
	std::cout << timeLeftToStart << std::endl;
}
  1. 当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);
}
  1. 当我们不需要听任何东西的时候就进行清理
fsManager->deregisterListener(ecallOperationListener);
ecallOperationListener = nullptr;
fsManager = nullptr;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值