/***************************************************************************

  BionxControl
  Copyright © 2025 christoph holzheuer
  christoph.holzheuer@gmail.com

  Using:

  mhs_can_drv.c
  © 2011 - 2023 by MHS-Elektronik GmbH & Co. KG, Germany
  Klaus Demlehner, klaus@mhs-elektronik.de
  @see www.mhs-elektronik.de

  Based on Bionx data type descriptions from:

  BigXionFlasher USB V 0.2.4 rev. 97
  © 2011-2013 by Thomas Koenig <info@bigxionflasher.org>
  @see www.bigxionflasher.org

  Bionx Bike Info
  © 2018 Thorsten Schmidt (tschmidt@ts-soft.de)
  @see www.ts-soft.de

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3 of the License, or
  (at your option) any later version.
  @see https://github.com/bikemike/bionx-bikeinfo

 ***************************************************************************/


#include <bcvaluetype.h>
#include <bcvalue.h>


BCValueType::BCValueType()
{

}

BCValueType::BCValueType( QString unitLabel_, double factor_, optDouble min_, optDouble max_ )
  : unitLabel{unitLabel_}, factor{factor_}, min{min_}, max{max_}
{

}

QString BCValueType::formatValue( uint32_t value ) const
{
  if( factor == 1 )
    return QString::number( value );

  double result = value * factor;
  return QString::number(result, 'f', 2);
}
/// ----

BCValueTypeByte::BCValueTypeByte( QString unitLabel_, double factor_, optDouble min_, optDouble max_ )
  : BCValueType{ unitLabel_, factor_, min_, max_}
{

}

QString BCValueTypeByte::createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const
{
  uint32_t result = transmitter.readRawByte( deviceID, registerID );
  return formatValue( result );
}

/// ----

BCValueTypeWord::BCValueTypeWord( QString unitLabel_, double factor_, optDouble min_, optDouble max_ )
  : BCValueType{ unitLabel_, factor_, min_, max_}
{

}

QString BCValueTypeWord::createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const
{
  //getValue(CONSOLE, CONSOLE_SN_PN_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_PN_LO)),
  // hi byte
  uint32_t result = transmitter.readRawByte( deviceID, registerID ) << 8;
  // low byte, use followup register: +1
  result += transmitter.readRawByte( deviceID, registerID+1 );

   return formatValue( result );
}

/// ----

BCValueTypeODO::BCValueTypeODO( QString unitLabel_, double factor_, optDouble min_, optDouble max_ )
  : BCValueType{ unitLabel_, factor_, min_, max_}
{

}

QString BCValueTypeODO::createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const
{
  return "0x0";
}

