RDK Documentation (Open Sourced RDK Components)
mfrMgr.c
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2016 RDK Management
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 
20 
21 /**
22 * @defgroup iarmmgrs
23 * @{
24 * @defgroup mfr
25 * @{
26 **/
27 
28 
29 #include <stdio.h>
30 #include <memory.h>
31 #include <dlfcn.h>
32 #include <unistd.h>
33 
34 #include "mfrMgrInternal.h"
35 #include "mfrMgr.h"
36 #include "libIARMCore.h"
37 #include "safec_lib.h"
38 
39 static int is_connected = 0;
40 
41 static char writeImageCbModule[MAX_BUF] = "";
42 
43 static mfrUpgradeStatus_t lastStatus;
44 
45 static IARM_Result_t getSerializedData_(void *arg)
46 {
47 
48  IARM_Result_t retCode = IARM_RESULT_IPCCORE_FAIL;
50  mfrError_t err = mfrERR_NONE;
52  errno_t safec_rc = -1;
53 
54  err = mfrGetSerializedData((mfrSerializedType_t)(param->type), &(data));
55 
56  if(mfrERR_NONE == err)
57  {
58  safec_rc = memcpy_s(param->buffer, sizeof(param->buffer), data.buf, data.bufLen);
59 
60  if(safec_rc != EOK)
61  {
62  ERR_CHK(safec_rc);
63  if(data.freeBuf)
64  {
65  data.freeBuf(data.buf);
66  }
67  return IARM_RESULT_INVALID_PARAM;
68  }
69 
70  param->bufLen = data.bufLen;
71  if(data.freeBuf)
72  {
73  data.freeBuf(data.buf);
74  }
75  retCode=IARM_RESULT_SUCCESS;
76  }
77  return retCode;
78 }
79 
80 static IARM_Result_t deletePDRI_(void *arg)
81 {
82  typedef mfrError_t (*mfrDeletePDRI_t)(void);
83 
84 #ifndef RDK_MFRLIB_NAME
85  LOG("Please define RDK_MFRLIB_NAME\r\n");
86  return IARM_RESULT_INVALID_STATE;
87 #else
88  static mfrDeletePDRI_t func = 0;
89  if (func == 0) {
90  void *dllib = dlopen(RDK_MFRLIB_NAME, RTLD_LAZY);
91  if (dllib) {
92  func = (mfrDeletePDRI_t) dlsym(dllib, "mfrDeletePDRI");
93  if (func) {
94  LOG("mfrDeletePDRI(void) is defined and loaded\r\n");
95  }
96  else {
97  LOG("mfrDeletePDRI(void) is not defined\r\n");
98  dlclose(dllib);
99  return IARM_RESULT_INVALID_STATE;
100  }
101  dlclose(dllib);
102  }
103  else {
104  LOG("Opening RDK_MFRLIB_NAME [%s] failed\r\n", RDK_MFRLIB_NAME);
105  return IARM_RESULT_INVALID_STATE;
106  }
107  }
108 
109  IARM_Result_t retCode = IARM_RESULT_INVALID_STATE;
110  mfrError_t err = mfrERR_NONE;
111 
112  if (func) {
113 
114  err = func();
115 
116  if(mfrERR_NONE == err)
117  {
118  LOG("Calling mfrDeletePDRI returned err %d\r\n", err);
119  retCode = IARM_RESULT_SUCCESS;
120  }
121  }
122  return retCode;
123 #endif
124 
125 }
126 
127 static IARM_Result_t scrubAllBanks_(void *arg)
128 {
129  typedef mfrError_t (*mfrScrubAllBanks_t)(void);
130 
131 #ifndef RDK_MFRLIB_NAME
132  LOG("Please define RDK_MFRLIB_NAME\r\n");
133  return IARM_RESULT_INVALID_STATE;
134 #else
135  static mfrScrubAllBanks_t func = 0;
136  if (func == 0) {
137  void *dllib = dlopen(RDK_MFRLIB_NAME, RTLD_LAZY);
138  if (dllib) {
139  func = (mfrScrubAllBanks_t) dlsym(dllib, "mfrScrubAllBanks");
140  if (func) {
141  LOG("mfrScrubAllBanks(void) is defined and loaded\r\n");
142  }
143  else {
144  LOG("mfrScrubAllBanks(void) is not defined\r\n");
145  dlclose(dllib);
146  return IARM_RESULT_INVALID_STATE;
147  }
148  dlclose(dllib);
149  }
150  else {
151  LOG("Opening RDK_MFRLIB_NAME [%s] failed\r\n", RDK_MFRLIB_NAME);
152  return IARM_RESULT_INVALID_STATE;
153  }
154  }
155 
156  IARM_Result_t retCode = IARM_RESULT_INVALID_STATE;
157  mfrError_t err = mfrERR_NONE;
158 
159  if (func) {
160 
161  err = func();
162 
163  if(mfrERR_NONE == err)
164  {
165  LOG("Calling mfrScrubAllBanks returned err %d\r\n", err);
166  retCode = IARM_RESULT_SUCCESS;
167  }
168  }
169  return retCode;
170 #endif
171 
172 }
173 #ifdef ENABLE_MFR_WIFI
174 static IARM_Result_t mfrWifiEraseAllData_(void *arg)
175 {
176  typedef mfrError_t (*mfrWifiEraseAllData_t)(void);
177 
178 #ifndef RDK_MFRLIB_NAME
179  LOG("Please define RDK_MFRLIB_NAME\r\n");
180  return IARM_RESULT_INVALID_STATE;
181 #else
182  static mfrWifiEraseAllData_t func = 0;
183  if (func == 0) {
184  void *dllib = dlopen(RDK_MFRLIB_NAME, RTLD_LAZY);
185  if (dllib) {
186  func = (mfrWifiEraseAllData_t) dlsym(dllib, "WIFI_EraseAllData");
187  if (func) {
188  LOG("mfrWifiEraseAllData(void) is defined and loaded\r\n");
189  }
190  else {
191  LOG("mfrWifiEraseAllData(void) is not defined\r\n");
192  dlclose(dllib);
193  return IARM_RESULT_INVALID_STATE;
194  }
195  dlclose(dllib);
196  }
197  else {
198  LOG("Opening RDK_MFRLIB_NAME [%s] failed\r\n", RDK_MFRLIB_NAME);
199  return IARM_RESULT_INVALID_STATE;
200  }
201  }
202 
203  IARM_Result_t retCode = IARM_RESULT_INVALID_STATE;
204  WIFI_API_RESULT err = WIFI_API_RESULT_SUCCESS;
205 
206  if (func) {
207 
208  err = func();
209 
210  if(WIFI_API_RESULT_SUCCESS == err)
211  {
212  LOG("Calling mfrWifiEraseAllData returned err %d\r\n", err);
213  retCode = IARM_RESULT_SUCCESS;
214  }
215  }
216  return retCode;
217 #endif
218 
219 }
220 static IARM_Result_t mfrWifiCredentials_(void *arg)
221 {
222 
223  IARM_Result_t retCode = IARM_RESULT_IPCCORE_FAIL;
225  WIFI_API_RESULT err = WIFI_API_RESULT_SUCCESS;
226  WIFI_DATA data;
227  errno_t safec_rc = -1;
228 
229  if (param->requestType == WIFI_SET_CREDENTIALS)
230  {
231  safec_rc = strcpy_s(data.cSSID, sizeof(data.cSSID), param->wifiCredentials.cSSID);
232  if(safec_rc != EOK)
233  {
234  ERR_CHK(safec_rc);
235  return IARM_RESULT_INVALID_PARAM;
236  }
237 
238  safec_rc = strcpy_s(data.cPassword, sizeof(data.cPassword), param->wifiCredentials.cPassword);
239  if(safec_rc != EOK)
240  {
241  ERR_CHK(safec_rc);
242  return IARM_RESULT_INVALID_PARAM;
243  }
244 
245  data.iSecurityMode = param->wifiCredentials.iSecurityMode;
246 
247  LOG("WIFI_SetCredentials ssid = %s \r\n", param->wifiCredentials.cSSID);
248  err = WIFI_SetCredentials(&(data));
249  if(WIFI_API_RESULT_SUCCESS == err)
250  {
251  retCode=IARM_RESULT_SUCCESS;
252  }
253  else
254  LOG("Calling WIFI_SetCredentials returned err %d\r\n", err);
255  }
256  else
257  {
258  data.iSecurityMode = -1;
259  err = WIFI_GetCredentials(&(data));
260 
261  if(WIFI_API_RESULT_SUCCESS == err)
262  {
263  safec_rc = strcpy_s(param->wifiCredentials.cSSID, sizeof(param->wifiCredentials.cSSID), data.cSSID);
264  if(safec_rc != EOK)
265  {
266  ERR_CHK(safec_rc);
267  return IARM_RESULT_INVALID_PARAM;
268  }
269 
270  safec_rc = strcpy_s(param->wifiCredentials.cPassword, sizeof(param->wifiCredentials.cPassword), data.cPassword);
271  if(safec_rc != EOK)
272  {
273  ERR_CHK(safec_rc);
274  return IARM_RESULT_INVALID_PARAM;
275  }
276 
277  param->wifiCredentials.iSecurityMode = data.iSecurityMode;
278 
279  retCode=IARM_RESULT_SUCCESS;
280  LOG("WIFI_GetCredentials ssid = %s SecurityMode = %d \r\n", data.cSSID, data.iSecurityMode);
281  }
282  else
283  LOG("Calling WIFI_GetCredentials returned err %d\r\n", err);
284  }
285  param->returnVal=err;
286  return retCode;
287 }
288 #endif
289 
290 static void writeImageCb(mfrUpgradeStatus_t status, void *cbData)
291 {
293  errno_t safec_rc = -1;
294 
295  param.status = status;
296 
297  LOG("In writeImage callback: error = %d, percentage = %02.02\n",status.error,status.percentage/100,status.percentage%100);
298 
299  if(cbData)
300  {
301  safec_rc = memcpy_s(param.cbData, sizeof(param.cbData), cbData, sizeof(param.cbData));
302  if(safec_rc != EOK)
303  {
304  ERR_CHK(safec_rc);
305  return;
306  }
307 
308  }
309 
311 
312  lastStatus = status;
313 }
314 
315 static IARM_Result_t writeImage_(void *arg)
316 {
317 
318  typedef mfrError_t (*mfrWriteImage_)(const char *, const char *, mfrImageType_t , mfrUpgradeStatusNotify_t );
319 
320 #ifndef RDK_MFRLIB_NAME
321  LOG("Please define RDK_MFRLIB_NAME\r\n");
322  LOG("Exiting writeImage_\n");
323  return IARM_RESULT_INVALID_STATE;
324 #else
325  static mfrWriteImage_ func = 0;
326  LOG("In writeImage_\n");
327  if (func == 0) {
328  void *dllib = dlopen(RDK_MFRLIB_NAME, RTLD_LAZY);
329  if (dllib) {
330  func = (mfrWriteImage_) dlsym(dllib, "mfrWriteImage");
331  if (func) {
332  LOG("mfrWriteImage is defined and loaded\r\n");
333  }
334  else {
335  LOG("mfrWriteImage is not defined\r\n");
336  LOG("Exiting writeImage_\n");
337  dlclose(dllib);
338  return IARM_RESULT_INVALID_STATE;
339  }
340  dlclose(dllib);
341  }
342  else {
343  LOG("Opening RDK_MFRLIB_NAME [%s] failed\r\n", RDK_MFRLIB_NAME);
344  LOG("Exiting writeImage_\n");
345  return IARM_RESULT_INVALID_STATE;
346  }
347  }
348 
349  IARM_Result_t retCode = IARM_RESULT_INVALID_STATE;
350  mfrError_t err = mfrERR_NONE;
351  errno_t safec_rc = -1;
352  if (func) {
353 
355 
356  mfrUpgradeStatusNotify_t notifyStruct;
357 
358  notifyStruct.cbData = pParam->cbData;
359  notifyStruct.interval = pParam->interval;
360  notifyStruct.cb = writeImageCb;
361 
362  safec_rc = strcpy_s(writeImageCbModule, sizeof(writeImageCbModule),pParam->callerModuleName);
363  if(safec_rc != EOK)
364  {
365  ERR_CHK(safec_rc);
366  return IARM_RESULT_INVALID_PARAM;
367  }
368 
369  lastStatus.progress = mfrUPGRADE_PROGRESS_NOT_STARTED;
370 
371  err = func(pParam->name, pParam->path, pParam->type, notifyStruct);
372 
373  if(mfrERR_NONE == err)
374  {
375  LOG("Calling mfrWriteImage returned err %d\r\n", err);
376  retCode = IARM_RESULT_SUCCESS;
377 
378  /* Poll for upgrade start */
379  while( lastStatus.progress == mfrUPGRADE_PROGRESS_NOT_STARTED )
380  {
381  LOG("Waiting for upgrade to start\n");
382  sleep(1);
383  }
384 
385  /* Poll for completion */
386  while( lastStatus.progress == mfrUPGRADE_PROGRESS_STARTED )
387  {
388  LOG("Waiting for upgrade to complete\n");
389  sleep(1);
390  }
391 
392  LOG("Update process complete..\n");
393 
394  if(lastStatus.progress != mfrUPGRADE_PROGRESS_COMPLETED)
395  {
396  retCode = IARM_RESULT_IPCCORE_FAIL;
397  }
398 
399  }
400  }
401  LOG("Exiting writeImage_\n");
402  return retCode;
403 #endif
404 
405 }
406 
407 IARM_Result_t setBootloaderPattern_(void *arg)
408 {
409  typedef mfrError_t (*mfrSetBootloaderPattern)(mfrBlPattern_t);
410 #ifndef RDK_MFRLIB_NAME
411  LOG("Please define RDK_MFRLIB_NAME. Cannot resolve mfrSetBootloaderPattern without it.\n");
412  return IARM_RESULT_INVALID_STATE;
413 #else
414  static mfrSetBootloaderPattern func = 0;
415  static int symbol_lookup_complete = 0;
416 
417  if (func == 0) {
418  if(0 == symbol_lookup_complete) {
419  symbol_lookup_complete = 1;
420  void *dllib = dlopen(RDK_MFRLIB_NAME, RTLD_LAZY);
421  if (dllib) {
422  func = (mfrSetBootloaderPattern) dlsym(dllib, "mfrSetBootloaderPattern");
423  dlclose(dllib);
424  if (func) {
425  LOG("mfrSetBootloaderPattern is defined and loaded\n");
426  }
427  else {
428  LOG("mfrSetBootloaderPattern is not defined\n");
429  return IARM_RESULT_INVALID_STATE;
430  }
431  }
432  else {
433  LOG("Opening RDK_MFRLIB_NAME [%s] failed\n", RDK_MFRLIB_NAME);
434  LOG("Exiting setBootloaderPattern_\n");
435  return IARM_RESULT_INVALID_STATE;
436  }
437  }
438  else
439  {
440  LOG("mfrSetBootloaderPattern is not defined\n");
441  return IARM_RESULT_INVALID_STATE;
442  }
443  }
444 
445  IARM_Result_t retCode = IARM_RESULT_SUCCESS;
446  mfrError_t err = mfrERR_NONE;
448 
449  LOG("Calling mfrSetBootloaderPattern with setting 0x%x\n", pParam->pattern);
450  err = func(pParam->pattern);
451  if(mfrERR_NONE != err)
452  {
453  LOG("Calling mfrSetBootloaderPattern returned error 0x%x\n", err);
454  retCode = IARM_RESULT_INVALID_PARAM;
455  }
456  return retCode;
457 #endif
458 }
459 
460 
461 IARM_Result_t MFRLib_Start(void)
462 {
463  IARM_Result_t err = IARM_RESULT_SUCCESS;
464 
465  LOG("Entering [%s] - [%s] - disabling io redirect buf\r\n", __FUNCTION__, IARM_BUS_MFRLIB_NAME);
466  setvbuf(stdout, NULL, _IOLBF, 0);
467 
468  do{
469 
470  if(mfr_init()!= mfrERR_NONE)
471  {
472  LOG("Error initializing MFR library..\n");
473  err = IARM_RESULT_INVALID_STATE;
474  break;
475  }
476 
478 
479  if(IARM_RESULT_SUCCESS != err)
480  {
481  LOG("Error initializing IARM.. error code : %d\n",err);
482  break;
483  }
484 
485  err = IARM_Bus_Connect();
486 
487  if(IARM_RESULT_SUCCESS != err)
488  {
489  LOG("Error connecting to IARM.. error code : %d\n",err);
490  break;
491  }
492  is_connected = 1;
494  if(IARM_RESULT_SUCCESS != err)
495  {
496  LOG("Error registering call(getSerializedData) in IARM.. error code : %d\n",err);
497  break;
498  }
499 
501  if(IARM_RESULT_SUCCESS != err)
502  {
503  LOG("Error registering call(deletePDRI) in IARM.. error code : %d\n",err);
504  break;
505  }
506 
508 
509  if(IARM_RESULT_SUCCESS != err)
510  {
511  LOG("Error registering call(scrubAllBanks) in IARM.. error code : %d\n",err);
512  break;
513  }
515 
516  if(IARM_RESULT_SUCCESS != err)
517  {
518  LOG("Error registering call(writeImage) in IARM.. error code : %d\n",err);
519  break;
520  }
521 
523  if(IARM_RESULT_SUCCESS != err)
524  {
525  LOG("Error registering call(setBootloaderPattern_) in IARM.. error code : %d\n",err);
526  break;
527  }
528 #ifdef ENABLE_MFR_WIFI
529  err = IARM_Bus_RegisterCall(IARM_BUS_MFRLIB_API_WIFI_EraseAllData, mfrWifiEraseAllData_);
530 
531  if(IARM_RESULT_SUCCESS != err)
532  {
533  LOG("Error registering call(wifiEraseAllData) in IARM.. error code : %d\n",err);
534  break;
535  }
536  err = IARM_Bus_RegisterCall(IARM_BUS_MFRLIB_API_WIFI_Credentials, mfrWifiCredentials_);
537 
538  if(IARM_RESULT_SUCCESS != err)
539  {
540  LOG("Error registering call(mfrWifiGetCredentials) in IARM.. error code : %d\n",err);
541  break;
542  }
543 
544 #endif
545  }while(0);
546 
547  if(err != IARM_RESULT_SUCCESS)
548  {
549  if(is_connected)
550  {
552  }
553  IARM_Bus_Term();
554  }
555 
556  return err;
557 
558 }
559 
560 IARM_Result_t MFRLib_Stop(void)
561 {
562  if(is_connected)
563  {
565  IARM_Bus_Term();
566  }
567  return IARM_RESULT_SUCCESS;
568 }
569 
570 IARM_Result_t MFRLib_Loop()
571 {
572  time_t curr = 0;
573  while(1)
574  {
575  time(&curr);
576  LOG("I-ARM MFR Lib: HeartBeat at %s\r\n", ctime(&curr));
577  sleep(300);
578  }
579  return IARM_RESULT_SUCCESS;
580 }
581 
582 
583 
584 
585 
586 /** @} */
587 /** @} */
MFRLib_Start
IARM_Result_t MFRLib_Start(void)
Starts the MFR lib.
Definition: mfrMgr.c:40
_mfrUpgradeStatus_t
Definition: mfrTypes.h:218
IARM_BUS_MFRLIB_API_ScrubAllBanks
#define IARM_BUS_MFRLIB_API_ScrubAllBanks
Definition: mfrMgr.h:106
IARM_Bus_Term
IARM_Result_t IARM_Bus_Term(void)
This API is used to terminate the IARM-Bus library.
WIFI_GetCredentials
WIFI_API_RESULT WIFI_GetCredentials(WIFI_DATA *pData)
mfrMgrInternal.h
IARM-Bus MFR Manager Internal API.
IARM_BUS_MFRLIB_API_WriteImage
#define IARM_BUS_MFRLIB_API_WriteImage
Definition: mfrMgr.h:102
mfrGetSerializedData
mfrError_t mfrGetSerializedData(mfrSerializedType_t type, mfrSerializedData_t *data, mfrEncryptFunction_t crypto)
Retrieve Serialized Read-Only data from device. The serialized data is returned as a byte stream....
Definition: mfrCli.c:98
_IARM_Bus_MFRLib_GetSerializedData_Param_t::buffer
char buffer[(1280)]
Definition: mfrMgr.h:120
_IARM_Bus_MFRLib_CommonAPI_WriteImageCb_Param_t::cbData
char cbData[255]
Definition: mfrMgr.h:184
_IARM_Bus_MFRLib_SetBLPattern_Param_t
Definition: mfrMgr.h:149
MFRLib_Stop
IARM_Result_t MFRLib_Stop(void)
Terminates the MFR lib.
Definition: mfrMgr.c:61
IARM_Bus_Call
IARM_Result_t IARM_Bus_Call(const char *ownerName, const char *methodName, void *arg, size_t argLen)
This API is used to Invoke RPC method by its application name and method name.
Definition: iarm_bus.c:57
mfrSetBootloaderPattern
mfrError_t mfrSetBootloaderPattern(mfrBlPattern_t pattern)
Sets how the frontpanel LED(s) (and TV backlight on applicable devices) behave when running bootloade...
_IARM_Bus_MFRLib_GetSerializedData_Param_t::bufLen
int bufLen
Definition: mfrMgr.h:121
_mfrUpgradeStatusNotify_t
Definition: mfrTypes.h:225
_IARM_Bus_MFRLib_WriteImage_Param_t::cbData
char cbData[255]
Definition: mfrMgr.h:130
IARM_BUS_MFRLIB_COMMON_API_WriteImageCb
#define IARM_BUS_MFRLIB_COMMON_API_WriteImageCb
Definition: mfrMgr.h:115
IARM_Bus_RegisterCall
IARM_Result_t IARM_Bus_RegisterCall(const char *methodName, IARM_BusCall_t handler)
This API is used to register an RPC method that can be invoked by other applications.
IARM_Bus_Disconnect
IARM_Result_t IARM_Bus_Disconnect(void)
This API disconnect Application from IARM Bus so the application will not receive any IARM event or R...
_IARM_Bus_MFRLib_WriteImage_Param_t::callerModuleName
char callerModuleName[255]
Definition: mfrMgr.h:128
_IARM_Bus_MFRLib_CommonAPI_WriteImageCb_Param_t
Definition: mfrMgr.h:182
IARM_BUS_MFRLIB_API_SetBootLoaderPattern
#define IARM_BUS_MFRLIB_API_SetBootLoaderPattern
Definition: mfrMgr.h:109
WIFI_SetCredentials
WIFI_API_RESULT WIFI_SetCredentials(WIFI_DATA *pData)
_IARM_BUS_MFRLIB_API_WIFI_Credentials_Param_t
Definition: mfrMgr.h:144
_IARM_Bus_MFRLib_WriteImage_Param_t
Definition: mfrMgr.h:129
mfr_init
mfrError_t mfr_init(void)
Initialize the mfr library. This function should be call once before the functions in this API can ...
Definition: mfrCli.c:65
_IARM_Bus_MFRLib_WriteImage_Param_t::interval
int interval
Definition: mfrMgr.h:133
_IARM_Bus_MFRLib_WriteImage_Param_t::path
char path[255]
Definition: mfrMgr.h:131
IARM_BUS_MFRLIB_API_GetSerializedData
#define IARM_BUS_MFRLIB_API_GetSerializedData
Definition: mfrMgr.h:100
WIFI_DATA
Definition: mfr_wifi_types.h:63
IARM_BUS_MFRLIB_NAME
#define IARM_BUS_MFRLIB_NAME
Definition: mfrMgr.h:98
MFRLib_Loop
IARM_Result_t MFRLib_Loop()
Listens for component specific events from drivers.
Definition: mfrMgr.c:66
_IARM_Bus_MFRLib_GetSerializedData_Param_t
Definition: mfrMgr.h:118
_IARM_Bus_MFRLib_GetSerializedData_Param_t::type
mfrSerializedType_t type
Definition: mfrMgr.h:119
_mfrSerializedData_t
Definition: mfrTypes.h:50
IARM_Bus_Connect
IARM_Result_t IARM_Bus_Connect(void)
This API is used to connect application to the IARM bus daemon. After connected, the application can ...
Definition: iarmMgrMocks.cpp:33
IARM_BUS_MFRLIB_API_DeletePDRI
#define IARM_BUS_MFRLIB_API_DeletePDRI
Definition: mfrMgr.h:105
_IARM_Bus_MFRLib_WriteImage_Param_t::name
char name[255]
Definition: mfrMgr.h:130
IARM_Bus_Init
IARM_Result_t IARM_Bus_Init(const char *name)
This API is used to initialize the IARM-Bus library.
Definition: iarmMgrMocks.cpp:38
_IARM_Bus_MFRLib_WriteImage_Param_t::type
mfrImageType_t type
Definition: mfrMgr.h:132