VOL-3899:  The tx/rx power in PON_Optical metric report should be
converted from raw data to dBm before pushing to kafka

Change-Id: I750ca3059b69c149e9108ea610997d6f02b67961
diff --git a/internal/pkg/onuadaptercore/onu_metrics_manager.go b/internal/pkg/onuadaptercore/onu_metrics_manager.go
index 806f1e1..41efe82 100644
--- a/internal/pkg/onuadaptercore/onu_metrics_manager.go
+++ b/internal/pkg/onuadaptercore/onu_metrics_manager.go
@@ -28,6 +28,7 @@
 	"github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
 	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-protos/v4/go/voltha"
+	"math"
 	"sync"
 	"time"
 )
@@ -65,9 +66,9 @@
 
 // OpticalPowerGroupMetrics are supported optical pm names
 var OpticalPowerGroupMetrics = map[string]voltha.PmConfig_PmType{
-	"ani_g_instance_id": voltha.PmConfig_CONTEXT,
-	"transmit_power":    voltha.PmConfig_GAUGE,
-	"receive_power":     voltha.PmConfig_GAUGE,
+	"ani_g_instance_id":  voltha.PmConfig_CONTEXT,
+	"transmit_power_dBm": voltha.PmConfig_GAUGE,
+	"receive_power_dBm":  voltha.PmConfig_GAUGE,
 }
 
 // OpticalPowerGroupMetrics specific constants
@@ -674,13 +675,13 @@
 					if val, ok := meAttributes["ManagedEntityId"]; ok && val != nil {
 						opticalMetrics[k] = float32(val.(uint16))
 					}
-				case "transmit_power":
+				case "transmit_power_dBm":
 					if val, ok := meAttributes["TransmitOpticalLevel"]; ok && val != nil {
-						opticalMetrics[k] = float32(val.(uint16))
+						opticalMetrics[k] = float32(math.Round((float64(mm.twosComplementToSignedInt16(val.(uint16)))/500.0)*10) / 10) // convert to dBm rounded of to single decimal place
 					}
-				case "receive_power":
+				case "receive_power_dBm":
 					if val, ok := meAttributes["OpticalSignalLevel"]; ok && val != nil {
-						opticalMetrics[k] = float32(val.(uint16))
+						opticalMetrics[k] = float32(math.Round((float64(mm.twosComplementToSignedInt16(val.(uint16)))/500.0)*10) / 10) // convert to dBm rounded of to single decimal place
 					}
 				default:
 					// do nothing
@@ -2615,3 +2616,34 @@
 	}
 	return slice
 }
+
+func (mm *onuMetricsManager) twosComplementToSignedInt16(val uint16) int16 {
+	var uint16MsbMask uint16 = 0x8000
+	if val&uint16MsbMask == uint16MsbMask {
+		return int16(^val+1) * -1
+	}
+
+	return int16(val)
+}
+
+/* // These are need in the future
+
+func (mm *onuMetricsManager) twosComplementToSignedInt32(val uint32) int32 {
+	var uint32MsbMask uint32 = 0x80000000
+	if val & uint32MsbMask == uint32MsbMask {
+		return int32(^val + 1) * -1
+	}
+
+	return int32(val)
+}
+
+func (mm *onuMetricsManager) twosComplementToSignedInt64(val uint64) int64 {
+	var uint64MsbMask uint64 = 0x8000000000000000
+	if val & uint64MsbMask == uint64MsbMask {
+		return int64(^val + 1) * -1
+	}
+
+	return int64(val)
+}
+
+*/