Example #1
0
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);
}
Example #2
0
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);
				}
			}
		}
	}
}
Example #4
0
// 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;
}
Example #5
0
// 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;
}
Example #7
0
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;
}