Function bodies 456 total
ledsOff function · cpp · L233-L240 (8 LOC)esp32-terminal/src/leds.cpp
void ledsOff() {
ledsSetYes(LedState::OFF);
ledsSetNo(LedState::OFF);
statusPulse = false;
neopixel.clear();
neopixel.show();
}checkResetGesture function · cpp · L43-L92 (50 LOC)esp32-terminal/src/main.cpp
bool checkResetGesture() {
unsigned long now = millis();
// Encoder button is active LOW (pullup)
if (digitalRead(PIN_ENCODER_SW) == LOW) {
// Start tracking if not already
if (encoderBtnHeldSince == 0) {
encoderBtnHeldSince = now;
resetMessageShown = false;
Serial.println("Encoder button held - reset timer started");
}
unsigned long heldFor = now - encoderBtnHeldSince;
// After 3 seconds, show restart message
if (heldFor >= RESET_HOLD_MS && !resetMessageShown) {
Serial.println("Showing restart message...");
displayMessage("HOLD TO CONFIRM", "RESTARTING", "Release to cancel");
ledsSetYes(LedState::BRIGHT);
ledsSetNo(LedState::BRIGHT);
resetMessageShown = true;
}
// After 5 seconds total (3 + 2), perform restart
if (heldFor >= RESET_HOLD_MS + RESET_CONFIRM_MS) {
Serial.println("Restarting termionDisplayUpdate function · cpp · L95-L104 (10 LOC)esp32-terminal/src/main.cpp
void onDisplayUpdate(const DisplayState& state) {
currentDisplay = state;
displayDirty = true;
// Update button LEDs from display state
ledsSetFromDisplay(state);
// Update neopixel from game state
ledsSetGameState(state.statusLed);
}setup function · cpp · L105-L150 (46 LOC)esp32-terminal/src/main.cpp
void setup() {
// Initialize serial for debugging
Serial.begin(115200);
Serial.println();
Serial.println("=== Murderhouse ESP32 Terminal v" FIRMWARE_VERSION " ===");
// Initialize subsystems
Serial.println("Initializing display...");
displayInit();
displayConnectionStatus(ConnectionState::BOOT);
Serial.println("Initializing LEDs...");
ledsInit();
ledsSetStatus(ConnectionState::BOOT);
// Brief LED test at boot
Serial.println("Testing button LEDs...");
ledsSetYes(LedState::BRIGHT);
ledsSetNo(LedState::BRIGHT);
delay(500);
ledsSetYes(LedState::OFF);
ledsSetNo(LedState::OFF);
Serial.println("Initializing heart rate monitor...");
heartrateInit();
// Brief heartbeat LED test at boot
Serial.println("Testing heartbeat LED (D3)...");
digitalWrite(PIN_LED_HEARTBEAT, HIGH);
delay(500);
digitalWrite(PIN_LED_HEARTBEAT, LOW);
Serial.println("Initializing input...");
inputInit();
//loop function · cpp · L151-L491 (341 LOC)esp32-terminal/src/main.cpp
void loop() {
// Update LEDs (for pulse animations)
ledsUpdate();
// Update heart rate monitor (sampling + LED control)
heartrateUpdate();
// Periodically send heartbeat BPM to server
if (networkIsConnected()) {
unsigned long now2 = millis();
bool active = heartrateIsActive();
if (active && (now2 - lastHeartbeatSend >= HEARTBEAT_SEND_MS)) {
networkSendHeartbeat(heartrateGetBPM());
lastHeartbeatSend = now2;
lastHeartbeatActive = true;
} else if (!active && lastHeartbeatActive) {
// Send one final message with bpm=0 to clear
networkSendHeartbeat(0);
lastHeartbeatActive = false;
}
}
// Check for reset gesture (hold both buttons for 3 seconds)
if (checkResetGesture()) {
delay(10);
return; // Skip normal processing while reset is pending
}
// Handle player selection mode (before network is initialized)
if (!plagetRangeLabel function · cpp · L88-L95 (8 LOC)esp32-terminal/src/network.cpp
static const char* getRangeLabel(const char* word) {
char c = word[0];
if (c <= 'C') return "A-C";
if (c <= 'H') return "D-H";
if (c <= 'M') return "I-M";
if (c <= 'S') return "N-S";
return "T-Z";
}updateOperatorDisplay function · cpp · L96-L133 (38 LOC)esp32-terminal/src/network.cpp
static void updateOperatorDisplay() {
// Show "SENT!" briefly after a slide was dispatched (matches React Operator UX)
if (operatorSentTime > 0 && millis() - operatorSentTime < 2000) {
DisplayState state;
state.line2.text = "SENT!";
state.line2.style = DisplayStyle::CRITICAL;
state.leds.yes = LedState::OFF;
state.leds.no = LedState::OFF;
state.statusLed = GameLedState::NONE;
if (displayCallback != nullptr) displayCallback(state);
return;
}
DisplayState state;
const OpWord& entry = OP_FLAT[operatorFlatIdx];
// line1.left = committed sentence, line1.right = alphabetical range label when not ready
state.line1.left = operatorBuiltMsg;
state.line1.right = operatorReady ? "" : getRangeLabel(entry.word);
// line2 carries preview word and triggers operator rendering mode
state.line2.text = operatorReady ? "" : entry.word;
state.line2.style = DisplayStyle::OPERATOR;
/Repobility — same analyzer, your code, free for public repos · /scan/
networkSetPlayerId function · cpp · L134-L141 (8 LOC)esp32-terminal/src/network.cpp
void networkSetPlayerId(uint8_t playerNum) {
// Use just the number to match the web client format
snprintf(playerId, sizeof(playerId), "%d", playerNum);
isOperatorMode = false;
Serial.print("Player ID set to: ");
Serial.println(playerId);
}networkSetOperatorMode function · cpp · L142-L147 (6 LOC)esp32-terminal/src/network.cpp
void networkSetOperatorMode() {
isOperatorMode = true;
playerId[0] = '\0';
Serial.println("Operator mode set");
}networkIsOperatorMode function · cpp · L148-L151 (4 LOC)esp32-terminal/src/network.cpp
bool networkIsOperatorMode() {
return isOperatorMode;
}networkIsOperatorReady function · cpp · L152-L155 (4 LOC)esp32-terminal/src/network.cpp
bool networkIsOperatorReady() {
return operatorReady;
}networkInit function · cpp · L156-L168 (13 LOC)esp32-terminal/src/network.cpp
void networkInit() {
connState = ConnectionState::WIFI_CONNECTING;
// Start WiFi connection
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi: ");
Serial.println(WIFI_SSID);
Serial.print("Player ID: ");
Serial.println(playerId);
}networkSetDisplayCallback function · cpp · L169-L172 (4 LOC)esp32-terminal/src/network.cpp
void networkSetDisplayCallback(DisplayStateCallback callback) {
displayCallback = callback;
}networkUpdate function · cpp · L173-L309 (137 LOC)esp32-terminal/src/network.cpp
ConnectionState networkUpdate() {
unsigned long now = millis();
switch (connState) {
case ConnectionState::BOOT:
// Should not be here after init
connState = ConnectionState::WIFI_CONNECTING;
break;
case ConnectionState::WIFI_CONNECTING:
if (WiFi.status() == WL_CONNECTED) {
Serial.print("WiFi connected. IP: ");
Serial.println(WiFi.localIP());
if (serverHost[0] != '\0') {
// Already discovered server (reconnecting), go straight to WS
webSocket.begin(serverHost, serverPort, WS_PATH);
webSocket.onEvent(onWebSocketEvent);
webSocket.setReconnectInterval(WS_RECONNECT_MS);
connState = ConnectionState::WS_CONNECTING;
} else {
// Need to discover server first
udp.begin(DISCOVERY_PORT);
lastDiscoveryBnetworkRetryJoin function · cpp · L310-L330 (21 LOC)esp32-terminal/src/network.cpp
void networkRetryJoin() {
if (connState == ConnectionState::ERROR || connState == ConnectionState::RECONNECTING) {
Serial.println("Retrying join...");
lastError[0] = '\0'; // Clear error message
if (wsConnected) {
if (isOperatorMode) {
sendMessage(ClientMsg::OPERATOR_JOIN);
} else {
StaticJsonDocument<128> doc;
doc["playerId"] = playerId;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::JOIN, &payload);
}
connState = ConnectionState::JOINING;
} else {
connState = ConnectionState::RECONNECTING;
}
}
}Repobility · code-quality intelligence · https://repobility.com
networkIsConnected function · cpp · L331-L334 (4 LOC)esp32-terminal/src/network.cpp
bool networkIsConnected() {
return connState == ConnectionState::CONNECTED && wsConnected && gameJoined;
}sendMessage function · cpp · L335-L353 (19 LOC)esp32-terminal/src/network.cpp
static void sendMessage(const char* type, JsonObject* payload) {
StaticJsonDocument<256> doc;
doc["type"] = type;
if (payload != nullptr) {
doc["payload"] = *payload;
} else {
doc.createNestedObject("payload");
}
String json;
serializeJson(doc, json);
Serial.print("Sending: ");
Serial.println(json);
webSocket.sendTXT(json);
}networkSendSelectUp function · cpp · L354-L359 (6 LOC)esp32-terminal/src/network.cpp
void networkSendSelectUp() {
if (networkIsConnected()) {
sendMessage(ClientMsg::SELECT_UP);
}
}networkSendSelectDown function · cpp · L360-L365 (6 LOC)esp32-terminal/src/network.cpp
void networkSendSelectDown() {
if (networkIsConnected()) {
sendMessage(ClientMsg::SELECT_DOWN);
}
}networkSendSelectTo function · cpp · L366-L374 (9 LOC)esp32-terminal/src/network.cpp
void networkSendSelectTo(const char* targetId) {
if (networkIsConnected()) {
StaticJsonDocument<128> doc;
doc["targetId"] = targetId;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::SELECT_TO, &payload);
}
}networkSendConfirm function · cpp · L375-L380 (6 LOC)esp32-terminal/src/network.cpp
void networkSendConfirm() {
if (networkIsConnected()) {
sendMessage(ClientMsg::CONFIRM);
}
}networkSendConfirmWithTarget function · cpp · L381-L389 (9 LOC)esp32-terminal/src/network.cpp
void networkSendConfirmWithTarget(const char* targetId) {
if (networkIsConnected()) {
StaticJsonDocument<128> doc;
doc["targetId"] = targetId;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::CONFIRM, &payload);
}
}networkSendAbstain function · cpp · L390-L395 (6 LOC)esp32-terminal/src/network.cpp
void networkSendAbstain() {
if (networkIsConnected()) {
sendMessage(ClientMsg::ABSTAIN);
}
}Citation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
networkSendIdleScrollUp function · cpp · L396-L401 (6 LOC)esp32-terminal/src/network.cpp
void networkSendIdleScrollUp() {
if (networkIsConnected()) {
sendMessage(ClientMsg::IDLE_SCROLL_UP);
}
}networkSendIdleScrollDown function · cpp · L402-L407 (6 LOC)esp32-terminal/src/network.cpp
void networkSendIdleScrollDown() {
if (networkIsConnected()) {
sendMessage(ClientMsg::IDLE_SCROLL_DOWN);
}
}networkSendUseItem function · cpp · L408-L416 (9 LOC)esp32-terminal/src/network.cpp
void networkSendUseItem(const char* itemId) {
if (networkIsConnected()) {
StaticJsonDocument<128> doc;
doc["itemId"] = itemId;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::USE_ITEM, &payload);
}
}networkSendHeartbeat function · cpp · L417-L425 (9 LOC)esp32-terminal/src/network.cpp
void networkSendHeartbeat(uint8_t bpm) {
if (networkIsConnected()) {
StaticJsonDocument<128> doc;
doc["bpm"] = bpm;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::HEARTBEAT, &payload);
}
}networkGetLastError function · cpp · L426-L429 (4 LOC)esp32-terminal/src/network.cpp
const char* networkGetLastError() {
return lastError;
}onWebSocketEvent function · cpp · L430-L524 (95 LOC)esp32-terminal/src/network.cpp
static void onWebSocketEvent(WStype_t type, uint8_t* payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.println("WebSocket disconnected");
wsConnected = false;
gameJoined = false;
break;
case WStype_CONNECTED:
Serial.print("WebSocket connected to: ");
Serial.println((char*)payload);
wsConnected = true;
break;
case WStype_TEXT: {
Serial.print("Received: ");
Serial.println((char*)payload);
// Parse JSON message
StaticJsonDocument<4096> doc;
DeserializationError error = deserializeJson(doc, payload, length);
if (error) {
Serial.print("JSON parse error: ");
Serial.println(error.c_str());
return;
}
const char* msgType = doc["type"];
JsonObject msgPayload = doc["payload"];
/parsePlayerState function · cpp · L525-L590 (66 LOC)esp32-terminal/src/network.cpp
static void parsePlayerState(JsonObject& payload) {
// Check if display object exists
if (!payload.containsKey("display")) {
Serial.println("No display in player state");
return;
}
JsonObject display = payload["display"];
// Parse line1 (use | "" to handle null values)
JsonObject line1 = display["line1"];
currentDisplayState.line1.left = line1["left"] | "";
currentDisplayState.line1.right = line1["right"] | "";
// Parse line2
JsonObject line2 = display["line2"];
currentDisplayState.line2.text = line2["text"] | "";
currentDisplayState.line2.style = parseDisplayStyle(line2["style"] | "normal");
// Parse line3 (supports centered text, left/right, and left/center/right)
JsonObject line3 = display["line3"];
currentDisplayState.line3.text = line3["text"] | "";
currentDisplayState.line3.left = line3["left"] | "";
currentDisplayState.line3.center = line3["center"] | "";
currentDisplayState.line3.right parseOperatorState function · cpp · L591-L618 (28 LOC)esp32-terminal/src/network.cpp
static void parseOperatorState(JsonObject& payload) {
bool wasReady = operatorReady;
operatorReady = payload["ready"] | false;
// Update built message from server state
operatorBuiltMsg = "";
operatorLastWord = "";
operatorWordCount = 0;
JsonArray words = payload["words"];
if (!words.isNull()) {
for (JsonVariant word : words) {
if (operatorWordCount > 0) operatorBuiltMsg += " ";
String w = word.as<String>();
operatorBuiltMsg += w;
operatorLastWord = w; // keep overwriting to capture last
operatorWordCount++;
}
}
// Reset dial and show "SENT!" when a slide was dispatched (was ready → now empty)
if (wasReady && operatorWordCount == 0 && !operatorReady) {
operatorFlatIdx = 0;
operatorSentTime = millis();
}
updateOperatorDisplay();
}Source: Repobility analyzer · https://repobility.com
networkOperatorTick function · cpp · L621-L626 (6 LOC)esp32-terminal/src/network.cpp
void networkOperatorTick() {
if (operatorSentTime > 0 && millis() - operatorSentTime >= 2000) {
operatorSentTime = 0;
updateOperatorDisplay();
}
}networkOperatorScrollDown function · cpp · L627-L631 (5 LOC)esp32-terminal/src/network.cpp
void networkOperatorScrollDown() {
operatorFlatIdx = (operatorFlatIdx + 1) % OP_FLAT_SIZE;
updateOperatorDisplay();
}networkOperatorScrollUp function · cpp · L632-L636 (5 LOC)esp32-terminal/src/network.cpp
void networkOperatorScrollUp() {
operatorFlatIdx = (operatorFlatIdx - 1 + OP_FLAT_SIZE) % OP_FLAT_SIZE;
updateOperatorDisplay();
}networkSendOperatorAdd function · cpp · L637-L646 (10 LOC)esp32-terminal/src/network.cpp
void networkSendOperatorAdd() {
if (networkIsConnected()) {
const char* word = OP_FLAT[operatorFlatIdx].word;
StaticJsonDocument<64> doc;
doc["word"] = word;
JsonObject payload = doc.as<JsonObject>();
sendMessage(ClientMsg::OPERATOR_ADD, &payload);
}
}networkSendOperatorReady function · cpp · L647-L652 (6 LOC)esp32-terminal/src/network.cpp
void networkSendOperatorReady() {
if (networkIsConnected() && operatorWordCount > 0) {
sendMessage(ClientMsg::OPERATOR_READY);
}
}networkSendOperatorUnready function · cpp · L653-L658 (6 LOC)esp32-terminal/src/network.cpp
void networkSendOperatorUnready() {
if (networkIsConnected()) {
sendMessage(ClientMsg::OPERATOR_UNREADY);
}
}networkSendOperatorClear function · cpp · L659-L666 (8 LOC)esp32-terminal/src/network.cpp
void networkSendOperatorClear() {
operatorFlatIdx = 0;
updateOperatorDisplay();
if (networkIsConnected()) {
sendMessage(ClientMsg::OPERATOR_CLEAR);
}
}networkSendOperatorDelete function · cpp · L667-L682 (16 LOC)esp32-terminal/src/network.cpp
void networkSendOperatorDelete() {
// Jump dial to the position of the last committed word before deleting
if (operatorWordCount > 0) {
for (int i = 0; i < OP_FLAT_SIZE; i++) {
if (operatorLastWord == OP_FLAT[i].word) {
operatorFlatIdx = i;
break;
}
}
}
updateOperatorDisplay();
if (networkIsConnected()) {
sendMessage(ClientMsg::OPERATOR_DELETE);
}
}Repobility — same analyzer, your code, free for public repos · /scan/
parseLedState function · c · L61-L66 (6 LOC)esp32-terminal/src/protocol.h
inline LedState parseLedState(const String& state) {
if (state == "dim") return LedState::DIM;
if (state == "bright") return LedState::BRIGHT;
if (state == "pulse") return LedState::PULSE;
return LedState::OFF;
}parseDisplayStyle function · c · L82-L89 (8 LOC)esp32-terminal/src/protocol.h
inline DisplayStyle parseDisplayStyle(const String& style) {
if (style == "locked") return DisplayStyle::LOCKED;
if (style == "abstained") return DisplayStyle::ABSTAINED;
if (style == "waiting") return DisplayStyle::WAITING;
if (style == "critical") return DisplayStyle::CRITICAL;
if (style == "operator") return DisplayStyle::OPERATOR;
return DisplayStyle::NORMAL;
}parseGameLedState function · c · L108-L118 (11 LOC)esp32-terminal/src/protocol.h
inline GameLedState parseGameLedState(const String& state) {
if (state == "lobby") return GameLedState::LOBBY;
if (state == "day") return GameLedState::DAY;
if (state == "night") return GameLedState::NIGHT;
if (state == "voting") return GameLedState::VOTING;
if (state == "locked") return GameLedState::LOCKED;
if (state == "abstained") return GameLedState::ABSTAINED;
if (state == "dead") return GameLedState::DEAD;
if (state == "gameOver") return GameLedState::GAME_OVER;
return GameLedState::NONE;
}parseIconState function · c · L159-L164 (6 LOC)esp32-terminal/src/protocol.h
inline IconState parseIconState(const String& state) {
if (state == "active") return IconState::ACTIVE;
if (state == "inactive") return IconState::INACTIVE;
return IconState::EMPTY;
}DisplayState method · c · L222-L234 (13 LOC)esp32-terminal/src/protocol.h
DisplayState() {
line1.left = "CONNECTING";
line1.right = "";
line2.text = "...";
line2.style = DisplayStyle::NORMAL;
line3.text = "Please wait";
leds.yes = LedState::OFF;
leds.no = LedState::OFF;
statusLed = GameLedState::NONE;
idleScrollIndex = 0;
targetCount = 0;
selectionIndex = -1;
}getTeamDisplayName function · javascript · L18-L26 (9 LOC)server/definitions/events.js
function getTeamDisplayName(role) {
if (role?.id === RoleId.JESTER) return str('slides', 'death.teamJester');
const names = {
circle: str('slides', 'death.teamCircle'),
cell: str('slides', 'death.teamCell'),
neutral: str('slides', 'death.teamNeutral'),
};
return names[role?.team] || str('slides', 'death.teamUnknown');
}tallyVotes function · javascript · L29-L41 (13 LOC)server/definitions/events.js
function tallyVotes(results) {
const tally = {};
for (const [, targetId] of Object.entries(results)) {
if (targetId === null) continue;
tally[targetId] = (tally[targetId] || 0) + 1;
}
const isEmpty = Object.keys(tally).length === 0;
const maxVotes = isEmpty ? 0 : Math.max(...Object.values(tally));
const frontrunners = Object.keys(tally).filter(
(id) => tally[id] === maxVotes,
);
return { tally, maxVotes, frontrunners, isEmpty };
}checkRunoff function · javascript · L45-L59 (15 LOC)server/definitions/events.js
function checkRunoff(frontrunners, tally, runoffRound, eventName) {
if (frontrunners.length <= 1) return null;
if (runoffRound >= 3) {
const winnerId =
frontrunners[Math.floor(Math.random() * frontrunners.length)];
return { tieBreaker: true, winnerId, tally };
}
return {
success: true,
runoff: true,
frontrunners,
tally,
message: str('log', 'voteRunoffStarted', { event: eventName, count: frontrunners.length }),
};
}Repobility · code-quality intelligence · https://repobility.com
getRunoffTargets function · javascript · L62-L67 (6 LOC)server/definitions/events.js
function getRunoffTargets(eventId, game) {
const instance = game.activeEvents.get(eventId);
return instance?.runoffCandidates?.length > 0
? instance.runoffCandidates
: null;
}resolveCustomEventReward function · javascript · L1053-L1111 (59 LOC)server/definitions/events.js
function resolveCustomEventReward(winnerId, config, game, tally, wasTie) {
const winner = game.getPlayer(winnerId);
if (!winner) {
return {
success: false,
message: 'Winner not found',
};
}
let message = '';
let slideSubtitle = winner.name;
switch (config.rewardType) {
case 'item':
game.giveItem(winner.id, config.rewardParam);
message = str('log', 'customReward', { name: winner.name, reward: config.rewardParam });
slideSubtitle = `${winner.name} received ${config.rewardParam}`;
break;
case 'role':
const newRole = getRole(config.rewardParam);
if (newRole) {
winner.assignRole(newRole);
message = str('log', 'customRoleChange', { name: winner.name, role: newRole.name });
slideSubtitle = `${winner.name} is now ${newRole.name}`;
}
break;
case 'resurrection':
if (!winner.isAlive) {
game.revivePlayer(winner.id, 'vote');
message = str('log', 'customRevivgetEvent function · javascript · L1113-L1115 (3 LOC)server/definitions/events.js
export function getEvent(eventId) {
return events[eventId] || null;
}