Files
wlan-lanforge-scripts/lf_tx_power_tool.py
Chuck SmileyRekiere 2d52dde12f lf_tx_power_tool.py : intial commit converts between dbm and watts, accepts
a list of all spatial streams

Signed-off-by: Chuck SmileyRekiere <chuck.smileyrekiere@candelatech.com>
2022-07-12 15:46:30 +05:30

126 lines
3.1 KiB
Python

#!/usr/bin/python3
"""
NAME: lf_tx_power_dbm_tool.py
PURPOSE:
calcuate the combined spatial stream power.
EXAMPLE:
LICENSE:
Free to distribute and modify. LANforge systems must be licensed.
Copyright 2022 Candela Technologies Inc
INCLUDE_IN_README
NOTE: To convert the per spatial stream dBm to combined dBm
convert dBm to watts (power) for each spatial stream, add the power values then convert back to dBm
https://www.rapidtables.com/convert/power/dBm_to_Watt.html
https://www.rapidtables.com/convert/power/Watt_to_dBm.html
Thank-you to:
https://www.thepacketologist.com/2021/10/power-conversion-in-python/
"""
import argparse
import math
import importlib
# TODO set up with logger
lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
def convert_input():
value = input("Whate is the numberical value of teh unit of power?:").lower()
unit = ""
while unit == "":
unit = input("What unit would you like to convert this too? (dBm/mW): ").lower()
if unit == "dbm" or unit =="mw":
unit = unit
else:
unit = ""
return value, unit
def convert_dbm_to_mw(value):
# P(mW) = 1W * 10(P(dBm) / 10)
dbm = int(value)
mw = 1 * 10 ** (dbm/10)
print(f"{dbm} dBm = {round(mw, 10)} mW")
return mw
def convert_mw_to_dbm(value):
# P(dBm) = 10 * log10( P(mW) / 1mW)
mw = value
dbm = 10 * math.log10(mw/1)
print(f"{mw} mW = {round(dbm, 2)} dBm")
return dbm
def convert_per_ss_dbm_to_combined(ss_list):
total_mw = 0.0
for value in ss_list:
value = int(value)
print("dbm value {value}".format(value=value))
mw = convert_dbm_to_mw(value)
print("mw: {mw}".format(mw=mw))
total_mw += mw
print("total_mw: {total_mw}".format(total_mw=total_mw))
combined_dbm = convert_mw_to_dbm(total_mw)
print("combined_dbm = {combined_dbm}".format(combined_dbm=combined_dbm))
return combined_dbm
def main():
parser = argparse.ArgumentParser(
description="Convert power values from dBm to mW or mW to dBm"
)
parser.add_argument(
"--dbm",
"--dbm2mw",
dest="dbm2mw",
help="Converts value from dBm to mW",
metavar="10",
type=int,
)
parser.add_argument(
"--ss_dbm",
"--ss_list_dbm",
dest="ss_list_dbm",
help="pass in a spatial stream list --ss_dbm '-55 -53 -60 -22",
type=str,
)
parser.add_argument(
"--mw",
"--mw2dbm",
dest="mw2dbm",
help="Converts value from mW to dBm.",
metavar="50",
type=float,
)
args = parser.parse_args()
if args.dbm2mw is not None or args.mw2dbm is not None or args.ss_list_dbm:
if args.dbm2mw:
convert_dbm_to_mw(args.dbm2mw)
elif args.mw2dbm:
convert_mw_to_dbm(args.mw2dbm)
else:
convert_per_ss_dbm_to_combined(args.ss_list_dbm.split())
else:
value, unit = convert_input()
if unit == "mw":
convert_dbm_to_mw(value)
elif unit == "dbm":
convert_mw_to_dbm(value)
if __name__ == "__main__":
main()