14#define _BATTERY_MODEL_CODE_
18#pragma comment(lib,"NetworkStack.lib")
19#pragma comment(lib,"Metrics.lib")
21#include "BatteryModel.h"
24static void battery_add_to_animation(ptrBATTERY pb);
26static ptrBATTERY firstBattery = NULL;
27static ptrBATTERY lastBattery = NULL;
29static void battery_add(ptrBATTERY b)
33 lastBattery->next = b;
43static ptrBATTERYMODE battery_find_mode(ptrBATTERY b,
47 for (i = 0; i < b->modeCount; i++)
49 if (b->mode[i].mode == mode)
55_declspec(dllexport) ptrBATTERY battery_find(NETSIM_ID d,
59 ptrBATTERY t = firstBattery;
62 if (t->deviceId == d &&
66 if (t->deviceId == d &&
74_declspec(dllexport)
void battery_add_new_mode(ptrBATTERY battery,
79 if (battery->modeCount)
80 battery->mode = realloc(battery->mode, (battery->modeCount + 1) *
sizeof* battery->mode);
82 battery->mode = calloc(1,
sizeof* battery->mode);
83 battery->mode[battery->modeCount].current = current;
84 battery->mode[battery->modeCount].mode = mode;
85 battery->mode[battery->modeCount].heading = _strdup(heading);
86 battery->mode[battery->modeCount].consumedEnergy = 0;
90_declspec(dllexport) ptrBATTERY battery_init_new(NETSIM_ID deviceId,
91 NETSIM_ID interfaceId,
94 double dRechargingCurrent)
96 ptrBATTERY nb = battery_find(deviceId, interfaceId);
99 nb->SumConsumedEnergy = 0;
100 nb->SumTransmitEnergy = 0;
101 nb->SumIdleEnergy = 0;
102 nb->SumReceiveEnergy = 0;
103 nb->SumSleepEnergy = 0;
104 nb->SumHarvestedEnergy = 0;
111 nb = (ptrBATTERY)calloc(1,
sizeof* nb);
112 nb->deviceId = deviceId;
113 nb->interfaceId = interfaceId;
114 nb->initialEnergy = initialEnergy;
115 nb->remainingEnergy = initialEnergy;
116 nb->voltage = voltage;
117 nb->rechargingCurrent = dRechargingCurrent;
119 battery_add_new_mode(nb, 0, 0, NULL);
120 battery_add_to_animation(nb);
124_declspec(dllexport)
void battery_free(NETSIM_ID deviceId,
125 NETSIM_ID interfaceId,
128 ptrBATTERY nb = battery_find(deviceId, interfaceId);
131 battery_set_mode(nb, 0, time);
137_declspec(dllexport)
bool battery_set_mode(ptrBATTERY battery,
141 int current_mode = battery->currentMode;
142 double mode_change_time = battery->modeChangedTime;
144 ptrBATTERYMODE pm = battery_find_mode(battery, battery->currentMode);
145 double r = battery->voltage*battery->rechargingCurrent*(time - battery->modeChangedTime) / 1000000;
146 double c = battery->voltage*pm->current*(time - battery->modeChangedTime) / 1000000;
147 battery->rechargingEnergy += r;
148 battery->remainingEnergy += r;
149 battery->modeChangedTime = time;
150 if (c > battery->remainingEnergy)
152 pm->consumedEnergy += battery->remainingEnergy;
153 battery->consumedEnergy += battery->remainingEnergy;
154 c = battery->remainingEnergy;
155 battery->remainingEnergy = 0;
156 battery->currentMode = 0;
161 pm->consumedEnergy += c;
162 battery->consumedEnergy += c;
163 battery->remainingEnergy -= c;
164 if (battery->currentMode > 0 || battery->remainingEnergy > 0)
166 battery->currentMode = mode;
173 double per = battery->remainingEnergy * 100;
174 per /= battery->initialEnergy;
175 if (battery->animHandle)
176 animation_add_new_entry(battery->animHandle,
179 DEVICE_CONFIGID(battery->deviceId),
183 switch (current_mode)
185 case 1:battery->SumIdleEnergy += c;
187 case 2:battery->SumReceiveEnergy += c;
189 case 3:battery->SumTransmitEnergy += c;
191 case 4:battery->SumSleepEnergy += c;
196 battery->SumConsumedEnergy += c;
197 battery->SumHarvestedEnergy += r;
199 if(current_mode != battery->currentMode)
200 Battery_RadioMeasurements_Log(battery ,r, c, current_mode,battery->currentMode,mode_change_time,pm);
204static ANIM_HANDLE handle;
205static void battery_add_to_animation(ptrBATTERY pb)
207 static bool isCalled =
false;
210 handle = anim_add_new_menu(NULL,
216 ANIMFILETYPE_GENERIC);
219 sprintf(name,
"%s_BatteryPower", DEVICE_NAME(pb->deviceId));
221 anim_add_new_menu(handle,
227 ANIMFILETYPE_BATTERY);
230_declspec(dllexport)
void battery_animation()
232 ptrBATTERY b = firstBattery;
235 battery_add_to_animation(b);
247}BATTERYMETRICS, *ptrBATTERYMETRICS;
248static ptrBATTERYMETRICS batteryMetrics = NULL;
250static bool isIncludedInMetricsHeading(ptrBATTERYMODE m)
252 ptrBATTERYMETRICS bm = batteryMetrics;
255 if (!_stricmp(m->heading, bm->mode))
262static void addInMetricsHeading(ptrBATTERYMODE m)
264 ptrBATTERYMETRICS bm = batteryMetrics;
265 ptrBATTERYMETRICS pbm = NULL;
274 ptrBATTERYMETRICS b = calloc(1,
sizeof* b);
276 b->mode = m->heading;
283static void prepare_mode_list(
char* buf)
285 ptrBATTERY b = firstBattery;
289 for (i = 0; i < b->modeCount; i++)
291 if (!b->mode[i].heading)
293 if (!isIncludedInMetricsHeading(&b->mode[i]))
295 addInMetricsHeading(&b->mode[i]);
296 strcat(buf, b->mode[i].heading);
304static double get_value_from_battery(ptrBATTERY b,
char* mode)
307 for (i = 0; i < b->modeCount; i++)
309 if (!b->mode[i].heading)
311 if (!_stricmp(b->mode[i].heading, mode))
312 return b->mode[i].consumedEnergy;
317static void add_to_mode_list(ptrBATTERY b)
319 ptrBATTERYMETRICS bm = batteryMetrics;
323 bm->cols = realloc(bm->cols, (bm->count + 1) *
sizeof* bm->cols);
325 bm->cols = calloc(1,
sizeof* bm->cols);
327 bm->cols[bm->count] = get_value_from_battery(b, bm->mode);
333static void add_to_table(PMETRICSNODE table,
336 ptrBATTERYMETRICS bm = batteryMetrics;
339 add_table_row_formatted(
true,
347_declspec(dllexport)
void battery_metrics(PMETRICSWRITER metricsWriter)
350 static bool isCalled =
false;
358 PMETRICSNODE menu = init_metrics_node(MetricsNode_Menu,
"Battery model", NULL);
359 PMETRICSNODE table = init_metrics_node(MetricsNode_Table,
"Battery model", NULL);
360 add_node_to_menu(menu, table);
362 char modeList[BUFSIZ]=
"";
363 sprintf(modeList,
"Device Name#1,Initial energy(mJ)#1,Consumed energy(mJ)#1,Remaining Energy(mJ)#1,Harvested Energy(mJ)#1,");
364 prepare_mode_list(modeList);
365 add_table_heading_special(table, modeList);
377 add_table_row_formatted(
false, table,
378 "%s,%lf,%lf,%lf,%lf,",
379 DEVICE_NAME(b->deviceId),
383 b->rechargingEnergy);
384 add_to_table(table, index);
388 write_metrics_node(metricsWriter, WriterPosition_Current, NULL, menu);
389 delete_metrics_node(menu);
392_declspec(dllexport)
double battery_get_remaining_energy(ptrBATTERY battery)
394 return battery->remainingEnergy;
397_declspec(dllexport)
double battery_get_consumed_energy(ptrBATTERY battery,
int mode)
400 return battery->consumedEnergy;
402 for (i = 0; i < battery->modeCount; i++)
404 if (battery->mode[i].mode == mode)
405 return battery->mode[i].consumedEnergy;