// Tokenizer::skip_line_comment: Skips a '//' comment void Tokenizer::skip_line_comment() { while (current[0] != '\n' && current[0] != 13) { if (!increment_current()) return; } increment_current(); }
// Tokenizer::skip_multiline_comment: Skips a '/* ... */' comment void Tokenizer::skip_multiline_comment() { while (!(current[0] == '*' && current[1] == '/')) { if (!increment_current()) return; } // Skip the ending '*/' increment_current(); increment_current(); }
// Tokenizer::get_token: Gets the next 'token' from the text // ------------------------------------------------------ >> string Tokenizer::get_token() { string ret_str = ""; bool ready = false; // Increment pointer to next token while (!ready) { ready = true; // Increment pointer until non-whitespace is found while (is_whitespace(current[0])) { if (!increment_current()) { ret_str = "!END"; return ret_str; } } // Check if we have a line comment if (current[0] == '/' && current[1] == '/') { skip_line_comment(); // Skip it ready = false; } // Check if we have a multiline comment if (current[0] == '/' && current[1] == '*') { skip_multiline_comment(); // Skip it ready = false; } // Check for end of text if (position == size) { ret_str = "!END"; return ret_str; } } // Check for literal string (enclosed with "") if (current[0] == '\"') { // Skip opening " increment_current(); // Read literal string (include whitespace) while (current[0] != '\"') { ret_str += current[0]; if (!increment_current()) return ret_str; } // Skip closing " increment_current(); } else { // Read token (don't include whitespace while (!is_whitespace(current[0])) { ret_str += current[0]; if (!increment_current()) return ret_str; } } return ret_str; }
int main(void) { uint32_t start_time; uint32_t end_time; uint16_t max_current; uint16_t max_voltage; uint8_t on_off = 0; const button_status_t* bstatus; // safety delay _delay_ms(200); load_fuses_from_eeprom(&max_current,&max_voltage); systime_init(); sound_init(); uart_init(); ui_measure_init(); buttons_init(); lcd_init(); sei(); lcd_write("abcdefghijklmnop","ABCDEFGHIJKLMNOP"); dbg_trace1("Project name: %s\r\n", FIRMWARE_NAME); dbg_trace1("Version: %s\r\n", FIRMWARE_VERSION); dbg_trace1("Last update date: %s\r\n", FIRMWARE_LAST_UPDATE_DATE); dbg_trace1("Last update time: %s\r\n", FIRMWARE_LAST_UPDATE_TIME); dbg_trace1("Author: %s\r\n\r\n", FIRMWARE_AUTHOR); dbg_trace1("Maximal current is: %u\r\n", max_current); dbg_trace1("Maximal voltage is: %u\r\n\r\n", max_voltage); sound_play_intro(); start_time = systime_get_time(); end_time = start_time + 100; while (1) { if ((bstatus = buttons_routine(&bstatus))) { if (bstatus->butt1_redge) { increment_current(&max_current); sound_beep_high(); store_fuses_to_eeprom(max_current,max_voltage); dbg_trace1("current fuse set to %u mA\n", max_current); } else if (bstatus->butt2_redge) { decrement_current(&max_current); sound_beep_low(); store_fuses_to_eeprom(max_current,max_voltage); dbg_trace1("current fuse set to %u mA\n", max_current); } else if (bstatus->butt3_redge) { increment_voltage(&max_voltage); sound_beep_high(); store_fuses_to_eeprom(max_current,max_voltage); dbg_trace1("voltage fuse set to %u mV\n", max_voltage); } else if (bstatus->butt4_redge) { decrement_voltage(&max_voltage); sound_beep_low(); store_fuses_to_eeprom(max_current,max_voltage); dbg_trace1("voltage fuse set to %u mV\n", max_voltage); } else if (bstatus->butt5_redge) { if (on_off) { on_off = 0; dbg_trace0("power supply is off\n"); sound_beep_low(); } else { on_off = 1; dbg_trace0("power supply is on\n"); sound_beep_high(); } } } if (systime_is_time_passed(start_time, end_time)) { start_time = end_time; end_time = start_time + 100; uint16_t voltage = ui_measure_get_voltage(); uint16_t current = ui_measure_get_current(); char c[32]; char v[32]; sprintf(v,"%u",voltage); sprintf(c,"%u",current); lcd_write(v,c); dbg_trace2("%u\t %u\n", current, voltage); } sound_routine(); // watch dog reset a sleep } }