diff options
author | Patrick Benavoli <patrickx.benavoli@intel.com> | 2011-08-31 11:23:24 +0200 |
---|---|---|
committer | David Wagner <david.wagner@intel.com> | 2014-02-10 17:14:54 +0100 |
commit | 1387bda01b089d8e8df06339d9c15d53b3de6725 (patch) | |
tree | c8dd258fdff344e629433f89976ca573ff828c31 | |
parent | 2ecf900ad8c30ce9f8e81f57977a1a80a6f6d8af (diff) | |
download | external_parameter-framework-1387bda01b089d8e8df06339d9c15d53b3de6725.zip external_parameter-framework-1387bda01b089d8e8df06339d9c15d53b3de6725.tar.gz external_parameter-framework-1387bda01b089d8e8df06339d9c15d53b3de6725.tar.bz2 |
Min/max value computation; Tuning lock handling
BZ: 7466
- Min/max values are now correctly computed. They concern integer and fixed point parameters
- tuning mode lock issue solved: created an AutoLock class for safe lock handling
- added configuration files for a demo on Ubuntu environment
- had AMIXER subsystem plugin compliant for derivation
- LPE library: add carriage return on logs
- removed obsolete files
- some cosmetics
Change-Id: Ife7a4799fd48dd4a1ca25dae666c4e453815881e
Orig-Change-Id: I72fc5c1ff6abf638b43266a75bc00e21ad412349
Signed-off-by: Patrick Benavoli <patrickx.benavoli@intel.com>
Reviewed-on: http://android.intel.com:8080/16880
Reviewed-by: Mahe, Erwan <erwan.mahe@intel.com>
Tested-by: Barthes, FabienX <fabienx.barthes@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
-rw-r--r-- | parameter/Android.mk | 4 | ||||
-rw-r--r-- | parameter/AutoLock.cpp (renamed from parameter/SelectionCriterionDefinition.cpp) | 23 | ||||
-rw-r--r-- | parameter/AutoLock.h (renamed from parameter/SelectionCriterionDefinition.h) | 23 | ||||
-rw-r--r-- | parameter/Component.cpp | 2 | ||||
-rw-r--r-- | parameter/Component.h | 4 | ||||
-rw-r--r-- | parameter/Element.cpp | 2 | ||||
-rw-r--r-- | parameter/FixedPointParameterType.cpp | 31 | ||||
-rw-r--r-- | parameter/FixedPointParameterType.h | 2 | ||||
-rw-r--r-- | parameter/IntegerParameterType.cpp | 15 | ||||
-rw-r--r-- | parameter/ParameterMgr.cpp | 81 | ||||
-rw-r--r-- | parameter/ParameterType.cpp | 37 | ||||
-rw-r--r-- | parameter/ParameterType.h | 6 | ||||
-rw-r--r-- | parameter/SystemClass.cpp | 2 | ||||
-rw-r--r-- | parameter/buildlog.txt | 1 | ||||
-rwxr-xr-x | parameter/parameter | 4 | ||||
-rw-r--r-- | remote-processor/Message.cpp | 2 |
16 files changed, 131 insertions, 108 deletions
diff --git a/parameter/Android.mk b/parameter/Android.mk index 3e430ce..86bdb35 100644 --- a/parameter/Android.mk +++ b/parameter/Android.mk @@ -24,7 +24,6 @@ LOCAL_SRC_FILES:= \ SelectionCriteriaDefinition.cpp \ SelectionCriterionType.cpp \ ElementLibrary.cpp \ - SelectionCriterionDefinition.cpp \ SubsystemElementBuilder.cpp \ SubsystemLibrary.cpp \ SelectionCriterion.cpp \ @@ -83,7 +82,8 @@ LOCAL_SRC_FILES:= \ MappingContext.cpp \ SubsystemObject.cpp \ SubsystemObjectCreator.cpp \ - BaseParameter.cpp + BaseParameter.cpp \ + AutoLock.cpp LOCAL_MODULE:= libparameter diff --git a/parameter/SelectionCriterionDefinition.cpp b/parameter/AutoLock.cpp index 58c5485..d9f4f34 100644 --- a/parameter/SelectionCriterionDefinition.cpp +++ b/parameter/AutoLock.cpp @@ -1,10 +1,10 @@ /* <auto_header> * <FILENAME> - * + * * INTEL CONFIDENTIAL - * Copyright © 2011 Intel + * Copyright © 2011 Intel * Corporation All Rights Reserved. - * + * * The source code contained or described herein and all documents related to * the source code ("Material") are owned by Intel Corporation or its suppliers * or licensors. Title to the Material remains with Intel Corporation or its @@ -14,27 +14,28 @@ * treaty provisions. No part of the Material may be used, copied, reproduced, * modified, published, uploaded, posted, transmitted, distributed, or * disclosed in any way without Intel’s prior express written permission. - * + * * No license under any patent, copyright, trade secret or other intellectual * property right is granted to or conferred upon you by disclosure or delivery * of the Materials, either expressly, by implication, inducement, estoppel or * otherwise. Any license under such intellectual property rights must be * express and approved by Intel in writing. - * + * * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) * CREATED: 2011-06-01 * UPDATED: 2011-07-27 - * - * + * + * * </auto_header> */ -#include "SelectionCriterionDefinition.h" +#include "AutoLock.h" -CSelectionCriterionDefinition::CSelectionCriterionDefinition(const string& strName) : CElement(strName) +CAutoLock::CAutoLock(pthread_mutex_t* pMutex) : _pMutex(pMutex) { + pthread_mutex_lock(_pMutex); } -string CSelectionCriterionDefinition::getKind() const +CAutoLock::~CAutoLock() { - return "SelectionCriterionDefinition"; + pthread_mutex_unlock(_pMutex); } diff --git a/parameter/SelectionCriterionDefinition.h b/parameter/AutoLock.h index 4532010..4ff0ef4 100644 --- a/parameter/SelectionCriterionDefinition.h +++ b/parameter/AutoLock.h @@ -1,10 +1,10 @@ /* <auto_header> * <FILENAME> - * + * * INTEL CONFIDENTIAL - * Copyright © 2011 Intel + * Copyright © 2011 Intel * Corporation All Rights Reserved. - * + * * The source code contained or described herein and all documents related to * the source code ("Material") are owned by Intel Corporation or its suppliers * or licensors. Title to the Material remains with Intel Corporation or its @@ -14,30 +14,31 @@ * treaty provisions. No part of the Material may be used, copied, reproduced, * modified, published, uploaded, posted, transmitted, distributed, or * disclosed in any way without Intel’s prior express written permission. - * + * * No license under any patent, copyright, trade secret or other intellectual * property right is granted to or conferred upon you by disclosure or delivery * of the Materials, either expressly, by implication, inducement, estoppel or * otherwise. Any license under such intellectual property rights must be * express and approved by Intel in writing. - * + * * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) * CREATED: 2011-06-01 * UPDATED: 2011-07-27 - * - * + * + * * </auto_header> */ #pragma once -#include "Element.h" +#include <pthread.h> -class CSelectionCriterionDefinition : public CElement +class CAutoLock { public: - CSelectionCriterionDefinition(const string& strName); + CAutoLock(pthread_mutex_t* pMutex); + ~CAutoLock(); - virtual string getKind() const; private: + pthread_mutex_t* _pMutex; }; diff --git a/parameter/Component.cpp b/parameter/Component.cpp index 66c9893..318c2ec 100644 --- a/parameter/Component.cpp +++ b/parameter/Component.cpp @@ -32,7 +32,7 @@ #include "ComponentLibrary.h" #include "Mapper.h" -#define base CParameterBlock +#define base CInstanceConfigurableElement CComponent::CComponent(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement) { diff --git a/parameter/Component.h b/parameter/Component.h index d43e6e8..e868f62 100644 --- a/parameter/Component.h +++ b/parameter/Component.h @@ -30,9 +30,9 @@ */ #pragma once -#include "ParameterBlock.h" +#include "InstanceConfigurableElement.h" -class CComponent : public CParameterBlock +class CComponent : public CInstanceConfigurableElement { public: CComponent(const string& strName, const CTypeElement* pTypeElement); diff --git a/parameter/Element.cpp b/parameter/Element.cpp index 915bc65..50c0774 100644 --- a/parameter/Element.cpp +++ b/parameter/Element.cpp @@ -689,7 +689,7 @@ void CElement::appendTitle(string& strTo, const string& strTitle) while (uiLength--) { - strTo += "─"; + strTo += "="; } strTo += "\n"; } diff --git a/parameter/FixedPointParameterType.cpp b/parameter/FixedPointParameterType.cpp index fb986c5..5b90f13 100644 --- a/parameter/FixedPointParameterType.cpp +++ b/parameter/FixedPointParameterType.cpp @@ -130,7 +130,7 @@ bool CFixedPointParameterType::asInteger(const string& strValue, uint32_t& uiVal if (bValueProvidedAsHexa) { - if (!isEncodable(iData)) { + if (!isEncodable(iData, getUtilSizeInBits())) { // Illegal value provided parameterAccessContext.setError(getOutOfRangeError(strValue, parameterAccessContext.valueSpaceIsRaw(), true)); @@ -149,8 +149,9 @@ bool CFixedPointParameterType::asInteger(const string& strValue, uint32_t& uiVal // Do the conversion iData = (int32_t)(dData * (1UL << _uiFractional) + 0.5F - (double)(dData < 0)); } + // Check integrity - if (!isConsistent(iData, true)) { + if (!isConsistent(iData)) { // Illegal value provided parameterAccessContext.setError(getOutOfRangeError(strValue, parameterAccessContext.valueSpaceIsRaw(), bValueProvidedAsHexa)); @@ -168,7 +169,7 @@ void CFixedPointParameterType::asString(const uint32_t& uiValue, string& strValu int32_t iData = uiValue; // Check consistency - assert(isEncodable(iData)); + assert(isEncodable(iData, getUtilSizeInBits())); // Sign extend signExtend(iData); @@ -207,8 +208,8 @@ uint32_t CFixedPointParameterType::getUtilSizeInBits() const string CFixedPointParameterType::getOutOfRangeError(const string& strValue, bool bRawValueSpace, bool bHexaValue) const { // Min/Max computation - int32_t iMin = ((int32_t)1 << 31) >> (32 - getUtilSizeInBits()); - int32_t iMax = -iMin - 1; + int32_t iMax = (1L << (getUtilSizeInBits() - 1)) - 1; + int32_t iMin = -iMax - 1; ostringstream strStream; @@ -223,7 +224,9 @@ string CFixedPointParameterType::getOutOfRangeError(const string& strValue, bool if (bHexaValue) { + // Format Min strStream << "0x" << hex << uppercase << setw(getSize()*2) << setfill('0') << makeEncodable(iMin); + // Format Max strStream << ", 0x" << hex << uppercase << setw(getSize()*2) << setfill('0') << makeEncodable(iMax); } else { @@ -237,3 +240,21 @@ string CFixedPointParameterType::getOutOfRangeError(const string& strValue, bool return strStream.str(); } + +// Check data is consistent with available range, with respect to its sign +bool CFixedPointParameterType::isConsistent(uint32_t uiData) const +{ + uint32_t uiShift = 32 - getUtilSizeInBits(); + + if (uiShift) { + + // Negative value? + bool bIsValueExpectedNegative = (uiData & (1 << (uiShift - 1))) != 0; + + // Check high bits are clean + return bIsValueExpectedNegative ? !(~uiData >> uiShift) : !(uiData >> uiShift); + } + + return true; +} + diff --git a/parameter/FixedPointParameterType.h b/parameter/FixedPointParameterType.h index 78b0b7e..d4e13d4 100644 --- a/parameter/FixedPointParameterType.h +++ b/parameter/FixedPointParameterType.h @@ -58,6 +58,8 @@ private: uint32_t getUtilSizeInBits() const; // Out of range error string getOutOfRangeError(const string& strValue, bool bRawValueSpace, bool bHexaValue) const; + // Check data is consistent with available range, with respect to its sign + bool isConsistent(uint32_t uiData) const; // Integral part in Q notation uint32_t _uiIntegral; diff --git a/parameter/IntegerParameterType.cpp b/parameter/IntegerParameterType.cpp index 1f20c93..f3e447e 100644 --- a/parameter/IntegerParameterType.cpp +++ b/parameter/IntegerParameterType.cpp @@ -74,21 +74,30 @@ bool CIntegerParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializi // Size setSize(xmlElement.getAttributeInteger("Size") / 8); + // Size in bits + uint32_t uiUtilSizeInBits = getSize() << 3; + // Min / Max if (_bSigned) { + + // Signed means we have one less util bit + uiUtilSizeInBits--; + if (xmlElement.hasAttribute("Min")) { _uiMin = (uint32_t)xmlElement.getAttributeSignedInteger("Min"); } else { - _uiMin = 1UL << 31; + _uiMin = 1UL << uiUtilSizeInBits; + + signExtend((int32_t&)_uiMin); } if (xmlElement.hasAttribute("Max")) { _uiMax = (uint32_t)xmlElement.getAttributeSignedInteger("Max"); } else { - _uiMax = (1UL << 31) - 1; + _uiMax = (1UL << uiUtilSizeInBits) - 1; } } else { if (xmlElement.hasAttribute("Min")) { @@ -103,7 +112,7 @@ bool CIntegerParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializi _uiMax = xmlElement.getAttributeInteger("Max"); } else { - _uiMax = (uint32_t)-1; + _uiMax = (uint32_t)((1UL << uiUtilSizeInBits) - 1); } } diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp index b27a1b5..87f6662 100644 --- a/parameter/ParameterMgr.cpp +++ b/parameter/ParameterMgr.cpp @@ -39,7 +39,6 @@ #include "KindElementBuilderTemplate.h" #include "ElementBuilderTemplate.h" #include "SelectionCriterionType.h" -#include "SelectionCriterionDefinition.h" #include "SubsystemElementBuilder.h" #include "SelectionCriteria.h" #include "ComponentType.h" @@ -71,6 +70,7 @@ #include "SelectionCriterionRule.h" #include "SimulatedBackSynchronizer.h" #include "HardwareBackSynchronizer.h" +#include "AutoLock.h" #include <strings.h> #include <dlfcn.h> #include <assert.h> @@ -120,7 +120,7 @@ const CParameterMgr::SRemoteCommandParserItem CParameterMgr::gaRemoteCommandPars { "getAutoSync", &CParameterMgr::getAutoSyncCommmandProcess, 0, "", "Show Auto Sync state" }, { "sync", &CParameterMgr::syncCommmandProcess, 0, "", "Synchronize current settings to hardware while in Tuning Mode and Auto Sync off" }, /// Criteria - { "listCriteria", &CParameterMgr::listCriteriaCommmandProcess, 0, "", "List available selection criteria" }, + { "listCriteria", &CParameterMgr::listCriteriaCommmandProcess, 0, "", "List selection criteria" }, /// Domains { "listDomains", &CParameterMgr::listDomainsCommmandProcess, 0, "", "List configurable domains" }, { "createDomain", &CParameterMgr::createDomainCommmandProcess, 1, "<domain>", "Create new configurable domain" }, @@ -143,9 +143,9 @@ const CParameterMgr::SRemoteCommandParserItem CParameterMgr::gaRemoteCommandPars { "dumpElement", &CParameterMgr::dumpElementCommmandProcess, 1, "<elem path>", "Dump structure and content of element at given path" }, { "getElementSize", &CParameterMgr::getElementSizeCommmandProcess, 1, "<elem path>", "Show size of element at given path" }, { "showProperties", &CParameterMgr::showPropertiesCommmandProcess, 1, "<elem path>", "Show properties of element at given path" }, - { "getParameter", &CParameterMgr::getParameterCommmandProcess, 1, "<param ath>", "Get value for parameter at given path" }, + { "getParameter", &CParameterMgr::getParameterCommmandProcess, 1, "<param path>", "Get value for parameter at given path" }, { "setParameter", &CParameterMgr::setParameterCommmandProcess, 2, "<param path> <value>", "Set value for parameter at given path" }, - { "listBelongingDomains", &CParameterMgr::listBelongingDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is contained in" }, + { "listBelongingDomains", &CParameterMgr::listBelongingDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path belongs to" }, { "listAssociatedDomains", &CParameterMgr::listAssociatedDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is associated to" }, /// Browse { "listAssociatedElements", &CParameterMgr::listAssociatedElementsCommmandProcess, 0, "", "List element sub-trees associated to at least one configurable domain" }, @@ -273,16 +273,41 @@ bool CParameterMgr::load(string& strError) return false; } - // All is loaded, we're ready to observe selection criteria events - getSelectionCriteria()->setObserver(this); + // Back synchronization for areas in parameter blackboard not covered by any domain + CBackSynchronizer* pBackSynchronizer = createBackSynchronizer(strError); + + log("Main blackboard back synchronization"); + + // Back-synchronize + if (!pBackSynchronizer->sync()) { + // Get rid of back synchronizer + delete pBackSynchronizer; - // Load and start Remote processor server if appropriate - if (!handleRemoteProcessingInterface(strError)) { + strError = "Main blackboard back synchronization failed: " + strError; return false; } + // Get rif of back synchronizer + delete pBackSynchronizer; - return true; + // We're done loading the settings and back synchronizing + CConfigurableDomains* pConfigurableDomains = getConfigurableDomains(); + + // We need to ensure all domains are valid + pConfigurableDomains->validate(_pMainParameterBlackboard); + + // Ensure application of currently selected configurations + // Force-apply configurations + if (!pConfigurableDomains->apply(_pMainParameterBlackboard, true, strError)) { + + return false; + } + + // All is loaded, we're ready to observe selection criteria change events + getSelectionCriteria()->setObserver(this); + + // Start remote processor server if appropriate + return handleRemoteProcessingInterface(strError); } bool CParameterMgr::loadFrameworkConfiguration(string& strError) @@ -456,30 +481,7 @@ bool CParameterMgr::loadSettings(string& strError) return false; } - // Back synchronization for areas in parameter blackboard no covered by any domain - CBackSynchronizer* pBackSynchronizer = createBackSynchronizer(strError); - - log("Main blackboard back synchronization"); - - // Back-synchronize - if (!pBackSynchronizer->sync()) { - // Get rif of back synchronizer - delete pBackSynchronizer; - - strError = "Main blackboard back synchronization failed: " + strError; - - return false; - } - // Get rif of back synchronizer - delete pBackSynchronizer; - - // We're done loading the settings - // We need to ensure all domains are valid - pConfigurableDomains->validate(_pMainParameterBlackboard); - - // Ensure application of currently selected configurations - // Force-apply configuration(s) - return pConfigurableDomains->apply(_pMainParameterBlackboard, true, strError); + return true; } // XML parsing @@ -556,7 +558,7 @@ void CParameterMgr::selectionCriterionChanged(const CSelectionCriterion* pSelect CAutoLog autoLog(this, "Selection criterion changed event: " + pSelectionCriterion->getFormattedDescription(false)); // Lock state - pthread_mutex_lock(&_tuningModeMutex); + CAutoLock autoLock(&_tuningModeMutex); if (!_bTuningModeIsOn) { @@ -568,8 +570,6 @@ void CParameterMgr::selectionCriterionChanged(const CSelectionCriterion* pSelect log("Failed to apply configurations!"); } } - // Unlock state - pthread_mutex_unlock(&_tuningModeMutex); } // Command processing @@ -1267,13 +1267,13 @@ bool CParameterMgr::setTuningMode(bool bOn, string& strError) return false; } // Lock state - pthread_mutex_lock(&_tuningModeMutex); + CAutoLock autoLock(&_tuningModeMutex); // Warn domains about exiting tuning mode if (!bOn && _bTuningModeIsOn) { // Ensure application of currently selected configurations - // Force-apply configuration(s) + // Force-apply configurations if (!getConfigurableDomains()->apply(_pMainParameterBlackboard, true, strError)) { return false; @@ -1285,9 +1285,6 @@ bool CParameterMgr::setTuningMode(bool bOn, string& strError) // Store _bTuningModeIsOn = bOn; - // Unlock state - pthread_mutex_unlock(&_tuningModeMutex); - return true; } @@ -1331,7 +1328,7 @@ bool CParameterMgr::setAutoSync(bool bAutoSyncOn, string& strError) if (bAutoSyncOn && !_bAutoSyncOn) { // Ensure application of currently selected configurations - // Force-apply configuration(s) + // Force-apply configurations if (!getConfigurableDomains()->apply(_pMainParameterBlackboard, true, strError)) { return false; diff --git a/parameter/ParameterType.cpp b/parameter/ParameterType.cpp index 53d10e6..0d3dac5 100644 --- a/parameter/ParameterType.cpp +++ b/parameter/ParameterType.cpp @@ -125,21 +125,28 @@ void CParameterType::signExtend(int32_t& iData) const // Check data has no bit set outside available range bool CParameterType::isEncodable(uint32_t uiData) const { - uint32_t uiSizeInBits = _uiSize << 3; - uint32_t uiShift = 32 - uiSizeInBits; + return isEncodable(uiData, _uiSize << 3); +} - if (uiShift) { +// Check data has no bit set outside available range +bool CParameterType::isEncodable(uint32_t uiData, uint32_t uiSizeInBits) const +{ + if (uiSizeInBits == 32) { - // Check high bits are clean - return !(uiData >> uiShift); + return true; } - return true; + // Check high bits are clean + return !(uiData >> uiSizeInBits); } // Remove all bits set outside available range uint32_t CParameterType::makeEncodable(uint32_t uiData) const { + if (_uiSize == sizeof(uint32_t)) { + + return uiData; + } uint32_t uiSizeInBits = _uiSize << 3; uint32_t uiMask = (1 << uiSizeInBits) - 1; @@ -147,21 +154,3 @@ uint32_t CParameterType::makeEncodable(uint32_t uiData) const return uiData & uiMask; } -// Check data is consistent with available range, with respect to its sign -bool CParameterType::isConsistent(uint32_t uiData, bool bSigned) const -{ - uint32_t uiSizeInBits = _uiSize << 3; - uint32_t uiShift = 32 - uiSizeInBits; - - if (uiShift) { - - // Negative value? - bool bIsValueExpectedNegative = bSigned && (uiData & (1 << (uiShift - 1))) != 0; - - // Check high bits are clean - return bIsValueExpectedNegative ? !(~uiData >> uiShift) : !(uiData >> uiShift); - } - - return true; -} - diff --git a/parameter/ParameterType.h b/parameter/ParameterType.h index 88ee0ea..980afba 100644 --- a/parameter/ParameterType.h +++ b/parameter/ParameterType.h @@ -70,12 +70,12 @@ protected: void setSize(uint32_t uiSize); // Sign extension void signExtend(int32_t& iData) const; - // Check data has no bit set outside available range + // Check data has no bit set outside available range (based on byte size) bool isEncodable(uint32_t uiData) const; + // Check data has no bit set outside available range + bool isEncodable(uint32_t uiData, uint32_t uiSizeInBits) const; // Remove all bits set outside available range uint32_t makeEncodable(uint32_t uiData) const; - // Check data is consistent with available range, with respect to its sign - bool isConsistent(uint32_t uiData, bool bSigned) const; private: // Instantiation diff --git a/parameter/SystemClass.cpp b/parameter/SystemClass.cpp index 62b6538..2314c4f 100644 --- a/parameter/SystemClass.cpp +++ b/parameter/SystemClass.cpp @@ -80,6 +80,8 @@ bool CSystemClass::loadSubsystems(string& strError, const vector<string>& astrPl // No plugin found? strError = "No subsystem plugin found"; + + return false; } // Actually load plugins diff --git a/parameter/buildlog.txt b/parameter/buildlog.txt new file mode 100644 index 0000000..df695c2 --- /dev/null +++ b/parameter/buildlog.txt @@ -0,0 +1 @@ +make: *** No rule to make target `mfld_cdk'. Stop. diff --git a/parameter/parameter b/parameter/parameter index 6d8ad82..ae592e2 100755 --- a/parameter/parameter +++ b/parameter/parameter @@ -1,2 +1,2 @@ -#!/bin/sh -./remote-process localhost 5000 $* +#!/system/bin/sh +remote-process localhost 5000 $* diff --git a/remote-processor/Message.cpp b/remote-processor/Message.cpp index 5679501..4454b1c 100644 --- a/remote-processor/Message.cpp +++ b/remote-processor/Message.cpp @@ -236,7 +236,7 @@ bool CMessage::serialize(CSocket* pSocket, bool bOut) // Checksum uint8_t CMessage::computeChecksum() const { - uint8_t uiChecksum = (_ucMsgId & 0xFF) + (_ucMsgId >> 8); + uint8_t uiChecksum = _ucMsgId; uint32_t uiIndex; |