Hello,
Trying to go through the demo for “Develop your application to communicate with AirVantage”. source.sierrawireless.com/airvan … sset-data/ , but encounter a problem.
The example uses Command-Line but I am using Developer Studio IDE.
I am trying to find similar document but unable. So, I am creating the project from the beginning.
I am not sure if the process is correct but please go through the whole process until the point I had encountered problem or maybe you can correct my mistake or suggest a better way of doing this.
I am using mangOH with Legato version 16.01.0.Beta_aa0…_modified with firmware SWI9X15Y_07.08.02.00 r31088 CARMD-EV-FRMWR1; Developer Studio 4.0, build version 4.0.0.201602241605 with Ubuntu 4.2.0-16-generic.
- File > New > Legato Application Project > Project name: assetDataTutorial > Legato swi-mdm9x15 Wp8548 359377060011672(WP85XX) > Next > Target platform selectio Mode : [Built-in] Legato for WP85XX(16.1.0.wp85-native-x86_64-…) > Finish.
- assetDataTutorial.adef
sandboxed: false
executables:
{
assetDataTutorial = ( assetDataTutorialComponent )
}
processes:
{
envVars:
{
LE_LOG_LEVEL = DEBUG
}
run:
{
(assetDataTutorial)
}
}
bindings:
{
assetDataTutorial.assetDataTutorialComponent.le_avdata -> avcService.le_avdata
assetDataTutorial.assetDataTutorialComponent.le_avc -> avcService.le_avc
}
start: manual
- assetDataTutorial.c
#include "legato.h"
#include "interfaces.h"
le_avdata_AssetInstanceRef_t _assetInstRef[2]; //reference to the 2 asset instances
char* _roomName[2]; //array of 2 Variable Name
int _currentTemperature[2]; //array of 2 Variable Temperature
bool _isAcOn[2]; //array of 2 Variable IsAC_on
int _targetTemperature[2]; //array of 2 Setting TargetTemperature
bool _isAvcSessionOpened = false;
le_timer_Ref_t _avcTimerRef;
le_clk_Time_t _interval = { 15, 0 }; //AVC start/stop Timer delay is 15 seconds
le_avc_StatusEventHandlerRef_t _avcEventHandlerRef = NULL;//reference to AirVantage Controller (AVC) Session handler
int _endProgramCountDown = 40; ///AVC session, Countdown to quit application
void OnReadVariable(le_avdata_AssetInstanceRef_t instRef, const char *fieldName, void *contextPtr)
{
int i;
for (i=0; i<2; i++)
{
if (instRef == _assetInstRef[i])
{
if (strcmp(fieldName, "Name") == 0)
{
LE_INFO("Legato AssetData: Read Variable request: Instance(%d).%s is %s", i, fieldName, _roomName[i]);
le_avdata_SetString(instRef, fieldName, _roomName[i]);
}
else if (strcmp(fieldName, "Temperature") == 0)
{
LE_INFO("Legato AssetData: Read Variable request: Instance(%d).%s is %d C", i, fieldName, _currentTemperature[i]);
le_avdata_SetInt(instRef, fieldName, _currentTemperature[i]);
}
else if (strcmp(fieldName, "IsAC_on") == 0)
{
LE_INFO("Legato AssetData: Read Variable request: Instance(%d).%s is %d", i, fieldName, _isAcOn[i]);
le_avdata_SetBool(instRef, fieldName, _isAcOn[i]);
}
break;
}
}
}
void OnWriteSetting(le_avdata_AssetInstanceRef_t instRef, const char *fieldName, void *contextPtr)
{
int i;
for (i=0; i<2; i++)
{
if (instRef == _assetInstRef[i])
{
if (strcmp(fieldName, "TargetTemperature") == 0)
{
LE_INFO("Legato AssetData: Setting Change request: Instance(%d).%s is %d C°", i, fieldName, _targetTemperature[i]);
int nTemp;
le_avdata_GetInt(instRef, fieldName, &nTemp); //Get the new setting from AirVantage
if (nTemp != _targetTemperature[i])
{
_isAcOn[i] = true; //let's set the AC status to ON
le_avdata_SetBool(instRef, "IsAC_on", _isAcOn[i]); //reflect the new value to instance
_targetTemperature[i] = nTemp;
LE_INFO("Legato AssetData: Setting Change request: Instance(%d).%s has been set to %d C°", i, fieldName, _targetTemperature[i]);
le_avdata_SetInt(instRef, fieldName, _targetTemperature[i]); //reflect the new value to instance
}
}
break;
}
}
}
void OnCommand(le_avdata_AssetInstanceRef_t instRef, const char *fieldName, void *contextPtr)
{
int i;
for (i=0; i<2; i++)
{
if (instRef == _assetInstRef[i])
{
if (strcmp(fieldName, "TurnOffAC") == 0)
{
LE_INFO("Legato AssetData: Execute Command Request: Triggered Instance(%d).TurnOffAC", i);
_isAcOn[i] = false; //Execute the commande, just turn AC status to OFF
le_avdata_SetBool(instRef, "IsAC_on", _isAcOn[i]); //reflect the new value to instance
}
break;
}
}
}
static void AVsessionHandler
(
le_avc_Status_t updateStatus,
int32_t totalNumBytes,
int32_t progress,
void* contextPtr
)
{
LE_INFO("AVsessionHandler-callback: status %i", updateStatus);
}
static void timerExpiredHandler(le_timer_Ref_t timerRef)
{
//LE_INFO("timer has expired !, let's close AVC session");
if (_isAvcSessionOpened)
{
LE_INFO("Legato AssetData: Close AVC session");
le_avc_StopSession();
_isAvcSessionOpened = false;
LE_INFO("Legato AssetData: Exit App count down = %d", _endProgramCountDown);
if (--_endProgramCountDown <= 0)
{
le_timer_Stop(timerRef);
if (NULL != _avcEventHandlerRef)
{
//unregister the handler
le_avc_RemoveStatusEventHandler(_avcEventHandlerRef);
}
LE_INFO("Legato AssetData: Legato AssetDataApp Ended");
//Quit the app
exit(EXIT_SUCCESS);
}
}
else
{
LE_INFO("Legato AssetData: Open AVC session");
le_result_t result = le_avc_StartSession(); //Start AVC session. Note: AVC handler must be registered prior starting a session
if (LE_FAULT == result)
{
le_avc_StopSession();
result = le_avc_StartSession();
}
if (LE_OK == result)
{
_isAvcSessionOpened = true;
}
}
}
COMPONENT_INIT
{
int i = 0;
LE_INFO("Legato AssetData: Start Legato AssetDataApp");
//Create 2 asset instances
LE_INFO("Legato AssetData: Create 2 instances AssetData ");
_assetInstRef[i] = le_avdata_Create("Room"); //create instance #1 for asset "Room"
//Assign default value to asset data fields
_roomName[i] = (char *) malloc(16);
strcpy(_roomName[i], "bedroom");
_currentTemperature[i] = 23;
_isAcOn[i] = false;
_targetTemperature[i] = 19;
i++;
_assetInstRef[i] = le_avdata_Create("Room"); //create instance #2 for asset "Room"
_roomName[i] = (char *) malloc(16);
strcpy(_roomName[i], "living-room");
_currentTemperature[i] = 19;
_isAcOn[i] = true;
_targetTemperature[i] = 19;
//Register handler for Variables, Settings and Commands
for (i=0; i< 2; i++)
{
#if 0 //temporarily disable, not supported for now
// call OnReadVariable() handler whenever the variable "Name" is accessed
le_avdata_AddFieldEventHandler(_assetInstRef[i], "Name", OnReadVariable, NULL);
// call OnReadVariable() handler whenever the variable "Temperature" is accessed
le_avdata_AddFieldEventHandler(_assetInstRef[i], "Temperature", OnReadVariable, NULL);
// call OnReadVariable() handler whenever the variable "IsAC_on" is accessed
le_avdata_AddFieldEventHandler(_assetInstRef[i], "IsAC_on", OnReadVariable, NULL);
#else
//set the variable values
le_avdata_SetString(_assetInstRef[i], "Name", _roomName[i]);
le_avdata_SetInt(_assetInstRef[i], "Temperature", _currentTemperature[i]);
le_avdata_SetBool(_assetInstRef[i], "IsAC_on", _isAcOn[i]);
le_avdata_SetInt(_assetInstRef[i], "TargetTemperature", _targetTemperature[i]);
#endif
// call OnWriteSetting() handler whenever the setting "TargetTemperature" is accessed
le_avdata_AddFieldEventHandler(_assetInstRef[i], "TargetTemperature", OnWriteSetting, NULL);
// call OnCommand() handler whenever the setting "TurnOffAC" is accessed
le_avdata_AddFieldEventHandler(_assetInstRef[i], "TurnOffAC", OnCommand, NULL);
}
//Start AVC Session
_avcEventHandlerRef = le_avc_AddStatusEventHandler(AVsessionHandler, NULL); //register a AVC handler
le_result_t result = le_avc_StartSession(); //Start AVC session. Note: AVC handler must be registered prior starting a session
if (LE_FAULT == result)
{
le_avc_StopSession();
le_avc_StartSession();
}
_isAvcSessionOpened = true;
LE_INFO("Legato AssetData: Started LWM2M session with AirVantage");
_avcTimerRef = le_timer_Create("assetDataAppSessionTimer"); //create timer
le_timer_SetInterval(_avcTimerRef, _interval);
le_timer_SetRepeat(_avcTimerRef, 0); //set repeat to always
//set callback function to handle timer expiration event
le_timer_SetHandler(_avcTimerRef, timerExpiredHandler);
//start timer
le_timer_Start(_avcTimerRef);
}
- Component.cdef
requires:
{
api:
{
le_avdata.api
le_avc.api
}
}
sources:
{
assetDataTutorial.c
}
assets:
{
Room =
{
variables:
{
string Name
int Temperature
bool IsAC_on
}
settings:
{
int TargetTemperature
}
commands:
{
TurnOffAC
}
}
}
- Hit the hammer! > done
- Run AS Legato Application. Notice that on Legato Console, “…Exit App count down 40”, …39 …38.
- Stop app
- I am not sure if this is the correct way to export the file to AirVantage.
At Project Explorer Workspace, right click on “assetDataTutorial” root directory, select “Export” > “Develper Studio” > “Create Legato Application for Airvantage” > Next > select file under assetDataTutorial > Next > finish - Login to AirVantage, click on developer > My Apps > Release (the arrow up sign) > select “assetDataTutorial-xxxxxxx.zip” > Advanced setting > Publish.
- Goto Inventory > Systems > click edit (the pen sign) on one of the systems registered (I have only one) > click on “select application” and select “assetDataTutorial(…)” > save.
- Goto Configure > Reports > Create a report based on application (the plus sign on the right) > “Select a application” > “assetDataTutorial(…)” > continue.
- the next screen supposed to show me “Room asset” but it is showing me “assetDataTutorial/All assets UnselectAll Data”. Different from the actual screen show.
Need help to continue from here.
Thanks,
CSLEE