diff --git a/m5stick-nemo.ino b/m5stick-nemo.ino index 2f29c14..2d9dc47 100644 --- a/m5stick-nemo.ino +++ b/m5stick-nemo.ino @@ -16,12 +16,37 @@ String timeStamp; // globals for passing bluetooth info between routines // AppleJuice Payload Data uint8_t Airpods[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x02, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t AirpodsPro[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x0e, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t AirpodsMax[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x0a, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t AirpodsGen2[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x0f, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t AirpodsGen3[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x13, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t AirpodsProGen2[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x14, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t PowerBeats[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x03, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t PowerBeatsPro[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x0b, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsSoloPro[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x0c, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsStudioBuds[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x11, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsFlex[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x10, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t BeatsX[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x05, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsSolo3[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x06, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsStudio3[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x09, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t BeatsStudioPro[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x17, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsFitPro[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x12, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t BeatsStudioBudsPlus[31] = {0x1e, 0xff, 0x4c, 0x00, 0x07, 0x19, 0x07, 0x16, 0x20, 0x75, 0xaa, 0x30, 0x01, 0x00, 0x00, 0x45, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +uint8_t AppleTVSetup[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x01, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVPair[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x06, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVNewUser[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x20, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVAppleIDSetup[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x2b, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVWirelessAudioSync[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0xc0, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVHomekitSetup[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x0d, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVKeyboard[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x13, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t AppleTVConnectingToNetwork[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x27, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t HomepodSetup[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x0b, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t SetupNewPhone[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x09, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t TransferNumber[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x02, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; +uint8_t TVColorBalance[23] = {0x16, 0xff, 0x4c, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xc1, 0x1e, 0x60, 0x4c, 0x95, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}; uint8_t* data; +int deviceType = 0; + BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); BLEAdvertising *pAdvertising; @@ -506,21 +531,53 @@ void setup() { MENU ajmenu[] = { { "AirPods", 1}, - { "AirPodsGen3", 2}, - { "AirPodsProGen2", 3}, - { "PowerBeats", 4}, - { "Beats X", 5}, - { "BeatsStudioPro", 6}, - { "back", 7}, + { "AirPods Pro", 2}, + { "AirPods Max", 3}, + { "AirPods G2", 4}, + { "AirPods G3", 5}, + { "AirPods Pro G2", 6}, + { "PowerBeats", 7}, + { "PowerBeats Pro", 8}, + { "Beats Solo Pro", 9}, + { "Beats Studio Buds", 10}, + { "Beats Flex", 11}, + { "Beats X", 12}, + { "Beats Solo 3", 13}, + { "Beats Studio 3", 14}, + { "Beats Studio Pro", 15}, + { "Beats Fit Pro", 16}, + { "Beats Studio Buds+", 17}, + { "AppleTV Setup", 18}, + { "AppleTV Pair", 19}, + { "AppleTV New User", 20}, + { "AppleTV AppleID", 21}, + { "AppleTV Audio", 22}, + { "AppleTV HomeKit", 23}, + { "AppleTV Keyboard", 24}, + { "AppleTV Network", 25}, + { "TV Color Balance", 26}, + { "Transfer Number", 27}, + { "Setup New Phone", 28}, + { "back", 29}, }; void aj_drawmenu() { + M5.Lcd.setRotation(rotation); M5.Lcd.setTextSize(2); M5.Lcd.fillScreen(BLACK); - M5.Lcd.setCursor(0, 8, 1); - for ( int i = 0 ; i < ( sizeof(ajmenu) / sizeof(MENU) ) ; i++ ) { - M5.Lcd.print((cursor == i) ? ">" : " "); - M5.Lcd.println(ajmenu[i].name); + M5.Lcd.setCursor(0, 5, 1); + // scrolling menu + if (cursor > 5) { + for ( int i = 0 + (cursor - 5) ; i < ( sizeof(ajmenu) / sizeof(MENU) ) ; i++ ) { + M5.Lcd.print((cursor == i) ? ">" : " "); + M5.Lcd.println(ajmenu[i].name); + } + } else { + for ( + int i = 0 ; i < ( sizeof(ajmenu) / sizeof(MENU) ) ; i++ ) { + M5.Lcd.print((cursor == i) ? ">" : " "); + M5.Lcd.println(ajmenu[i].name); + } } } @@ -544,7 +601,7 @@ void aj_loop(){ delay(250); } if (digitalRead(M5_BUTTON_HOME) == LOW) { - int deviceType = ajmenu[cursor].command; + deviceType = ajmenu[cursor].command; // Also borrowed heavily from ronaldstoner / ECTO-1A esp32 AppleJuice //uint8_t* data; switch(deviceType) { @@ -552,21 +609,87 @@ void aj_loop(){ data = Airpods; break; case 2: - data = AirpodsGen3; + data = AirpodsPro; break; case 3: - data = AirpodsProGen2; + data = AirpodsMax; break; case 4: - data = PowerBeats; + data = AirpodsGen2; break; case 5: - data = BeatsX; + data = AirpodsGen3; break; case 6: - data = BeatsStudioPro; + data = AirpodsProGen2; break; case 7: + data = PowerBeats; + break; + case 8: + data = PowerBeatsPro; + break; + case 9: + data = BeatsSoloPro; + break; + case 10: + data = BeatsStudioBuds; + break; + case 11: + data = BeatsFlex; + break; + case 12: + data = BeatsX; + break; + case 13: + data = BeatsSolo3; + break; + case 14: + data = BeatsStudio3; + break; + case 15: + data = BeatsStudioPro; + break; + case 16: + data = BeatsFitPro; + break; + case 17: + data = BeatsStudioBudsPlus; + break; + case 18: + data = AppleTVSetup; + break; + case 19: + data = AppleTVPair; + break; + case 20: + data = AppleTVNewUser; + break; + case 21: + data = AppleTVAppleIDSetup; + break; + case 22: + data = AppleTVWirelessAudioSync; + break; + case 23: + data = AppleTVHomekitSetup; + break; + case 24: + data = AppleTVKeyboard; + break; + case 25: + data = AppleTVConnectingToNetwork; + break; + case 26: + data = TVColorBalance; + break; + case 27: + data = TransferNumber; + break; + case 28: + data = SetupNewPhone; + break; + case 29: rstOverride = false; isSwitching = true; current_proc = 1; @@ -584,18 +707,6 @@ void aj_loop(){ M5.Lcd.print("\n\nHold Side Key: Exit"); isSwitching = true; current_proc = 9; // Jump over to the AppleJuice BLE beacon loop -// while(true) { -// // of the background stuff easier (menu button, dimmer, etc) -// BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); -// oAdvertisementData.addData(std::string((char*)data, sizeof(Airpods))); -// pAdvertising->setAdvertisementData(oAdvertisementData); -// pAdvertising->start(); -// digitalWrite(M5_LED, LOW); //LED ON on Stick C Plus -// delay(50); -// digitalWrite(M5_LED, HIGH); //LED OFF on Stick C Plus -// delay(950); // 1 second between beacons when combined with LED On delay above for brightness -// pAdvertising->stop(); -// } } } } @@ -609,7 +720,11 @@ void aj_adv(){ // Isolating this to its own process lets us take advantage // of the background stuff easier (menu button, dimmer, etc) BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); - oAdvertisementData.addData(std::string((char*)data, sizeof(Airpods))); + if (deviceType >= 18){ + oAdvertisementData.addData(std::string((char*)data, sizeof(AppleTVPair))); + } else { + oAdvertisementData.addData(std::string((char*)data, sizeof(Airpods))); + } pAdvertising->setAdvertisementData(oAdvertisementData); pAdvertising->start(); digitalWrite(M5_LED, LOW); //LED ON on Stick C Plus