| 650 | } |
| 651 | |
| 652 | void TitleCatalog::cartScan(void) |
| 653 | { |
| 654 | TitleCatalog& self = get(); |
| 655 | |
| 656 | bool oldCardIn; |
| 657 | FSUSER_CardSlotIsInserted(&oldCardIn); |
| 658 | |
| 659 | while (self.mDoCartScan.test_and_set()) { |
| 660 | bool cardIn = false; |
| 661 | |
| 662 | FSUSER_CardSlotIsInserted(&cardIn); |
| 663 | if (cardIn != oldCardIn) { |
| 664 | bool power; |
| 665 | FSUSER_CardSlotGetCardIFPowerStatus(&power); |
| 666 | if (cardIn) { |
| 667 | if (!power) { |
| 668 | FSUSER_CardSlotPowerOn(&power); |
| 669 | } |
| 670 | while (!power && self.mDoCartScan.test_and_set()) { |
| 671 | FSUSER_CardSlotGetCardIFPowerStatus(&power); |
| 672 | } |
| 673 | svcSleepThread(500'000'000); |
| 674 | for (size_t i = 0; i < 10; i++) { |
| 675 | if ((oldCardIn = self.scanCard())) { |
| 676 | break; |
| 677 | } |
| 678 | } |
| 679 | } |
| 680 | else { |
| 681 | FSUSER_CardSlotPowerOff(&power); |
| 682 | if (!self.mLoading) { |
| 683 | { |
| 684 | std::lock_guard<std::mutex> lock(self.mMutex); |
| 685 | if (!self.mSaves.empty() && self.mSaves.at(0).mediaType() == MEDIATYPE_GAME_CARD) { |
| 686 | self.mIcons.erase(self.mSaves.at(0).id()); |
| 687 | self.mSaves.erase(self.mSaves.begin()); |
| 688 | } |
| 689 | if (!self.mExtdatas.empty() && self.mExtdatas.at(0).mediaType() == MEDIATYPE_GAME_CARD) { |
| 690 | self.mIcons.erase(self.mExtdatas.at(0).id()); |
| 691 | self.mExtdatas.erase(self.mExtdatas.begin()); |
| 692 | } |
| 693 | } |
| 694 | self.mGeneration.fetch_add(1); |
| 695 | } |
| 696 | oldCardIn = false; |
| 697 | } |
| 698 | } |
| 699 | } |
| 700 | } |
| 701 | |
| 702 | void TitleCatalog::cartScanFlagTestAndSet(void) |
| 703 | { |