/** * Allocate / get first button from the unallocated buttons * @retval Button pointer or message and NULL pointer if no button available */ TouchButton * TouchButton::allocButton(bool aOnlyAutorepeatButtons) { TouchButton * tButtonPointer = sListStart; if (!sButtonPoolIsInitialized) { // mark pool as free for (int i = 0; i < NUMBER_OF_BUTTONS_IN_POOL; ++i) { TouchButtonPool[i].mFlags &= ~FLAG_IS_ALLOCATED; } sButtonPoolIsInitialized = true; } // walk through list while (tButtonPointer != NULL && ((tButtonPointer->mFlags & FLAG_IS_ALLOCATED) || (aOnlyAutorepeatButtons && !(tButtonPointer->mFlags & FLAG_IS_AUTOREPEAT_BUTTON)) || (!aOnlyAutorepeatButtons && (tButtonPointer->mFlags & FLAG_IS_AUTOREPEAT_BUTTON)))) { tButtonPointer = tButtonPointer->mNextObject; } if (tButtonPointer == NULL) { if (aOnlyAutorepeatButtons) { failParamMessage(sButtonCombinedPoolSize, "No autorepeat button available"); } else { failParamMessage(sButtonCombinedPoolSize, "No button available"); } // to avoid NULL pointer tButtonPointer = sListStart; sButtonCombinedPoolSize++; } else { tButtonPointer->mFlags |= FLAG_IS_ALLOCATED; } sButtonCombinedPoolSize--; if (sButtonCombinedPoolSize < sMinButtonPoolSize) { sMinButtonPoolSize = sButtonCombinedPoolSize; } return tButtonPointer; }
/** * Allocate / get first button from the unallocated buttons * @retval Button pointer or message and NULL pointer if no button available */ TouchButton * TouchButton::allocButton(bool aOnlyAutorepeatButtons) { TouchButton * tButtonPointer; if (!sButtonPoolIsInitialized) { tButtonPointer = NULL; // mark pool as free for (int i = NUMBER_OF_BUTTONS_IN_POOL - 1; i >= 0; i--) { TouchButtonPool[i].mFlags = 0; TouchButtonPool[i].mNextObject = tButtonPointer; tButtonPointer = &TouchButtonPool[i]; } sButtonPoolIsInitialized = true; sButtonListStart = &TouchButtonPool[0]; } // walk through list tButtonPointer = sButtonListStart; while (tButtonPointer != NULL && (tButtonPointer->mFlags & FLAG_IS_ALLOCATED)) { tButtonPointer = tButtonPointer->mNextObject; } if (tButtonPointer == NULL) { failParamMessage(sButtonCombinedPoolSize, "No button available"); // to avoid NULL pointer tButtonPointer = sButtonListStart; } else { tButtonPointer->mFlags |= FLAG_IS_ALLOCATED; sButtonCombinedPoolSize--; } if (sButtonCombinedPoolSize < sMinButtonPoolSize) { sMinButtonPoolSize = sButtonCombinedPoolSize; } return tButtonPointer; }
int8_t TouchButton::setPosition(uint16_t aPositionX, uint16_t aPositionY) { int8_t tRetValue = 0; mPositionX = aPositionX; mPositionY = aPositionY; // check values if (aPositionX + mWidthX > LOCAL_DISPLAY_WIDTH) { mWidthX = LOCAL_DISPLAY_WIDTH - aPositionX; failParamMessage(aPositionX + mWidthX, "XRight wrong"); tRetValue = TOUCHBUTTON_ERROR_X_RIGHT; } if (aPositionY + mHeightY > LOCAL_DISPLAY_HEIGHT) { mHeightY = LOCAL_DISPLAY_HEIGHT - mPositionY; failParamMessage(aPositionY + mHeightY, "YBottom wrong"); tRetValue = TOUCHBUTTON_ERROR_Y_BOTTOM; } return tRetValue; }
int8_t TouchButton::setPosition(const uint16_t aPositionX, const uint16_t aPositionY) { int8_t tRetValue = 0; mPositionX = aPositionX; mPositionY = aPositionY; // check values if (aPositionX + mWidth > mDisplay->getDisplayWidth()) { mWidth = mDisplay->getDisplayWidth() - aPositionX; failParamMessage(aPositionX + mWidth, "XRight wrong"); tRetValue = TOUCHBUTTON_ERROR_X_RIGHT; } if (aPositionY + mHeight > mDisplay->getDisplayHeight()) { mHeight = mDisplay->getDisplayHeight() - mPositionY; failParamMessage(aPositionY + mHeight, "YBottom wrong"); tRetValue = TOUCHBUTTON_ERROR_Y_BOTTOM; } return tRetValue; }
/** * free / release one button to the unallocated buttons */ void TouchButton::freeButton(TouchButton * aTouchButton) { TouchButton * tButtonPointer = sButtonListStart; // walk through list while (tButtonPointer != NULL && tButtonPointer != aTouchButton) { tButtonPointer = tButtonPointer->mNextObject; } if (tButtonPointer == NULL) { failParamMessage(aTouchButton, "Button not found in list"); } else { sButtonCombinedPoolSize++; tButtonPointer->mFlags &= ~FLAG_IS_ALLOCATED; tButtonPointer->mFlags &= ~FLAG_IS_ACTIVE; } }