Scramble.cpp
Scramble.cpp
CPP1/* Copyright Statement:2 *3 * (C) 2021-2025 Cubios Inc. All rights reserved.4 */56#include "Scramble.h"78namespace Cubios9{1011 void Scramble::rememberCurrentTopology()12 {13 for (uint8_t screen = 0; screen < SCREENS_MAX; ++screen)14 {15 Cubios::TOPOLOGY_getAdjacentFacelet(0, screen, NEIGHBOR_TOP, &TopFaceletsStarting[screen][0]);1617 for (uint8_t i = 1; i < MODULES_MAX / 2; ++i)18 {19 Cubios::TOPOLOGY_getAdjacentFacelet(TopFaceletsStarting[screen][i - 1].module, TopFaceletsStarting[screen][i - 1].screen, NEIGHBOR_TOP, &TopFaceletsStarting[screen][i]);20 Cubios::TOPOLOGY_getAdjacentFacelet(TopFaceletsStarting[screen][i].module, TopFaceletsStarting[screen][i].screen, NEIGHBOR_RIGHT, &TopFaceletsStarting[screen][i]);21 }22 }23 memcpy(&TopFaceletsEndind, &TopFaceletsStarting, sizeof(TopFaceletsStarting));24 };2526 void Scramble::rotate(uint8_t scr, uint8_t dir)27 {28 Cubios::TOPOLOGY_twistInfo_t twist;29 twist.count = 1;30 twist.screen = scr;31 twist.direction = dir;3233 this->on_BeforeTwist();3435 if (dir == TWIST_LEFT)36 {37 for (uint8_t i = 0; i < MODULES_MAX / 2 - 1; ++i)38 {39 std::swap(TopFaceletsEndind[twist.screen][i], TopFaceletsEndind[twist.screen][(i + 1)]);40 }41 }42 else if (dir == TWIST_RIGHT)43 {44 for (uint8_t i = MODULES_MAX / 2 - 1; i >= 1; --i)45 {46 std::swap(TopFaceletsEndind[twist.screen][i], TopFaceletsEndind[twist.screen][(i - 1)]);47 }48 }4950 for (uint8_t i = 0; i < MODULES_MAX / 2; ++i)51 {52 for (uint8_t screen = 0; screen < SCREENS_MAX; ++screen)53 {54 this->on_MappingChanged(55 TopFaceletsEndind[twist.screen][i].module,56 (TopFaceletsEndind[twist.screen][i].screen + screen) % SCREENS_MAX,57 TopFaceletsStarting[twist.screen][i].module,58 (TopFaceletsStarting[twist.screen][i].screen + screen) % SCREENS_MAX);59 }60 }6162 this->on_Twist(twist);63 };6465 void Scramble::StartScramble(uint8_t twistsCount)66 {67 if (twistsCount < 1)68 return;6970 uint8_t screen;71 uint8_t direction;7273 for (uint32_t twistI = 0; twistI < twistsCount; ++twistI)74 {75 this->rememberCurrentTopology();7677 screen = Cubios::random(0, SCREENS_MAX - 1);78 direction = Cubios::random(TWIST_LEFT, TWIST_RIGHT);7980 if (screen == this->previosTwist.screen)81 {82 screen = ++screen % SCREENS_MAX;83 }8485 this->rotate(screen, direction);8687 memcpy(&TopFaceletsStarting, &TopFaceletsEndind, sizeof(TopFaceletsStarting));8889 this->previosTwist.screen = screen;90 this->previosTwist.direction = direction;91 }92 };9394 void Scramble::VirtualTwist(uint8_t screen, uint8_t direction)95 {96 if (direction != TWIST_LEFT && direction != TWIST_RIGHT)97 return;98 if (screen >= SCREENS_MAX)99 return;100101 this->rememberCurrentTopology();102103 this->rotate(screen, direction);104 };105}106
Wrapped for easier reading. Turn wrap off to inspect exact line lengths.