void MarketScene::initButton() { CCMenuItemImage *pMenuItem = CCMenuItemImage::create(s_pMenuItemBack.charMapFile, s_pMenuItemBack.charMapFilePress, this, menu_selector(MarketScene::buttonCallback)); if (NULL != pMenuItem) { pMenuItem->setAnchorPoint(ccp(1,1)); pMenuItem->setPosition(SCREEN); pMenuItem->setTag(BTN_CLOSE); } CCMenu *pMenu = CCMenu::create(pMenuItem, NULL); if (NULL != pMenu) { pMenu->setPosition(CCPointZero); addChild(pMenu); pMenu->setTag(TAG_MENU); } pMenuItem = CCMenuItemImage::create(s_pMenuItemBuy.charMapFile, s_pMenuItemBuy.charMapFilePress, s_pBuyDisable, this, menu_selector(MarketScene::buttonCallback)); pMenuItem->setAnchorPoint(ccp(0.5f, 0.5f)); pMenuItem->setPosition(ccp(CENTER.x, 120)); pMenuItem->setTag(BTN_BUY); pMenu->addChild(pMenuItem); char szFileName[32] = { 0 }; char szFileName2[32] = { 0 }; char szFileName3[32] = { 0 }; for (int i = 0; i < CARD_COUNT; i++) { sprintf(szFileName, s_pathCard.charMapFile, i); sprintf(szFileName2, s_pathCard.charMapFilePress, i); sprintf(szFileName3, s_pathCardDisable, i); CCMenuItemImage *pItem0 = CCMenuItemImage::create(szFileName, szFileName2, szFileName3); CCMenuItemImage *pItem1 = CCMenuItemImage::create(szFileName2, szFileName); CCMenuItemToggle *pToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(MarketScene::buttonCallback), pItem0, pItem1, NULL); pToggle->setPosition(ccp(120 * i + s_pathCard.m_Position.x, s_pathCard.m_Position.y)); pToggle->setTag(BTN_CARD + i); if (g_Control.cards[i] > 0) { CCSprite *sprite = CCSprite::create(s_pathCardbuy.m_strPath); sprite->setPosition(s_pathCardbuy.m_Position); pToggle->addChild(sprite, TAG_CARD_BUY, TAG_CARD_BUY); } pMenu->addChild(pToggle); } checkCard(BTN_CARD); }
void MarketScene::buttonCallback(CCNode *pNode) { switch (pNode->getTag()) { case BTN_BUY: buyCard(pNode); break; case BTN_CLOSE: CCDirector::sharedDirector()->replaceScene(StartScene::create()); break; default: checkCard(pNode->getTag()); break; } }
uint8_t Immobiliser::scanCard() { uint8_t status; //RFID reader status //clearing scannedCard field for(uint8_t i=0; i<bufferSize; i++) scannedCard[i] = 0; //scanning until card is found while (1) { status = reader->MFRC522_Request(PICC_REQIDL, scannedCard); if (status == MI_OK) { status = reader->MFRC522_Anticoll(scannedCard); if (status == MI_OK) { if (checkCard(scannedCard) == MI_OK) { return checkCardData(scannedCard); } } } } }
// Create a Gltx bool QuasarDB::create(Gltx& gltx) { // Can't create transaction before close date Company company; lookup(company); QDate startOfYear = company.startOfYear(); if (!company.closeDate().isNull()) { if (gltx.postDate() <= company.closeDate()) return error("Can't create transaction before close date"); } if (!startOfYear.isNull() && company.lastYearClosed()) { if (gltx.postDate() < startOfYear) return error("Can't post to last year"); } // Verify station/employee are specified if (company.shiftMethod() == Company::BY_STATION) { if (gltx.stationId() == INVALID_ID) { // Error if its a transaction type involving cashrec switch (gltx.dataType()) { case DataObject::INVOICE: case DataObject::RECEIPT: case DataObject::NOSALE: case DataObject::PAYOUT: case DataObject::RETURN: case DataObject::SHIFT: case DataObject::TEND_ADJUST: case DataObject::WITHDRAW: return error("A station is required"); default: break; } } } if (company.shiftMethod() == Company::BY_EMPLOYEE) { if (gltx.employeeId() == INVALID_ID) { // Error if its a transaction type involving cashrec switch (gltx.dataType()) { case DataObject::INVOICE: case DataObject::RECEIPT: case DataObject::NOSALE: case DataObject::PAYOUT: case DataObject::RETURN: case DataObject::SHIFT: case DataObject::TEND_ADJUST: case DataObject::WITHDRAW: return error("An employee is required"); default: break; } } } // Check shift is not posted if set if (gltx.shiftId() != INVALID_ID) { Shift shift; lookup(gltx.shiftId(), shift); if (shift.shiftId() != INVALID_ID) return error("Can't post to a posted shift"); } // Check that change data exists and create if needed checkAccount(gltx); checkCard(gltx); checkItem(gltx); // Auto allocate transaction number if (gltx.number().stripWhiteSpace() == "#") { fixed number = uniqueTxNumber(gltx.dataType()); gltx.setNumber(number.toString()); } QString cmd = insertCmd("gltx", "gltx_id", "number,reference_str," "post_date,post_time,memo,station_id," "employee_id,card_id,store_id,shift_id," "link_id,printed,paid,amount,data_type"); Stmt stmt(_connection, cmd); insertData(gltx, stmt); stmtSetString(stmt, gltx.number()); stmtSetString(stmt, gltx.reference()); stmtSetDate(stmt, gltx.postDate()); stmtSetTime(stmt, gltx.postTime()); stmtSetString(stmt, gltx.memo()); stmtSetId(stmt, gltx.stationId()); stmtSetId(stmt, gltx.employeeId()); stmtSetId(stmt, gltx.cardId()); stmtSetId(stmt, gltx.storeId()); stmtSetId(stmt, gltx.shiftId()); stmtSetId(stmt, gltx.linkId()); stmtSetBool(stmt, gltx.printed()); stmtSetBool(stmt, false); stmtSetFixed(stmt, gltx.total()); stmtSetInt(stmt, gltx.dataType()); execute(stmt); sqlCreateLines(gltx); if (!startOfYear.isNull() && gltx.postDate() < startOfYear && gltx.isActive()) { Store store; if (!lookup(gltx.storeId(), store)) return false; Gltx orig, transfer; if (!lookup(store.yearEndTransferId(), transfer)) return false; orig = transfer; fixed total = 0.0; for (unsigned int i = 0; i < gltx.accounts().size(); ++i) { Account account; lookup(gltx.accounts()[i].account_id, account); if (account.type() < Account::Income) continue; AccountLine line; line.account_id = account.id(); line.amount = -gltx.accounts()[i].amount; transfer.accounts().push_back(line); total += line.amount; } if (total != 0.0) { AccountLine line; line.account_id = company.retainedEarnings(); line.amount = -total; transfer.accounts().push_back(line); } if (transfer != orig) if (!update(orig, transfer)) return false; } return true; }
// Update a Gltx bool QuasarDB::update(const Gltx& orig, Gltx& gltx) { if (gltx.number() == "#") return error("Can't change number to '#'"); if (orig.dataType() != gltx.dataType()) { bool allowed = false; switch (orig.dataType()) { case DataObject::INVOICE: if (gltx.dataType() == DataObject::RETURN) allowed = true; break; case DataObject::RETURN: if (gltx.dataType() == DataObject::INVOICE) allowed = true; break; case DataObject::RECEIVE: if (gltx.dataType() == DataObject::CLAIM) allowed = true; break; case DataObject::CLAIM: if (gltx.dataType() == DataObject::RECEIVE) allowed = true; break; default: break; } if (!allowed) return error("Can't change data type"); } // Can't void or unvoid reconciled or shift posted transaction if (orig.isActive() != gltx.isActive()) { for (unsigned int i = 0; i < gltx.accounts().size(); ++i) if (!gltx.accounts()[i].cleared.isNull()) return error("Can't change reconciled transaction"); if (gltx.shiftId() != INVALID_ID) { Shift shift; lookup(gltx.shiftId(), shift); if (shift.shiftId() != INVALID_ID) return error("Can't change transaction from a posted shift"); } } // If shift changed, neither can be posted if (orig.shiftId() != gltx.shiftId()) { if (orig.shiftId() != INVALID_ID) { Shift shift; lookup(orig.shiftId(), shift); if (shift.shiftId() != INVALID_ID) return error("Can't change from a posted shift"); } if (gltx.shiftId() != INVALID_ID) { Shift shift; lookup(gltx.shiftId(), shift); if (shift.shiftId() != INVALID_ID) return error("Can't insert into a posted shift"); } } // Can't change tenders if in a posted shift if (gltx.shiftId() != INVALID_ID && orig.tenders() != gltx.tenders()) { Shift shift; lookup(gltx.shiftId(), shift); if (shift.shiftId() != INVALID_ID) return error("Can't change tenders if posted"); } // Reconcile information must match. Also copy over cleared date // when needed since it can be lost on changed transactions. for (unsigned int i = 0; i < orig.accounts().size(); ++i) { const AccountLine& line = orig.accounts()[i]; if (line.cleared.isNull()) continue; if (i >= gltx.accounts().size()) return error("Invalid change to reconciled transaction"); if (gltx.accounts()[i].account_id != line.account_id) return error("Invalid change to reconciled transaction"); if (gltx.accounts()[i].amount != line.amount) return error("Invalid change to reconciled transaction"); gltx.accounts()[i].cleared = line.cleared; } // Can't change transaction before close date Company company; lookup(company); if (!company.closeDate().isNull()) { if (gltx.postDate() <= company.closeDate()) return error("Can't change date to before close date"); if (orig.postDate() <= company.closeDate()) return error("Can't change transaction before close date"); } if (!company.startOfYear().isNull()) { if (gltx.postDate() < company.startOfYear()) return error("Can't change date into last year"); if (orig.postDate() < company.startOfYear()) return error("Can't change transaction in last year"); } // Verify station/employee are specified if (company.shiftMethod() == Company::BY_STATION) { if (gltx.stationId() == INVALID_ID) { // Error if its a transaction type involving cashrec switch (gltx.dataType()) { case DataObject::INVOICE: case DataObject::RECEIPT: case DataObject::NOSALE: case DataObject::PAYOUT: case DataObject::RETURN: case DataObject::SHIFT: case DataObject::TEND_ADJUST: case DataObject::WITHDRAW: return error("A station is required"); default: break; } } } if (company.shiftMethod() == Company::BY_EMPLOYEE) { if (gltx.employeeId() == INVALID_ID) { // Error if its a transaction type involving cashrec switch (gltx.dataType()) { case DataObject::INVOICE: case DataObject::RECEIPT: case DataObject::NOSALE: case DataObject::PAYOUT: case DataObject::RETURN: case DataObject::SHIFT: case DataObject::TEND_ADJUST: case DataObject::WITHDRAW: return error("An employee is required"); default: break; } } } // Check that change data exists and create if needed checkAccount(gltx); checkCard(gltx); checkItem(gltx); // NOTE: this doesn't include paid and shouldn't QString cmd = updateCmd("gltx", "gltx_id", "number,reference_str," "post_date,post_time,memo,station_id," "employee_id,card_id,store_id,shift_id," "link_id,printed,amount,data_type"); Stmt stmt(_connection, cmd); updateData(orig, gltx, stmt); stmtSetString(stmt, gltx.number()); stmtSetString(stmt, gltx.reference()); stmtSetDate(stmt, gltx.postDate()); stmtSetTime(stmt, gltx.postTime()); stmtSetString(stmt, gltx.memo()); stmtSetId(stmt, gltx.stationId()); stmtSetId(stmt, gltx.employeeId()); stmtSetId(stmt, gltx.cardId()); stmtSetId(stmt, gltx.storeId()); stmtSetId(stmt, gltx.shiftId()); stmtSetId(stmt, gltx.linkId()); stmtSetBool(stmt, gltx.printed()); stmtSetFixed(stmt, gltx.total()); stmtSetInt(stmt, gltx.dataType()); stmtSetId(stmt, orig.id()); stmtSetInt(stmt, orig.version()); execute(stmt); if (stmt.getUpdateCount() != 1) return error("Data has been changed by another user"); sqlDeleteLines(orig); sqlCreateLines(gltx); return true; }
uint8_t Immobiliser::addCard() { uint8_t rfidStatus; //RFID reader status uint8_t cardStatus = AddSuccess; //Card operations status FLASH_Status flashStatus; //FLASH operations status uint8_t buffer[bufferSize]={0}; //card ID buffer rfidStatus = reader->MFRC522_Request(PICC_REQIDL, buffer); if (rfidStatus == MI_OK) { rfidStatus = reader->MFRC522_Anticoll(buffer); if (rfidStatus == MI_OK && cardsNumber != maxCards) cardStatus = writeCardData(buffer); //writing key and data else return AddFailed; if (cardStatus == AddSuccess) { flashStatus = FLASH_COMPLETE; FLASH_Unlock(); //unlocking FLASH for writing //erasing data from FLASH flashStatus = FLASH_EraseSector(flashSector, VoltageRange_3); flashStatus = FLASH_WaitForLastOperation(); if (flashStatus != FLASH_COMPLETE) { FLASH_Lock(); return AddFailed; } //FLASH configuration FLASH->CR &= CR_PSIZE_MASK; FLASH->CR |= FLASH_PSIZE_BYTE; //setting data size to bytes FLASH->CR |= FLASH_CR_PG; //checking if card already exists in FLASH if (checkCard(buffer) != CheckCorrect) { //writing new card to cards array for (uint8_t i=0; i<bufferSize; ++i) cards[cardsNumber][i] = buffer[i]; cardsNumber++; } else cardStatus = AddExists; //writing cards number to FLASH FLASH_AT(0) = cardsNumber; flashStatus = FLASH_WaitForLastOperation(); if (flashStatus != FLASH_COMPLETE) return AddFailed; //writing all cards to FLASH (also empty rows in array) for (uint8_t i=0; i<maxCards; ++i) { for (uint8_t j=0; j<bufferSize; ++j) { FLASH_AT(1 + i * bufferSize + j) = cards[i][j]; flashStatus = FLASH_WaitForLastOperation(); if (flashStatus != FLASH_COMPLETE) return AddFailed; } } FLASH->CR &= (~FLASH_CR_PG); FLASH_Lock(); //locking FLASH for writing return cardStatus; } } return AddFailed; }
int main(int argc, char* args[]) { int mouse_x; int mouse_y; Player player_1[1]; //spelarens riktiga kort Player player_2[1]; Player player_3[1]; Player player_4[1]; SDL_Event e; int my_turn = 1; //lås om jag kan klicka på mina kort eller ej. int cardNr = -1; bool click = false; bool quit = false; bool picked[13] = {false}; bool winner = true; int turn = 0; int leadCard = 0; //färgen som startade ska man följa. bool brokenHeart = false; int next_player = 0; SDL_Rect position_1[13]; //positionen för korten till spelaren SDL_Rect position_2[13]; SDL_Rect position_3[13]; SDL_Rect position_4[13]; SDL_Rect advertism_pos[1]; SDL_Rect dropzone_pos[1]; SDL_Rect initial_pos[1]; //temp var SDL_Rect played_pos[4]; //koordinaterna för spelade kort initial_pos[0].y = RES_Y-HEIGHT; //korten man börjar med ligger alltid på samma höjd.. botten minus höjden på kortet. if (init()) { printf("init worked\n"); } button help = createButton(0,0,20,20,"help.png",gRenderer); initSpritePosition(position_1,position_2,position_3,position_4,advertism_pos,dropzone_pos,played_pos); loadMediaAdvertisment(advertisment, gRenderer, gSpriteClipsAdvertisment); loadMediaDropzone(dropzone, gRenderer, gSpriteClipsDropzone); position(player_1,player_2,player_3,player_4); //Även absoluta platsen måste med som man får av server vid anslutning while(!quit) { while(turn < 13 && !quit) { if(winner) //om runda är klar och någon vunnit, ladda nya kort. { resetTurn(player_1,player_2,player_3,player_4); winner = false; loadCard(player_1, player_2, player_3, player_4); //kortet som delas ut // for(int i=0; i<13; i++) // { // printf("kort: %i , suit: %i \n", i, player_1[0].game_hand[i].suit); // } for(int i=0; i<13; i++) { loadMediaBack(i, card_2, card_3, card_4, gRenderer, gSpriteClipsBack); if(player_1[0].game_hand[i].suit == 0){ loadMediaClubs(player_1[0].game_hand[i].value, card, gRenderer, gSpriteClipsClubs); } else if(player_1[0].game_hand[i].suit == 1){ loadMediaDiamonds(player_1[0].game_hand[i].value, card, gRenderer, gSpriteClipsDiamonds); } else if(player_1[0].game_hand[i].suit == 2){ loadMediaHearts(player_1[0].game_hand[i].value, card, gRenderer, gSpriteClipsHearts); } else if(player_1[0].game_hand[i].suit == 3){ loadMediaSpades(player_1[0].game_hand[i].value, card, gRenderer, gSpriteClipsSpades); } else{ printf("error, unvalid card."); return 1; } } } while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } else if(e.type == SDL_MOUSEBUTTONDOWN) { if(e.button.button == SDL_BUTTON_LEFT) { mouse_x = e.button.x; mouse_y = e.button.y; if((mouse_x < advertism_pos[0].w+advertism_pos[0].x && mouse_x > advertism_pos[0].x) && (mouse_y < advertism_pos[0].h+advertism_pos[0].y && mouse_y> advertism_pos[0].y)) { openWeb(); } } } else if(e.type == SDL_MOUSEMOTION) { if(my_turn) //ska endast gå att flytta korten om det är min tur { if (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_LEFT)) { mouse_x=e.button.x; mouse_y=e.button.y; if(click == false) { cardNr = liftCard(initial_pos, position_1, mouse_x, mouse_y, picked); click = true; } if(cardNr >-1) { mouse_x = e.motion.x; mouse_y = e.motion.y; moveCard(position_1, cardNr, mouse_x, mouse_y); } } } } else { click = false; } if(click == false && cardNr >-1) //cardNr> -1 måste finnas för att undvika en bugg att baksidan laddas hos spelaren och blockerar kort. { if(((position_1[cardNr].x + WIDTH/2 > dropzone_pos[0].x) && (position_1[cardNr].x + WIDTH/2 < dropzone_pos[0].x+dropzone_pos[0].w))&&((position_1[cardNr].y + HEIGHT/2 > dropzone_pos[0].y) && (position_1[cardNr].y + HEIGHT/2 < dropzone_pos[0].y + dropzone_pos[0].h))) { position_1[cardNr].x = played_pos[0].x; //droppas in på exakt plats position_1[cardNr].y = played_pos[0].y; //droppas in på exakt plats if(checkCard(player_1, cardNr, leadCard, brokenHeart, picked, turn, next_player)) { sendCard(player_1, cardNr); turn++; printf("turn %i\n",turn); cardNr = -1; } else //om kortet inte fick läggas i mitten { position_1[cardNr].x = initial_pos[0].x; position_1[cardNr].y = initial_pos[0].y; picked[cardNr] = false; } } else // { position_1[cardNr].x = initial_pos[0].x; position_1[cardNr].y = initial_pos[0].y; } } } SDL_SetRenderDrawColor(gRenderer, 0x0D, 0x63, 0x02, 0xFF); //0D 63 02 SDL_RenderClear(gRenderer); SDL_RenderCopy(gRenderer, dropzone[0], &gSpriteClipsDropzone[0], &dropzone_pos[0] ); SDL_RenderCopy(gRenderer, help.texture,NULL, &help.rect); // for(int i=0 ; i<4; i++) // { // SDL_RenderCopy(gRenderer, card[i], &gSpriteClipsHearts[i],&played_pos[i]); // } for(int i = 0; i < 13 ; i++ ) //Renderar spelarens egna kort { if(player_1[0].game_hand[i].suit == 0 ) SDL_RenderCopy(gRenderer, card[i], &gSpriteClipsClubs[player_1[0].game_hand[i].value],&position_1[i] ); else if(player_1[0].game_hand[i].suit == 1 ) SDL_RenderCopy(gRenderer, card[i], &gSpriteClipsDiamonds[player_1[0].game_hand[i].value],&position_1[i] ); else if(player_1[0].game_hand[i].suit == 2 ) SDL_RenderCopy(gRenderer, card[i], &gSpriteClipsHearts[player_1[0].game_hand[i].value],&position_1[i] ); else if(player_1[0].game_hand[i].suit == 3 ) SDL_RenderCopy(gRenderer, card[i], &gSpriteClipsSpades[player_1[0].game_hand[i].value],&position_1[i] ); else continue; } for(int i = 0; i < 13 - player_2[0].turn ; i++ ){ //Renderar baksida kort till vänster SDL_RenderCopy(gRenderer, card_2[i], &gSpriteClipsBack[0],&position_2[i] ); } for(int i = 0; i < 13 - player_3[0].turn ; i++ ){ //Renderar baksida kort mittemot SDL_RenderCopy(gRenderer, card_3[i], &gSpriteClipsBack[0],&position_3[i] ); } for(int i = 0; i < 13 - player_4[0].turn ; i++ ){ //Renderar baksida kort höger SDL_RenderCopy(gRenderer, card_4[i], &gSpriteClipsBack[0],&position_4[i] ); } SDL_RenderCopy(gRenderer, advertisment[0], &gSpriteClipsAdvertisment[0],&advertism_pos[0] ); SDL_RenderPresent(gRenderer); } winner = true; turn = 0; } return 0; }