diff --git a/Makefile b/Makefile index 86f4793..eb098ba 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ CC = gcc CFLAGS := -std=c99 -Wall -Wextra -Werror -pedantic -Wvla OBJ_RUN := src/student.c +INO_FILE := ref.ino all: run @@ -10,13 +11,13 @@ all: run prepare: CFLAGS += -shared prepare: src/main.o src/pin_handler.o ar crs src/pin_handler.a $^ - tar czf student.tar.gz src/pin_handler.a src/student.c src/default_student.c Makefile student.ino src/parser.c + tar czf student.tar.gz src/pin_handler.a src/student.c src/default_student.c Makefile $(INO_FILE) src/parser.c -parser: src/parser.o student.ino +parser: src/parser.o $(INO_FILE) @$(CC) $(CFLAGS) -o $@ src/parser.o - @./parser ./student.ino + @./parser $(INO_FILE) -run: parser $(OBJ_RUN) student.ino +run: parser $(OBJ_RUN) $(INO_FILE) @$(CC) -o main $(OBJ_RUN) src/pin_handler.a @./main diff --git a/src/default_student.c b/src/default_student.c index 34e648a..bccfbdb 100644 --- a/src/default_student.c +++ b/src/default_student.c @@ -1,4 +1,5 @@ #include +#include #define L1 1 #define L2 2 @@ -9,9 +10,10 @@ #define C3 7 #define C4 8 -void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer); +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, + size_t *pointer); -void student(char *sequence, size_t *pointer) -{ - size_t row = 0; - size_t col = 0; +static char *sequence; +static size_t *pointer; +static size_t row_main = 0; +static size_t col_main = 0; diff --git a/src/main.c b/src/main.c index 71953fa..6bda21f 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ -#include #include +#include + #include "student.h" int main(void) diff --git a/src/parser.c b/src/parser.c index 7d6b98a..9f2dd54 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,9 +1,9 @@ #define _GNU_SOURCE +#include +#include #include #include -#include #include -#include void parser(FILE *fd); @@ -28,25 +28,12 @@ int main(int argc, char **argv) return 0; } -char *get_id(char *buf, size_t buf_size, size_t *i) +char *get_id(char *buf, size_t *i) { - size_t start_nb = 0; - short previous_number = 0; - for (; *i < buf_size; *i += 1) - { - if ((buf[*i] >= '0' && buf[*i] <= '9') || buf[*i] == 'L' || buf[*i] == 'C') - { - if (!start_nb) - start_nb = *i; - previous_number = 1; - } - else if (previous_number) - { - buf[*i] = 0; - return buf + start_nb; - } - } - errx(2, "Error when compiling, pin number not found in a digitalWrite"); + char *comma = strchr(buf, ','); + *comma = 0; + *i = comma - buf + 1; + return strchr(buf, '(') + 1; } char *get_state(char *buf, size_t buf_size, size_t *i) @@ -64,7 +51,7 @@ char *get_state(char *buf, size_t buf_size, size_t *i) return buf + *i; } } - errx(2, "Error when compiling, HIGH or LOW not found in a digitalWrite"); + errx(2, "Error when parsing, HIGH or LOW not found in a digitalWrite"); } void skip_end(char *buf, size_t buf_size, size_t *i) @@ -83,14 +70,14 @@ size_t convert_fct(char *buf, size_t start, size_t buf_size, FILE *dst) if (!strncmp("digitalWrite", (buf + start), size_str)) { index += size_str + 1; - char *id = get_id(buf, buf_size, &index); + char *id = get_id(buf, &index); char *state = get_state(buf, buf_size, &index); state[0] = (state[0] == 'H') ? '1' : '0'; fwrite("set_pin(", 1, 8, dst); fwrite(id, 1, strlen(id), dst); fwrite(", ", 1, 2, dst); fwrite(state, 1, 1, dst); - fwrite(", &row, &col, sequence, pointer);", 1, 33, dst); + fwrite(", &row_main, &col_main, sequence, pointer);", 1, 43, dst); skip_end(buf, buf_size, &index); } else if (!strncmp("delay", (buf + start), 5)) @@ -99,15 +86,27 @@ size_t convert_fct(char *buf, size_t start, size_t buf_size, FILE *dst) } return index; } -void write_buf(char *buf, size_t start, size_t buf_size, FILE *dst, size_t *nb_bracket) + +void basic_write_buf(char *buf, size_t buf_size, FILE *dst) { - for (size_t i = start; i < buf_size; i++) + for (size_t i = 0; i < buf_size; i++) { - if (buf[i] == '}') + size_t index = convert_fct(buf, i, buf_size, dst); + if (index < buf_size) + fwrite(buf + index, 1, 1, dst); + i = index; + } +} + +void write_buf(char *buf, size_t buf_size, FILE *dst, size_t *nb_bracket) +{ + for (size_t i = 0; i < buf_size; i++) + { + if (buf[i] == '}') *nb_bracket -= 1; - else if (buf[i] == '{') + else if (buf[i] == '{') *nb_bracket += 1; - + if (nb_bracket != 0) { size_t index = convert_fct(buf, i, buf_size, dst); @@ -118,16 +117,57 @@ void write_buf(char *buf, size_t start, size_t buf_size, FILE *dst, size_t *nb_b } } -size_t find_loop(char *buf, size_t buf_size) +void count_bracket(char *buf, size_t buf_size, size_t *nb_bracket) +{ + for (size_t i = 0; i < buf_size; i++) + { + if (buf[i] == '}') + *nb_bracket -= 1; + else if (buf[i] == '{') + *nb_bracket += 1; + } +} + +int is_loop(char *buf, size_t buf_size) { for (size_t i = 0; i < buf_size - 6; i++) { if (!strncmp("loop()", (buf + i), 6)) { - return i + 6; + return 1; } } - return buf_size + 1; + return 0; +} + +int is_global_variable(char *buf) +{ + if (!strncmp("// START GLOBAL VARIABLE", buf, 24)) + { + return 1; + } + return 0; +} + +int out_global_variable(char *buf) +{ + if (!strncmp("// END GLOBAL VARIABLE", buf, 22)) + { + return 1; + } + return 0; +} + +int is_setup(char *buf, size_t buf_size) +{ + for (size_t i = 0; i < buf_size - 6; i++) + { + if (!strncmp("setup()", (buf + i), 6)) + { + return 1; + } + } + return 0; } FILE *init_student() @@ -140,11 +180,11 @@ FILE *init_student() { fclose(student); errx(1, "Failed to open file 'default_student.c'"); - } + } int c; while ((c = fgetc(default_student)) != EOF) fputc(c, student); - fclose (default_student); + fclose(default_student); return student; } @@ -155,25 +195,69 @@ void parser(FILE *fd) ssize_t bytes_read = 0; size_t nb_bracket = -1; short in_loop = 0; + short in_setup = 0; + short in_global_variable = 0; FILE *student = init_student(); while ((bytes_read = getline(&buf, &buf_size, fd)) != -1) { - if (in_loop) + if (in_global_variable) { - write_buf(buf, 0, bytes_read, student, &nb_bracket); + if (out_global_variable(buf)) + { + in_global_variable = 0; + fwrite("while (1) {\n", 1, 11, student); + } + else + { + basic_write_buf(buf, bytes_read, student); + } + } + else if ((in_loop & 1) == 1) + { + write_buf(buf, bytes_read, student, &nb_bracket); + if (nb_bracket == 0) + { + in_loop &= 2; + fwrite("}", 1, 1, student); + } + } + else if (in_setup & 1) + { + count_bracket(buf, bytes_read, &nb_bracket); + if (nb_bracket == 0) + { + in_setup &= 2; + } } else { - size_t index_loop = find_loop(buf, buf_size); - if (index_loop != buf_size + 1) + if (is_global_variable(buf)) { - in_loop = 1; + in_global_variable = 1; + fwrite("void student(char *seq, size_t *ptr) {\n", 1, 39, + student); + fwrite("sequence = seq;\n", 1, 16, student); + fwrite("pointer = ptr;\n", 1, 15, student); + } + else if (is_loop(buf, buf_size)) + { + in_loop = 3; + nb_bracket = 1; + } + else if (is_setup(buf, buf_size)) + { + in_setup = 3; + nb_bracket = 1; + } + else if (in_setup & 2) + { + basic_write_buf(buf, bytes_read, student); } } } if (buf) free(buf); fclose(student); - if (!in_loop) - errx(2, "Could not find the main loop function"); + if (!(in_loop & 2)) + errx(2, "parser: Could not find the main loop function"); } diff --git a/src/pin_handler.c b/src/pin_handler.c index 8d7333a..9a6f736 100644 --- a/src/pin_handler.c +++ b/src/pin_handler.c @@ -1,7 +1,8 @@ #include "pin_handler.h" + +#include #include #include -#include static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer) { @@ -19,16 +20,17 @@ static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer) *wire = 0; } -static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col) +static void read_digit(char *sequence, size_t *pointer, size_t *row, + size_t *col) { if (*row == 0 || *col == 0) return; const char keyboard[4][4] = { - { '1', '2', '3', 'A'}, - { '4', '5', '6', 'B'}, - { '7', '8', '9', 'C'}, - { '*', '0', '#', 'D'}, + { '1', '2', '3', 'A' }, + { '4', '5', '6', 'B' }, + { '7', '8', '9', 'C' }, + { '*', '0', '#', 'D' }, }; sequence[*pointer] = keyboard[*row - 1][*col - 1]; @@ -37,6 +39,8 @@ static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col if (keyboard[*row - 1][*col - 1] == '#') { + if (DEBUG_LEVEL >= 1) + printf("full sequence: %s\n", sequence); if (!strcmp(CODE, sequence)) { errx(0, "Code found: %s\n", sequence); @@ -46,8 +50,11 @@ static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col } } -void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer) +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, + size_t *pointer) { + if (DEBUG_LEVEL >= 2) + printf("set pin %i, state: %u\n", id, state); if (id <= 4) { set_data(row, id, state, pointer); diff --git a/src/pin_handler.h b/src/pin_handler.h index c4b98ba..c97e8a8 100644 --- a/src/pin_handler.h +++ b/src/pin_handler.h @@ -1,9 +1,11 @@ #ifndef PIN_HANDLER_H #define PIN_HANDLER_H -#define CODE "1#" +#define CODE "1234#" +#define DEBUG_LEVEL 1 #include -void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer); +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, + size_t *pointer); #endif // PIN_HANDLER_H diff --git a/src/student.c b/src/student.c index c6329a4..19ae576 100644 --- a/src/student.c +++ b/src/student.c @@ -1,4 +1,5 @@ #include +#include #define L1 1 #define L2 2 @@ -9,22 +10,83 @@ #define C3 7 #define C4 8 -void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer); +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, + size_t *pointer); -void student(char *sequence, size_t *pointer) +static char *sequence; +static size_t *pointer; +static size_t row_main = 0; +static size_t col_main = 0; + +void set_number(char nb) { - size_t row = 0; - size_t col = 0; - // 1 - set_pin(C1, 1, &row, &col, sequence, pointer); - set_pin(L1, 1, &row, &col, sequence, pointer); + const char keyboard[4][4] = { + { '1', '2', '3', 'A' }, + { '4', '5', '6', 'B' }, + { '7', '8', '9', 'C' }, + { '*', '0', '#', 'D' }, + }; - - set_pin(C1, 0, &row, &col, sequence, pointer); - set_pin(L1, 0, &row, &col, sequence, pointer); + int row = 0; + int col = 0; + int found = 0; + for (; !found && row < 4; row++) + { + col = 0; + for (; !found && col < 4; col++) + { + if (keyboard[row][col] == nb) + { + found = 1; + row--; + col--; + } + } + } - - // # - set_pin(C3, 1, &row, &col, sequence, pointer); - set_pin(L4, 1, &row, &col, sequence, pointer); + int pins[8] = { L1, L2, L3, L4, C1, C2, C3, C4 }; + set_pin(pins[4 + col], 1, &row_main, &col_main, sequence, pointer); + set_pin(pins[row], 1, &row_main, &col_main, sequence, pointer); } + +void reset_all_pin() +{ + int pins[8] = { L1, L2, L3, L4, C1, C2, C3, C4 }; + for (size_t i = 0; i < 8; i++) + { + set_pin(pins[i], 0, &row_main, &col_main, sequence, pointer); + } +} + +void student(char *seq, size_t *ptr) +{ + sequence = seq; + pointer = ptr; + int nb = 1000; + int max_nb = 9999; + while (1) + { + if (nb <= max_nb) + { + int tmp_nb = nb; + char nbs[4]; + int place = 3; + + while (tmp_nb > 0) + { + nbs[place] = '0' + (tmp_nb % 10); + tmp_nb /= 10; + place--; + } + + for (size_t i = 0; i < 4; i++) + { + reset_all_pin(); + set_number(nbs[i]); + } + reset_all_pin(); + set_number('#'); + nb++; + } + } +} \ No newline at end of file diff --git a/student.ino b/student.ino index c5312cf..1c8125e 100644 --- a/student.ino +++ b/student.ino @@ -11,6 +11,11 @@ void setup() { // to complete } + +// START GLOBAL VARIABLE + +// END GLOBAL VARIABLE + void loop() { // 1 digitalWrite(C1, HIGH);