Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions include/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ static_assert(offsetof(::PuzzleState, turnBoardId) == 44,
static_assert(sizeof(::PuzzleState) == 48, "PuzzleState size changed");
static_assert(offsetof(PacketHeader, senderId) == 8,
"PacketHeader senderId offset changed");

struct PuzzleAckPacket {
PacketHeader header;
uint32_t targetBoardId;
Expand Down Expand Up @@ -138,4 +137,4 @@ static_assert(sizeof(GameStatePacket) == 116,
static_assert(sizeof(GameAckPacket) == 40,
"GameAckPacket wire format changed");
static_assert(sizeof(MastermindStateRequestPacket) == 32,
"MastermindStateRequestPacket wire format changed");
"MastermindStateRequestPacket wire format changed");
25 changes: 21 additions & 4 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ constexpr KnownBoard kKnownBoards[] = {
{0x6AF4E9D4, {0xD4, 0xE9, 0xF4, 0x6A, 0xF4, 0xFC}},
{0xE7D8CBB0, {0xB0, 0xCB, 0xD8, 0xE7, 0x1E, 0xD4}},
};

constexpr int16_t kBoardAreaTop = 43;
constexpr int16_t kBoardAreaWidth = 304;
constexpr int16_t kBoardAreaHeight = 162;
Expand All @@ -65,6 +64,7 @@ constexpr uint16_t kMastermindColors[kMastermindColorCount + 1] = {
TFT_DARKGREY, TFT_RED, TFT_ORANGE, TFT_YELLOW,
TFT_GREEN, TFT_CYAN, TFT_MAGENTA,
};

TFT_eSPI display;
SPIClass touchSpi(VSPI);
XPT2046_Touchscreen touch(kTouchCsPin, kTouchIrqPin);
Expand Down Expand Up @@ -128,6 +128,7 @@ MastermindState mastermindState{};
MastermindPendingDelivery mastermindPendingDelivery{};
MastermindPendingAck mastermindPendingAck{};
MastermindCode draftCode{{1, 1, 1, 1}};
MastermindCode lastSubmittedGuess{{1, 1, 1, 1}};
ScreenMode screenMode = ScreenMode::Home;
ActiveGameClock activeGame{kNoActiveGameEpoch, ActiveGameKind::Home};
uint32_t boardId = 0;
Expand Down Expand Up @@ -163,6 +164,7 @@ bool sendMastermindFullStateSoon = false;
bool touchWasDown = false;
bool lastOnline = false;
uint8_t selectedPeg = 0;
// MastermindPhase lastAdoptedMastermindPhase — reserved for future use

PacketHeader makeHeader(MessageType type) {
return PacketHeader{kProtocolMagic, kProtocolVersion, type, boardId,
Expand Down Expand Up @@ -768,13 +770,18 @@ bool validMastermindIdentity(const MastermindState& state) {
return state.hostBoardId == host && state.guestBoardId == guest;
}

void prepareMastermindDraft() {
draftCode = MastermindCode{{1, 1, 1, 1}};
void prepareMastermindDraft(const MastermindState& state) {
if (state.phase == MastermindPhase::Guessing &&
state.codemakerBoardId != boardId) {
draftCode = lastSubmittedGuess;
} else {
draftCode = MastermindCode{{1, 1, 1, 1}};
}
selectedPeg = 0;
}

void noteMastermindPhase(const MastermindState& state) {
prepareMastermindDraft();
prepareMastermindDraft(state);
if (state.phase == MastermindPhase::RoundComplete) {
mastermindCompletedAtMs = millis();
}
Expand Down Expand Up @@ -1341,11 +1348,16 @@ void sendMastermindStateRequest() {
digest = mastermindStateDigest(mastermindState);
}
portEXIT_CRITICAL(&gameMux);
if (protocolMutex == nullptr ||
xSemaphoreTake(protocolMutex, portMAX_DELAY) != pdTRUE) {
return;
}
MastermindStateRequestPacket packet{
makeHeader(MessageType::MastermindRequestState), gameId, revision,
digest};
esp_now_send(expectedPeerAddress, reinterpret_cast<uint8_t*>(&packet),
sizeof(packet));
xSemaphoreGive(protocolMutex);
}

void refreshPeerIdentity() {
Expand Down Expand Up @@ -1564,6 +1576,7 @@ void handleMastermindTouch(int16_t x, int16_t y) {
if (x >= 211 && x <= 303 && y >= 185 && y <= 224) {
MastermindState next = snapshot;
if (submitMastermindGuess(next, draftCode, boardId)) {
lastSubmittedGuess = draftCode;
commitMastermindState(next, MessageType::MastermindState,
&snapshot);
}
Expand Down Expand Up @@ -1638,6 +1651,10 @@ void handleTouch() {
handleMastermindTouch(x, y);
return;
}
if (mode == ScreenMode::Mastermind) {
handleMastermindTouch(x, y);
return;
}
if (mode != ScreenMode::Puzzle || pending || !peerOnline()) {
return;
}
Expand Down
Loading