Create a Custom In-Vehicle Charging Service

Last edit: 2024.05.24
Important note:

The TomTom Digital Cockpit SDK is not available for general use. Please contact us for more information.

The TomTom Digital Cockpit platform allows carmakers to implement custom services to extend the In-Vehicle Charging feature to support multiple different e-MSPs (e-Mobility Service Providers).

In this guide, you will learn how to create a custom In-Vehicle Charging service to support a new e-MSP.

How to create a custom In-Vehicle Charging service

The following sections describe how to create a custom In-Vehicle Charging service implementation.

Example code illustrating how to implement the concepts described in this document can be found in examples/evcharging/service.

Service module setup

To create an In-Vehicle Charging service, add a Gradle dependency on the EvChargingService and LifecycleService in your build.gradle.kts file:

1dependencies {
2 implementation(libraries.iviPlatformEvchargingApiCommonEvcharging)
3 implementation(libraries.iviPlatformEvchargingApiServiceEvcharging)
4}

The dependency on the EvChargingService is necessary as it is used as the base class for the custom service. The dependency on the common in-vehicle charging module is necessary as its classes are used between the service and the mediator.

Service configuration

To configure an In-Vehicle Charging service to use your custom implementation, define a service host configuration class that inherits from the IviServiceHostConfig class. This class should be placed in the application Gradle build file.

examples/evcharging/iviservicehosts.gradle.kts

1val exampleEvChargingServiceHost by extra {
2 IviServiceHostConfig(
3 serviceHostBuilderName = "ExampleEvChargingServiceHostBuilder",
4 implementationModule = ExampleModuleReference("examples_evcharging_service"),
5 interfaces = listOf(
6 IviServiceInterfaceConfig(
7 serviceName = "EvChargingService",
8 serviceId = "com.example.ivi.example.evcharging.service",
9 serviceApiModule = IviPlatformModuleReference("platform_evcharging_api_service_evcharging")
10 )
11 )
12 )
13}

In this configuration, the examples_evcharging_service module defines the implementation for the platform_evcharging_api_service_evcharging interface.

In order to create the service host configuration named ExampleEvChargingServiceHostBuilder, the IVI platform needs a service host builder class with the specific name ExampleEvChargingServiceHostBuilder.

src/main/kotlin/com/example/ivi/example/evcharging/service/ExampleEvChargingServiceHostBuilder.kt

1class ExampleEvChargingServiceHostBuilder : SimpleIviServiceHostBuilder() {
2
3 override fun createIviServices(iviServiceHostContext: IviServiceHostContext)
4 : Collection<AnyIviServiceBase> =
5 listOf(
6 ExampleEvChargingService(iviServiceHostContext) {
7 getDiscoverableServiceId(it)
8 }
9 )
10
11 companion object
12}

Note: Every service host configuration needs to be registered in your application. This is so that the platform knows which service should be started with which implementation when a client requires access to a service API.

To register this configuration, add the service host to your application Gradle file:

examples/evcharging/app/build.gradle.kts

1val exampleEvChargingServiceHost: IviServiceHostConfig by project.extra
2
3ivi {
4 application {
5 enabled = true
6
7 iviInstances {
8 create(IviInstanceIdentifier.default) {
9 applyGroups {
10 includeDefaultPlatformGroups()
11 includeDefaultAppsuiteGroups()
12 include(
13 IviAppsuite.evChargingGroup // Will add the EvCharging frontend.
14 )
15 }
16 }
17 }
18 services {
19 applyGroups {
20 includeDefaultPlatformGroups()
21 includeDefaultAppsuiteGroups()
22 include(
23 IviPlatform.evChargingGroup, // Will add the EvChargingMediatorService
24 IviPlatform.evChargingStationGroup, // Will add the EvChargingStationService
25 )
26 }
27 addHost(exampleEvChargingServiceHost)
28 }
29 }
30}

Service definition

To create an In-Vehicle Charging service implementation you need to create a class that inherits from the EvChargingServiceBase base class.

src/main/kotlin/com/example/ivi/example/evcharging/service/ExampleEvChargingService.kt

1internal class ExampleEvChargingService(
2 iviServiceHostContext: IviServiceHostContext,
3 serviceIdProvider: IviDiscoverableServiceIdProvider,
4) : EvChargingServiceBase(iviServiceHostContext, serviceIdProvider) {
5}

In this example, the In-Vehicle Charging service has no implementation. This example only shows how to create a custom service. The implementation of the service is up to the carmaker, since the implementation will depend on the e-MSP.

Service lifecycle

To manage the initialization and destruction of the service, override the onCreate and onDestroy methods.

When the service is created:

src/main/kotlin/com/example/ivi/example/evcharging/service/ExampleEvChargingService.kt

1 override fun onCreate() {
2 super.onCreate()
3
4 emspServiceInfo = EMSP_INFO
5 emspAuthenticationStatus = NotAuthenticated
6 serviceReady = true
7 }

then the EvChargingService properties all need to be initialized. The emspServiceInfo property is used to provide information about the e-MSP. The emspAuthenticationStatus property is used to provide information about the authentication status of the e-MSP. The serviceReady property is used to provide information about the service readiness.

When the service is destroyed:

src/main/kotlin/com/example/ivi/example/evcharging/service/ExampleEvChargingService.kt

1override fun onDestroy() {
2 // Put here cleaning code if necessary.
3 super.onDestroy()
4}