From: Skullheadx Date: Thu, 21 Nov 2024 14:09:39 +0000 (-0500) Subject: Move decoding logic to new function X-Git-Url: http://git.skullheadx.com/index.css?a=commitdiff_plain;h=c25a718bfd7763a14da8cff43d85cc05599c54cb;p=qrcodescanner.git Move decoding logic to new function Allows for ease of testing --- diff --git a/camera.cpp b/camera.cpp index 4a26ca0..62b6a01 100644 --- a/camera.cpp +++ b/camera.cpp @@ -9,7 +9,7 @@ void print_codewords(std::vector &vec); void vec_xor(std::vector &v1, const std::vector v2); unsigned int distance(std::vector &v1, const std::vector &v2); unsigned int convert_uint(std::vector &vec); -void read_words_from_file(char const *filename, std::vector> &symbol); +void read_from_file(std::string filename, std::vector> &symbol); void retrieve_codewords(std::vector> &symbol, std::vector &codewords, bool is_upwards, std::size_t row, std::size_t col); void retrieve_special_codewords(std::vector> &symbol, std::vector &codewords, bool is_upwards, int row, int col); @@ -17,40 +17,22 @@ std::vector get_format_info(std::vector> &symbol); void decode_mask(std::vector> &symbol, std::size_t mask_pattern); std::vector get_codewords_from_symbol(std::vector> &symbol); std::string get_input_data(std::vector &input_data, unsigned int character_count_indicator); +std::string decode_symbol(std::vector> &symbol); int main(){ - std::vector> symbol(21, std::vector(21,0)); - - read_words_from_file("output.pbm", symbol); - //print(symbol); - - std::vector format_info = get_format_info(symbol); - - std::cout << "Format Info: "; print(format_info); std::cout << std::endl; - std::bitset<3> mask_pattern{}; - mask_pattern[0] = format_info[2]; - mask_pattern[1] = format_info[3]; - mask_pattern[2] = format_info[4]; - decode_mask(symbol, mask_pattern.to_ulong()); - //print(symbol); - - std::vector codewords = get_codewords_from_symbol(symbol); - //print_codewords(codewords); - //std::cout << "Number of codewords: " << codewords.size() / 8.0 << std::endl; - std::vector data_codewords(codewords.begin(), codewords.begin() + 16 * 8), error_correction_codewords(codewords.begin() + 16 * 8, codewords.end()); - - //std::cout << "Number of data codewords: " << data_codewords.size() / 8.0 << std::endl; - //std::cout << "Number of error correction codewords: " << error_correction_codewords.size() / 8.0 << std::endl; - //print_codewords(data_codewords); - std::vector mode_indicator(data_codewords.begin(), data_codewords.begin() + 4); - std::vector character_count(data_codewords.begin() + 4, data_codewords.begin() + 14); - unsigned int character_count_indicator = convert_uint(character_count); - //std::cout << character_count_indicator << std::endl; - std::vector input_data(data_codewords.begin() + 14, data_codewords.end()); - - std::string value = get_input_data(input_data, character_count_indicator); - std::cout << value << std::endl; - + std::vector test_cases = {"012345678", "876543210", "000000000", "999999999", "123456789", "873703846", "884158624", "827515735", "869871935", "804235824"}; + unsigned int test_counter = 1; + for (auto test : test_cases){ + std::vector> symbol(21, std::vector(21,0)); + read_from_file(test + ".pbm", symbol); + //print(symbol); + std::cout << "Test: " << test_counter << std::endl; + std::string result = decode_symbol(symbol); + std::cout << "Test Passed: " << (result == test) << std::endl; + std::cout << "Test: " << test << std::endl; + std::cout << "Result: " << result << std::endl; + test_counter++; + } return 0; } @@ -340,7 +322,36 @@ std::string get_input_data(std::vector &input_data, unsigned int character } -void read_words_from_file(char const *filename, std::vector> &symbol) { +std::string decode_symbol(std::vector> &symbol){ + std::vector format_info = get_format_info(symbol); + + //std::cout << "Format Info: "; print(format_info); std::cout << std::endl; + std::bitset<3> mask_pattern{}; + mask_pattern[0] = format_info[2]; + mask_pattern[1] = format_info[3]; + mask_pattern[2] = format_info[4]; + decode_mask(symbol, mask_pattern.to_ulong()); + //print(symbol); + + std::vector codewords = get_codewords_from_symbol(symbol); + //print_codewords(codewords); + //std::cout << "Number of codewords: " << codewords.size() / 8.0 << std::endl; + std::vector data_codewords(codewords.begin(), codewords.begin() + 16 * 8), error_correction_codewords(codewords.begin() + 16 * 8, codewords.end()); + + //std::cout << "Number of data codewords: " << data_codewords.size() / 8.0 << std::endl; + //std::cout << "Number of error correction codewords: " << error_correction_codewords.size() / 8.0 << std::endl; + //print_codewords(data_codewords); + std::vector mode_indicator(data_codewords.begin(), data_codewords.begin() + 4); + std::vector character_count(data_codewords.begin() + 4, data_codewords.begin() + 14); + unsigned int character_count_indicator = convert_uint(character_count); + //std::cout << character_count_indicator << std::endl; + std::vector input_data(data_codewords.begin() + 14, data_codewords.end()); + + return get_input_data(input_data, character_count_indicator); +} + + +void read_from_file(std::string filename, std::vector> &symbol){ std::ifstream file{ filename }; if (!file.is_open()) { std::cout << "[ERROR] " << filename << " not found or could not open file" << std::endl; diff --git a/qrgenerator.cpp b/qrgenerator.cpp index b97e37e..0c9e358 100644 --- a/qrgenerator.cpp +++ b/qrgenerator.cpp @@ -4,7 +4,7 @@ #include #include #include -#define ID_LENGTH 34 +#define ID_LENGTH 9 #define MODE_INDICATOR_LENGTH 4 #define grid_length 21 @@ -22,12 +22,13 @@ std::vector> symbol_placement_down_special(std::vector> grid); void print_grid(std::vector> grid); std::vector calculate_remainder(const std::vector& data, const std::vector& generator); -void create_image(std::vector> &grid); +void create_image(std::vector> &grid, std::string filename); int main() { int k; - //std::cout << id_generator(69) << std::endl; - std::string input_data{"6969696969"}; + std::string input_data{id_generator(time(NULL))}; + //std::string input_data{"123456789"}; + std::string filename{input_data}; const unsigned int input_length = input_data.size(); std::vector input_data_vector{}; for (unsigned int i{0}; i < input_length; i+=3){ @@ -575,14 +576,13 @@ int main() { print_grid(grid); - - create_image(grid); + create_image(grid, filename); return 0; } -void create_image(std::vector> &grid){ - std::ofstream file("output.pbm"); +void create_image(std::vector> &grid, std::string filename){ + std::ofstream file(filename + ".pbm"); if (!file){ std::cerr << "error creating file" << std::endl; }