NetSim Source Code Help
Loading...
Searching...
No Matches
BatteryModel.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#define _BATTERY_MODEL_CODE_
15#include "main.h"
16#include "Animation.h"
17
18#pragma comment(lib,"NetworkStack.lib")
19#pragma comment(lib,"Metrics.lib")
20
21typedef struct stru_mode
22{
23 int mode;
24 double current;
26 char* heading;
28
29typedef struct stru_battery
30{
36 double voltage;
40
43
47
48#include "BatteryModel.h"
49
50//Function prototype
52
54static ptrBATTERY lastBattery = NULL;
55
56static void battery_add(ptrBATTERY b)
57{
58 if (firstBattery)
59 {
60 lastBattery->next = b;
61 lastBattery = b;
62 }
63 else
64 {
65 firstBattery = b;
66 lastBattery = b;
67 }
68}
69
71 int mode)
72{
73 int i;
74 for (i = 0; i < b->modeCount; i++)
75 {
76 if (b->mode[i].mode == mode)
77 return &b->mode[i];
78 }
79 return NULL;
80}
81
83 NETSIM_ID in)
84{
85 ptrBATTERY db = NULL;
87 while (t)
88 {
89 if (t->deviceId == d &&
90 t->interfaceId == in)
91 return t;
92
93 if (t->deviceId == d &&
94 t->interfaceId == 0)
95 db = t;
96 t = t->next;
97 }
98 return db;
99}
100
102 int mode,
103 double current,
104 char* heading)
105{
106 if (battery->modeCount)
107 battery->mode = realloc(battery->mode, (battery->modeCount + 1) * sizeof* battery->mode);
108 else
109 battery->mode = calloc(1, sizeof* battery->mode);
110 battery->mode[battery->modeCount].current = current;
111 battery->mode[battery->modeCount].mode = mode;
112 battery->mode[battery->modeCount].heading = _strdup(heading);
113 battery->mode[battery->modeCount].consumedEnergy = 0;
114 battery->modeCount++;
115}
116
119 double initialEnergy,
120 double voltage,
121 double dRechargingCurrent)
122{
124 if (nb)
125 {
126 if (!interfaceId)
127 return nb;
128
129 if (nb->interfaceId)
130 return nb;
131 }
132 nb = (ptrBATTERY)calloc(1, sizeof* nb);
133 nb->deviceId = deviceId;
137 nb->voltage = voltage;
138 nb->rechargingCurrent = dRechargingCurrent;
139 battery_add(nb);
140 battery_add_new_mode(nb, 0, 0, NULL);
142 return nb;
143}
144
147 double time)
148{
150 if (nb)
151 {
152 battery_set_mode(nb, 0, time);
153 free(nb->mode);
154 free(nb);
155 }
156}
157
158_declspec(dllexport) bool battery_set_mode(ptrBATTERY battery,
159 int mode,
160 double time)
161{
162 bool ret;
163 ptrBATTERYMODE pm = battery_find_mode(battery, battery->currentMode);
164 double r = battery->voltage*battery->rechargingCurrent*(time - battery->modeChangedTime) / 1000000;
165 double c = battery->voltage*pm->current*(time - battery->modeChangedTime) / 1000000;
166 battery->remainingEnergy += r;
167 battery->modeChangedTime = time;
168 if (c > battery->remainingEnergy)
169 {
170 pm->consumedEnergy += battery->remainingEnergy;
171 battery->consumedEnergy += battery->remainingEnergy;
172 battery->remainingEnergy = 0;
173 battery->currentMode = 0;
174 ret = false;
175 }
176 else
177 {
178 pm->consumedEnergy += c;
179 battery->consumedEnergy += c;
180 battery->remainingEnergy -= c;
181 battery->currentMode = mode;
182 ret = true;
183 }
184
185 double per = battery->remainingEnergy * 100;
186 per /= battery->initialEnergy;
187 if (battery->animHandle)
190 "%d,%lf,%lf,",
191 DEVICE_CONFIGID(battery->deviceId),
192 per,
193 time);
194 return ret;
195}
196
199{
200 static bool isCalled = false;
201 if (!handle)
202 {
204 "Battery Power",
205 false,
206 false,
207 false,
208 BUFSIZ,
210 }
211 char name[BUFSIZ];
212 sprintf(name, "%s_BatteryPower", DEVICE_NAME(pb->deviceId));
213 pb->animHandle =
215 name,
216 true,
217 false,
218 true,
219 BUFSIZ,
221}
222
224{
226 while (b)
227 {
229 b = b->next;
230 }
231}
232
234{
235 char* mode;
236 int index;
237 int count;
238 double* cols;
242
244{
246 while (bm)
247 {
248 if (!_stricmp(m->heading, bm->mode))
249 return true;
250 bm = bm->next;
251 }
252 return false;
253}
254
256{
258 ptrBATTERYMETRICS pbm = NULL;
259 int index = 0;
260 while (bm)
261 {
262 index = bm->index;
263 pbm = bm;
264 bm = bm->next;
265 }
266 index++;
267 ptrBATTERYMETRICS b = calloc(1, sizeof* b);
268 b->index = index;
269 b->mode = m->heading;
270 if (pbm)
271 pbm->next = b;
272 else
273 batteryMetrics = b;
274}
275
276static void prepare_mode_list(char* buf)
277{
279 while (b)
280 {
281 int i;
282 for (i = 0; i < b->modeCount; i++)
283 {
284 if (!b->mode[i].heading)
285 continue;
286 if (!isIncludedInMetricsHeading(&b->mode[i]))
287 {
289 strcat(buf, b->mode[i].heading);
290 strcat(buf, "#0,");
291 }
292 }
293 b = b->next;
294 }
295}
296
298{
299 int i;
300 for (i = 0; i < b->modeCount; i++)
301 {
302 if (!b->mode[i].heading)
303 continue;
304 if (!_stricmp(b->mode[i].heading, mode))
305 return b->mode[i].consumedEnergy;
306 }
307 return -1;
308}
309
311{
313 while (bm)
314 {
315 if (bm->count)
316 bm->cols = realloc(bm->cols, (bm->count + 1) * sizeof* bm->cols);
317 else
318 bm->cols = calloc(1, sizeof* bm->cols);
319
320 bm->cols[bm->count] = get_value_from_battery(b, bm->mode);
321 bm->count++;
322 bm = bm->next;
323 }
324}
325
326static void add_to_table(PMETRICSNODE table,
327 int index)
328{
330 while (bm)
331 {
333 table,
334 "%lf,",
335 bm->cols[index]);
336 bm = bm->next;
337 }
338}
339
340_declspec(dllexport) void battery_metrics(PMETRICSWRITER metricsWriter)
341{
342 ptrBATTERY b;
343 static bool isCalled = false;
344 if (isCalled)
345 return;
346 isCalled = true;
347
348 if (!firstBattery)
349 return; // No battery is added
350
351 PMETRICSNODE menu = init_metrics_node(MetricsNode_Menu, "Battery model", NULL);
352 PMETRICSNODE table = init_metrics_node(MetricsNode_Table, "Battery model", NULL);
353 add_node_to_menu(menu, table);
354
355 char modeList[BUFSIZ]="";
356 sprintf(modeList, "Device Name#1,Initial energy(mJ)#1,Consumed energy(mJ)#1,Remaining Energy(mJ)#1,");
357 prepare_mode_list(modeList);
358 add_table_heading_special(table, modeList);
359 b = firstBattery;
360 while (b)
361 {
363 b = b->next;
364 }
365
366 int index = 0;
367 b = firstBattery;
368 while (b)
369 {
370 add_table_row_formatted(false, table,
371 "%s,%lf,%lf,%lf,",
373 b->initialEnergy,
375 b->remainingEnergy);
376 add_to_table(table, index);
377 b = b->next;
378 index++;
379 }
380 write_metrics_node(metricsWriter, WriterPosition_Current, NULL, menu);
382}
383
385{
386 return battery->remainingEnergy;
387}
388
390{
391 if (!mode)
392 return battery->consumedEnergy;
393 int i;
394 for (i = 0; i < battery->modeCount; i++)
395 {
396 if (battery->mode[i].mode == mode)
397 return battery->mode[i].consumedEnergy;
398 }
399 return 0;
400}
401
void animation_add_new_entry(ANIM_HANDLE animHandle, ANIM_TYPE type, void *format,...)
@ ANIM_BATTERY
Definition: Animation.h:87
@ ANIMFILETYPE_BATTERY
Definition: Animation.h:68
@ ANIMFILETYPE_GENERIC
Definition: Animation.h:63
void * ANIM_HANDLE
Definition: Animation.h:52
unsigned int NETSIM_ID
Definition: Animation.h:45
ANIM_HANDLE anim_add_new_menu(ANIM_HANDLE handle, char *name, bool isThreadReq, bool isNewScreen, bool isFile, UINT maxDataLen, ANIMFILETYPE fileType)
static ptrBATTERYMODE battery_find_mode(ptrBATTERY b, int mode)
Definition: BatteryModel.c:70
static ptrBATTERY lastBattery
Definition: BatteryModel.c:54
static ptrBATTERY firstBattery
Definition: BatteryModel.c:53
void battery_metrics(PMETRICSWRITER metricsWriter)
Definition: BatteryModel.c:340
static void add_to_table(PMETRICSNODE table, int index)
Definition: BatteryModel.c:326
struct stru_battery BATTERY
struct stru_mode * ptrBATTERYMODE
double battery_get_remaining_energy(ptrBATTERY battery)
Definition: BatteryModel.c:384
void battery_free(NETSIM_ID deviceId, NETSIM_ID interfaceId, double time)
Definition: BatteryModel.c:145
static void add_to_mode_list(ptrBATTERY b)
Definition: BatteryModel.c:310
ptrBATTERY battery_init_new(NETSIM_ID deviceId, NETSIM_ID interfaceId, double initialEnergy, double voltage, double dRechargingCurrent)
Definition: BatteryModel.c:117
struct stru_mode BATTERYMODE
void battery_add_new_mode(ptrBATTERY battery, int mode, double current, char *heading)
Definition: BatteryModel.c:101
static double get_value_from_battery(ptrBATTERY b, char *mode)
Definition: BatteryModel.c:297
static void addInMetricsHeading(ptrBATTERYMODE m)
Definition: BatteryModel.c:255
struct stru_batteryMetrics BATTERYMETRICS
bool battery_set_mode(ptrBATTERY battery, int mode, double time)
Definition: BatteryModel.c:158
struct stru_batteryMetrics * ptrBATTERYMETRICS
struct stru_battery * ptrBATTERY
static void battery_add_to_animation(ptrBATTERY pb)
Definition: BatteryModel.c:198
void battery_animation()
Definition: BatteryModel.c:223
static ptrBATTERYMETRICS batteryMetrics
Definition: BatteryModel.c:241
static bool isIncludedInMetricsHeading(ptrBATTERYMODE m)
Definition: BatteryModel.c:243
static void battery_add(ptrBATTERY b)
Definition: BatteryModel.c:56
double battery_get_consumed_energy(ptrBATTERY battery, int mode)
Definition: BatteryModel.c:389
ptrBATTERY battery_find(NETSIM_ID d, NETSIM_ID in)
Definition: BatteryModel.c:82
static ANIM_HANDLE handle
Definition: BatteryModel.c:197
static void prepare_mode_list(char *buf)
Definition: BatteryModel.c:276
#define c
#define _stricmp
Definition: Linux.h:127
#define _strdup(x)
Definition: Linux.h:126
#define _declspec(dllexport)
This function is used to trigger the update.
Definition: Linux.h:41
#define realloc(p, s)
Definition: Memory.h:32
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
@ WriterPosition_Current
Definition: MetricsWriter.h:15
void write_metrics_node(PMETRICSWRITER writer, WRITER_POSITION writerPosition, char *writer_name, PMETRICSNODE node)
void add_table_heading_special(PMETRICSNODE node, char *heading)
PMETRICSNODE init_metrics_node(METRICS_NODE type, char *name, char *secondarg)
void * PMETRICSNODE
Definition: MetricsWriter.h:21
void * PMETRICSWRITER
Definition: MetricsWriter.h:27
void delete_metrics_node(PMETRICSNODE node)
void add_node_to_menu(PMETRICSNODE menu, PMETRICSNODE node)
void add_table_row_formatted(bool issame, PMETRICSNODE node, char *format,...)
@ MetricsNode_Menu
Definition: MetricsWriter.h:5
@ MetricsNode_Table
Definition: MetricsWriter.h:6
#define DEVICE_NAME(DeviceId)
Definition: Stack.h:774
#define DEVICE_CONFIGID(DeviceId)
Definition: Stack.h:779
PMETRICSNODE menu
Definition: SwitchTable.c:48
double remainingEnergy
Definition: BatteryModel.c:35
NETSIM_ID interfaceId
Definition: BatteryModel.c:32
double initialEnergy
Definition: BatteryModel.c:33
double voltage
Definition: BatteryModel.c:36
ptrBATTERYMODE mode
Definition: BatteryModel.c:39
struct stru_battery * next
Definition: BatteryModel.c:45
void * animHandle
Definition: BatteryModel.c:44
NETSIM_ID deviceId
Definition: BatteryModel.c:31
double consumedEnergy
Definition: BatteryModel.c:34
double modeChangedTime
Definition: BatteryModel.c:42
double rechargingCurrent
Definition: BatteryModel.c:37
struct stru_batteryMetrics * next
Definition: BatteryModel.c:239
double current
Definition: BatteryModel.c:24
char * heading
Definition: BatteryModel.c:26
double consumedEnergy
Definition: BatteryModel.c:25