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(); }
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; } } } } }