// display pyramid in the console (debugging) static void pyramid_show(pyramid_t* pyramid) { char ss[30]; while (pyramid->next != NULL) pyramid = pyramid->next; while (pyramid != NULL) { printf("\n----- pyramid_t level %d,%d\n", pyramid->cols, pyramid->rows); sprintf(ss, "Gx %p ", pyramid->Gx); if(pyramid->Gx != NULL) matrix_show(ss,pyramid->cols, pyramid->rows, pyramid->Gx); sprintf(ss, "Gy %p ", pyramid->Gy); if(pyramid->Gy != NULL) matrix_show(ss,pyramid->cols, pyramid->rows, pyramid->Gy); pyramid = pyramid->prev; } }
void test_matrix() { struct Matrix* m = matrix_generate(5,5); printf("Matrix null: %d\n", matrix_is_null(m)); matrix_make_identity(m); struct Matrix* m2 = matrix_copy(m); matrix_set(m2,1,2,1); struct Matrix* m3 = matrix_mul(m2,m); matrix_show(m3); matrix_free(m); matrix_free(m2); matrix_free(m3); }
void test_hamming() { struct Hamming_config* conf = hamming_generate_config(); printf("\nTest of the (%d, %d, 3) Hamming code\n--------------------------------\n\n", N, K); // Display the generator and control matrix printf("Control matrix: \n"); matrix_show(conf->CONTROL_MATRIX); printf("Generator matrix: \n"); matrix_show(conf->GENERATOR_MATRIX); printf("Syndromes array: \n"); for(uint8_t i = 0; i <= N; i++) { print_var_bits(i); printf(" : "); print_var_bits(conf->SYNDROMES_ARRAY->data_array[i]); printf(" (%d : %d)", i, conf->SYNDROMES_ARRAY->data_array[i]); printf("\n"); } printf("\n"); // Generation of the word to encode struct Matrix* dte = matrix_generate(K, 1); matrix_set(dte, 3, 1, 1); matrix_set(dte, 1, 1, 1); // Display printf("Data to encode : %d elements\n", dte->data->data_number); matrix_show_word(dte); // Encoding struct Matrix* d = hamming_encode(dte, conf); printf("Data encoded : %d elements\n", d->data->data_number); matrix_show_word(d); // Add an error data_set(3, 1, d->data); printf("Data modified : %d elements\n", d->data->data_number); matrix_show_word(d); // Correction struct Matrix* r = hamming_syndrome(d, conf); printf("\n\nCorrection\n-----------\n\n"); printf("Syndrome of the modified code : %d \n", matrix_word_to_int(r)); if(!matrix_is_null(r)) { uint8_t b = hamming_check_syndrome(r, conf); printf("The bit %d is corrupted\n", b + 1); } else printf("No bit corrupted\n"); matrix_free(dte); matrix_free(d); matrix_free(r); hamming_free_config(conf); }
int main(void) { // Generate Hamming configuration struct Hamming_config* hamming_config = hamming_generate_config(); uint32_t nb_data = 512; char data_string[] = "01000010011011110110111001101010011011110111010101110010001011000010000001101010011001010010000001110011011101010110100101110011001000000110110001100101001000000111000001110010011001010110110101101001011001010111001000100000011101000110010101111000011101000110010100100000011001000110010100100000011011000010011101101000011010010111001101110100011011110110100101110010011001010010000001100100011001010010000001101100001001110110100001110101011011010110000101101110011010010111010011000011101010010010000000100001"; uint8_t remainder = nb_data % K; // Data number which will not be encoded uint8_t p; struct Matrix* data_loaded = matrix_generate(K, 1); // Send number of data for(uint8_t i = 0; i < 32; i++) ow_write_bit((nb_data & _BV(i)) ? 1 : 0); _delay_us(100); // Send encoded data for(uint32_t i = 0; i < nb_data; i--) { if(i % K == K - 1) { matrix_set(data_loaded, (i % K) + 1, 1, (data_string[nb_data - 1 - i] == 0x31) ? 1 : 0); struct Matrix* data_encoded = hamming_encode(data_loaded, hamming_config); for(p = 0; p < N; p++) //ow_write_bit(matrix_get(data_encoded, p + 1, 1)); matrix_show(data_encoded); matrix_free(data_encoded); _delay_us(10); } else { matrix_set(data_loaded, (i % K) + 1, 1, (data_string[nb_data - 1 - i] == 0x31) ? 1 : 0); data_show(data_loaded->data); } } /* // Remainder if(remainder != 0) { // Void other data than remainder for(p = remainder + 1; p < K; p++) matrix_set(data_loaded, j, 1, 0); // Encode struct Matrix* data_encoded = hamming_encode(data_loaded, hamming_config); // Send by one_wire for(p = 0; p < N; p++) ow_write_bit(matrix_get(data_encoded, p + 1, 1)); matrix_free(data_encoded); } */ matrix_free(data_loaded); return 0; }