Skip to content

Commit

Permalink
fix conversions
Browse files Browse the repository at this point in the history
  • Loading branch information
Solo-FL committed Aug 2, 2023
1 parent b58a9db commit 2072caa
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 25 deletions.
6 changes: 3 additions & 3 deletions SoloPy/SOLOMotorControllersCanopen.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# @brief This file contains all the functions for the Solo Canopen Drivers
# Availability: https://github.com/Solo-FL/SoloPy/tree/main/SoloPy
# @date Date: 2023
# @version 3.1.2
# @version 3.1.3

## @attention
# Copyright: (c) 2021-2023 SOLO motor controllers project
Expand Down Expand Up @@ -1652,7 +1652,7 @@ def get_position_counts_feedback(self) -> list:
result, error, informationReceived = self.CANOpenReceive(
self._address, ConstantCanopen.Object_PositionCountsFeedback, informationToSend)
if (error == ERROR.NO_ERROR_DETECTED) and (result is True):
return convert_from_data(informationReceived, DATA_TYPE.UINT32), error
return convert_from_data(informationReceived, DATA_TYPE.INT32), error
return -1, error

##
Expand Down Expand Up @@ -1756,7 +1756,7 @@ def get_position_reference(self) -> list:
result, error, informationReceived = self.CANOpenReceive(
self._address, ConstantCanopen.Object_PositionReference, informationToSend)
if (error == ERROR.NO_ERROR_DETECTED) and (result is True):
return convert_from_data(informationReceived, DATA_TYPE.UINT32), error
return convert_from_data(informationReceived, DATA_TYPE.INT32), error
return -1, error

##
Expand Down
49 changes: 30 additions & 19 deletions SoloPy/SOLOMotorControllersUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# Title: SoloPy
# Author: SOLOMotorControllers
# Date: 2023
# Code version: 3.1.1
# Code version: 3.1.3
# Availability: https://github.com/Solo-FL/SoloPy/tree/main/SoloPy
# This Library is made by SOLOMotorControllers.COM
# please visit: https://www.SOLOMotorControllers.com/
Expand All @@ -16,18 +16,35 @@
def convert_to_data(number, dataType: DATA_TYPE) -> list:
data = []
if (dataType == DATA_TYPE.SFXT):
dec = math.ceil(number * 131072)
if dec < 0:
dec *= -1
dec = 0xFFFFFFFF - dec
data = [(dec >> i & 0xff) for i in (24, 16, 8, 0)]
data = SFXT_to_data(number)

if (dataType == DATA_TYPE.UINT32 or dataType == DATA_TYPE.INT32):
dec = number
data = [(dec >> i & 0xff) for i in (24, 16, 8, 0)]
if ( dataType == DATA_TYPE.INT32):
data = INT32_to_data(number)

if (dataType == DATA_TYPE.UINT32):
data = UINT32_to_data(number)

return data

def SFXT_to_data(number) -> list:
data = []
dec = math.ceil(number * 131072)
if dec < 0:
dec *= -1
dec = 0xFFFFFFFF - dec
data = [(dec >> i & 0xff) for i in (24, 16, 8, 0)]
return data

def UINT32_to_data(number) -> list:
dec = number
data = [(dec >> i & 0xff) for i in (24, 16, 8, 0)]
return data

def INT32_to_data(number) -> list:
i32Value = number * 1;
if (i32Value < 0):
i32Value = 4294967295 - abs(i32Value) + 1;
return UINT32_to_data(i32Value)

def convert_from_data(data, dataType: DATA_TYPE):
if (dataType == DATA_TYPE.SFXT):
Expand All @@ -39,7 +56,6 @@ def convert_from_data(data, dataType: DATA_TYPE):
if (dataType == DATA_TYPE.UINT32):
return convert_to_long(data)


def convert_to_float(data) -> float:
dec = 0
dec = int.from_bytes(
Expand All @@ -50,23 +66,20 @@ def convert_to_float(data) -> float:
else:
dec = 0xFFFFFFFF - dec + 1
value = ((float)(dec / 131072.0)) * -1
return float(format(value, 'f')) # .8f

return float(format(value, '.8f')) # .8f

def convert_to_long(data) -> int:
dec = 0
dec = int.from_bytes(
[data[0], data[1], data[2], data[3]], byteorder='big', signed=False)
return dec


def convert_to_int(data) -> int:
dec = 0
dec = int.from_bytes(
[data[0], data[1], data[2], data[3]], byteorder='big', signed=True)
dec = convert_to_long(data)
if (dec > 2147483647):
dec = (4294967295 - dec + 1)*-1
return dec


def ExtractData(Data: list) -> list:
ExtractedData = [0, 0, 0, 0]
if(len(Data)>=8):
Expand All @@ -76,13 +89,11 @@ def ExtractData(Data: list) -> list:
ExtractedData[3] = Data[4]
return ExtractedData


def get_data(cmd: list) -> list:
return [cmd[2], cmd[3], cmd[4], cmd[5]]

# -- input Validation


def set_guard_time_input_validation(guardtime: int) -> list:
if (guardtime < 0 or guardtime > 65535):
return False, ERROR.OUT_OF_RANGE_SETTING, ConstantCommon.InputOutOfRange
Expand Down
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
setup(
name = 'SoloPy',
packages = ['SoloPy'],
version = 'v3.1.2',
version = 'v3.1.3',
license='gpl-3.0',
description = 'PYTHON Library for Control Solo Motor',
author = 'Solo',
author_email = 'support@solomotorcontrollers.com',
url = 'https://github.com/Solo-FL/SoloPy',
download_url = 'https://github.com/Solo-FL/SoloPy/archive/refs/tags/v3.1.2.tar.gz',
download_url = 'https://github.com/Solo-FL/SoloPy/archive/refs/tags/v3.1.3.tar.gz',
keywords = ['Solo Motor controllers', 'Solo', 'SoloPy'],
install_requires=[
'pyserial==3.5',
Expand Down
14 changes: 13 additions & 1 deletion tests/test_SOLOMotorControllersUart.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,16 @@ def general_setget_test(functionSet, functionGet, valueToSet):
# isSet, error = solo.set_current_limit(setValue)
# assert isSet == True
# getValue, error = solo.get_current_limit()
# assert setValue == getValue
# assert setValue == getValue


# snippet for conversion test
# data=b'\xff\xff\xf2\x54'

# print(convert_to_int(data))
# print(convert_to_long(data))
# print(convert_to_float(data))

# print(convert_to_data(convert_to_int(data), DATA_TYPE.INT32))
# print(convert_to_data(convert_to_long(data), DATA_TYPE.UINT32))
# print(convert_to_data(convert_to_float(data), DATA_TYPE.SFXT))

0 comments on commit 2072caa

Please sign in to comment.