예제 #1
0
	void insert(const T& value) {
		//printf("insert %d\n", value);
		AVLNode* parent = NULL;
		AVLNode** cur = &root_;
		while (*cur != NULL) {
			parent = *cur;
			int ret = compareFunction_(value, (*cur)->value);
			if (ret <= 0) {
				cur = &(*cur)->left;
			} else {
				cur = &(*cur)->right;
			}
		}
		*cur = newNode(value, parent);
		makeBalance(*cur);
		//checkValid();
	}
예제 #2
0
main(void)
{
	// Utility counter variables
	unsigned int i = 0;
	unsigned char j = 0;
	// Buffer used when generating output for the display
	char buf[16];

	// Perform setup of registers and peripherals
	setup();

	// Indicate setup done
	GREEN_ON;

	if (isButtonPressed())
	{
		wdt_disable();
		test();

		for (;;);
	}
	else
	{
		// Main loop and state machine
		for (;;)
		{
			wdt_reset();

			switch (state)
			{
				case starting:
				{
					// Start-up phase.
					// Do nothing in a bunch of clock cycles
					setStatus(L_STARTING, 0);
					setStatus("", 1);

					for (i = 0; i < 100; i++) 
					{
						wdt_reset();
						_delay_ms(10);
					}
					state = idle;
					first_step = 1;

					break;
				}
				case idle:
				{
					GREEN_ON;

					if (first_step)
					{
						first_step = 0;

						setStatus(L_SCAN_HERE, 0);
						setStatus("", 1);
					}
					
					if (RFID_IsCardPresent())
					{
						GREEN_OFF;
						first_step = 1;
						state = scanning;
					}

					break;
				}
				case scanning:
				{
					if (first_step)
					{
						first_step = 0;
						setStatus(L_WORKING, 0);
					}

					uint8_t n = RFID_GetCardId(current.card_id);
					if (n == -1) 
					{
						state = info;
						current.response.code = RESP_INVALID_CARD;
						first_step = 1;
					}
					else
					{
						if (!usbInterruptIsReady())
						{
							wdt_reset();
						}
						usbSetInterrupt(current.card_id, 8);

						first_step = 1;
						state = processing;
					}
					break;
				}
				case processing:
				{
					if (current.response.code != 0)
					{
						if (use_buzzer)
						{
							if (current.response.code == RESP_CHECKED_IN) 
							{
								speakerBeep(100);
							}
							else if (current.response.code == RESP_CHECKED_OUT)
							{
								speakerBeep(100);
								delay(50);
								speakerBeep(100);	
							}
							else 
							{
								speakerBeep(255);
							}
						}

						first_step = 1;
						state = info;
						
						break;
					}

					if (first_step)
					{
						i = j = 0;
						first_step = 0;
					}

					// When we have been in this state in 500.000 ticks,
					// we change the state to info, an set the response to error
					i++;
					if (i == 50000)
					{
						j++;
						if (j == 10)
						{
							state = info;
							current.response.code = 99;
							first_step = 1;
						}
					}
					
					break;
				}
				case info:
				{
					switch (current.response.code)
					{
						case RESP_CHECKED_IN:
						{
							setStatus(L_CHECK_IN, 0);
							makeBalance(buf);
							setStatus(buf, 1);

							break;
						}
						case RESP_CHECKED_OUT:
						{
							sprintf(buf, L_CHECK_OUT, current.response.price);
							setStatus(buf, 0);
							makeBalance(buf);
							setStatus(buf, 1);

							break;
						}
						case RESP_INSUFFICIENT_FUNDS:
						{
							setStatus(L_INSUFFICIENT_FUNDS, 0);
							makeBalance(buf);
							setStatus(buf, 1);

							break;
						}
						case RESP_CARD_NOT_FOUND:
						case RESP_INVALID_CARD:
						{
							setStatus(L_INVALID_CARD, 0);
							setStatus("", 1);

							break;
						}
						case RESP_TOO_LATE_CHECK_OUT:
						{
							setStatus(L_CHECK_OUT_TOO_LATE, 0);
							setStatus(L_LATE_CHECK_OUT_FEE, 1);

							break;
						}
						case RESP_OK:
						{
							setStatus(L_OK, 0);
							setStatus("", 1);

							break;
						}
						default: 
						{
							setStatus(L_SYSTEM_ERROR, 0);
							setStatus("", 1);

							break;
						}
					}

					// Stay here until the customer removes the card
					while ( RFID_IsCardPresent() ) 
					{
						wdt_reset();
					}

					state = idle;
					first_step = 1;

					current.response.code = 0;
					memset(current.card_id, 0, 8);
					
					for (i = 0; i < 150; i++) 
					{
						wdt_reset();
						_delay_ms(10);
					}

					break;
				}
				case no_connection:
				{
					GREEN_OFF;

					if (first_step)
					{
						first_step = 0;

						setStatus(L_OUT_OF_ORDER, 0);
						setStatus("", 1);
					}

					break;
				}
			}
		}
	}	
}