5#include "power-output-stats.h"
8#include "ns3/rng-seed-manager.h"
21 m_tableName = tableName;
25 ret = m_db->SpinExec(
"CREATE TABLE IF NOT EXISTS " + tableName +
27 "Frame INTEGER NOT NULL, "
28 "SubFrame INTEGER NOT NULL,"
29 "Slot INTEGER NOT NULL,"
30 "Rnti INTEGER NOT NULL,"
31 "Imsi INTEGER NOT NULL,"
32 "BwpId INTEGER NOT NULL,"
33 "CellId INTEGER NOT NULL,"
34 "txPowerRb DOUBLE NOT NULL,"
35 "txPowerTotal DOUBLE NOT NULL,"
36 "rbNumActive INTEGER NOT NULL,"
37 "rbNumTotal INTEGER NOT NULL,"
38 "Seed INTEGER NOT NULL,"
39 "Run INTEGER NOT NULL);");
42 PowerOutputStats::DeleteWhere(m_db,
43 RngSeedManager::GetSeed(),
44 RngSeedManager::GetRun(),
50 Ptr<const SpectrumValue> txPsd,
51 [[maybe_unused]]
const Time& t,
58 c.frame = sfnSf.GetFrame();
59 c.subFrame = sfnSf.GetSubframe();
60 c.slot = sfnSf.GetSlot();
66 uint32_t rbNumTotal = txPsd->GetValuesN();
67 uint32_t rbNumActive = 0;
69 for (uint32_t rbIndex = 0; rbIndex < rbNumTotal; rbIndex++)
71 if ((*txPsd)[rbIndex] != 0)
82 c.txPowerTotal = (Integral(*txPsd));
83 c.txPowerRb = c.txPowerTotal / rbNumActive;
84 c.rbNumActive = rbNumActive;
85 c.rbNumTotal = rbNumTotal;
87 m_powerCache.emplace_back(c);
90 if (m_powerCache.size() *
sizeof(PowerResultCache) > 1000000)
103PowerOutputStats::DeleteWhere(SQLiteOutput* p,
106 const std::string& table)
110 ret = p->SpinPrepare(&stmt,
"DELETE FROM \"" + table +
"\" WHERE SEED = ? AND RUN = ?;");
111 NS_ABORT_IF(ret ==
false);
112 ret = p->Bind(stmt, 1, seed);
113 NS_ABORT_IF(ret ==
false);
114 ret = p->Bind(stmt, 2, run);
116 ret = p->SpinExec(stmt);
117 NS_ABORT_IF(ret ==
false);
121PowerOutputStats::WriteCache()
123 bool ret = m_db->SpinExec(
"BEGIN TRANSACTION;");
124 for (
const auto& v : m_powerCache)
127 ret = m_db->SpinPrepare(&stmt,
128 "INSERT INTO " + m_tableName +
129 " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);");
131 ret = m_db->Bind(stmt, 1, v.frame);
133 ret = m_db->Bind(stmt, 2, v.subFrame);
135 ret = m_db->Bind(stmt, 3, v.slot);
137 ret = m_db->Bind(stmt, 4, v.rnti);
139 ret = m_db->Bind(stmt, 5,
static_cast<uint32_t
>(v.imsi));
141 ret = m_db->Bind(stmt, 6, v.bwpId);
143 ret = m_db->Bind(stmt, 7, v.cellId);
145 ret = m_db->Bind(stmt, 8, v.txPowerRb);
147 ret = m_db->Bind(stmt, 9, v.txPowerTotal);
149 ret = m_db->Bind(stmt, 10, v.rbNumActive);
151 ret = m_db->Bind(stmt, 11, v.rbNumTotal);
153 ret = m_db->Bind(stmt, 12, RngSeedManager::GetSeed());
155 ret = m_db->Bind(stmt, 13,
static_cast<uint32_t
>(RngSeedManager::GetRun()));
158 ret = m_db->SpinExec(stmt);
161 m_powerCache.clear();
162 ret = m_db->SpinExec(
"END TRANSACTION;");
PowerOutputStats()
Constructor.
void SavePower(const SfnSf &sfnSf, Ptr< const SpectrumValue > txPsd, const Time &t, uint16_t rnti, uint64_t imsi, uint16_t bwpId, uint16_t cellId)
Store power values.
void EmptyCache()
Force the cache write to disk, emptying the cache itself.
void SetDb(SQLiteOutput *db, const std::string &tableName="power")
Install the output database.