diff --git a/applications/plugins/barcode_generator/application.fam b/applications/plugins/barcode_generator/application.fam index 0724fdfba9..d2d7c4b96f 100644 --- a/applications/plugins/barcode_generator/application.fam +++ b/applications/plugins/barcode_generator/application.fam @@ -1,8 +1,8 @@ App( appid="Barcode_Generator", - name="UPC-A Generator", + name="Barcode Generator", apptype=FlipperAppType.EXTERNAL, - entry_point="barcode_UPCA_generator_app", + entry_point="barcode_generator_app", cdefines=["APP_BARCODE_GEN"], requires=[ "gui", diff --git a/applications/plugins/barcode_generator/barcode_generator.c b/applications/plugins/barcode_generator/barcode_generator.c index 0418d672cb..7768625318 100644 --- a/applications/plugins/barcode_generator/barcode_generator.c +++ b/applications/plugins/barcode_generator/barcode_generator.c @@ -3,229 +3,75 @@ #include #include -#define BARCODE_STARTING_POS 16 -#define BARCODE_HEIGHT 50 -#define BARCODE_Y_START 3 -#define BARCODE_TEXT_OFFSET 9 - -typedef enum { - EventTypeTick, - EventTypeKey, -} EventType; - -typedef struct { - EventType type; - InputEvent input; -} PluginEvent; - -typedef struct { - int barcodeNumeral[12]; //The current barcode number - int editingIndex; //The index of the editing symbol - int menuIndex; //The index of the menu cursor - int modeIndex; //Set to 0 for view, 1 for edit, 2 for menu - bool doParityCalculation; //Should do parity check? -} PluginState; - -void number_0( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #0 on left is OOOIIOI - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "0"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); - } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 3, BARCODE_HEIGHT); //OOO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 6, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I -} -void number_1( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #1 on left is OOIIOOI - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "1"); +#include "barcode_generator.h" - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); - } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 2, BARCODE_HEIGHT); //OO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 2, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 4, BARCODE_Y_START, 2, BARCODE_HEIGHT); //OO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 6, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I -} -void number_2( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #2 on left is OOIOOII - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "2"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); - } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 2, BARCODE_HEIGHT); //OO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 2, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 2, BARCODE_HEIGHT); //OO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II -} -void number_3( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #3 on left is OIIIIOI - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "3"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); - } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 4, BARCODE_HEIGHT); //IIII - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 6, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I +static BarcodeType* barcodeTypes[NUMBER_OF_BARCODE_TYPES]; + +void init_types() { + BarcodeType* upcA = malloc(sizeof(BarcodeType)); + upcA->name = "UPC-A"; + upcA->numberOfDigits = 12; + upcA->startPos = 19; + barcodeTypes[0] = upcA; + + BarcodeType* ean8 = malloc(sizeof(BarcodeType)); + ean8->name = "EAN-8"; + ean8->numberOfDigits = 8; + ean8->startPos = 33; + barcodeTypes[1] = ean8; } -void number_4( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #4 on left is OIOOOII + +void draw_digit(Canvas* canvas, int digit, bool rightHand, int startingPosition) { + char digitStr[2]; + snprintf(digitStr, 2, "%u", digit); canvas_set_color(canvas, ColorBlack); canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "4"); + canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, digitStr); if(rightHand) { canvas_set_color(canvas, ColorBlack); } else { canvas_set_color(canvas, ColorWhite); } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 2, BARCODE_Y_START, 3, BARCODE_HEIGHT); //OOO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II -} -void number_5( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #5 on left is OIIOOOI - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "5"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); + + int count = 0; + for(int i = 0; i < 4; i++) { + canvas_draw_box( + canvas, startingPosition + count, BARCODE_Y_START, DIGITS[digit][i], BARCODE_HEIGHT); + canvas_invert_color(canvas); + count += DIGITS[digit][i]; } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 3, BARCODE_HEIGHT); //OOO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 6, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I } -void number_6( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #6 on left is OIOIIII - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "6"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); + +int get_digit_position(int index, BarcodeType* type) { + int pos = type->startPos + index * 7; + if(index >= type->numberOfDigits / 2) { + pos += 5; } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 2, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 4, BARCODE_HEIGHT); //IIII + return pos; } -void number_7( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #7 on left is OIIIOII - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "7"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); - } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 3, BARCODE_HEIGHT); //III - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 4, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II + +int get_menu_text_location(int index) { + return 20 + 10 * index; } -void number_8( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #8 on left is OIIOIII - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "8"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); + +int calculate_check_digit(PluginState* plugin_state, BarcodeType* type) { + int checkDigit = 0; + //add all odd positions. Confusing because 0index + for(int i = 0; i < type->numberOfDigits - 1; i += 2) { + checkDigit += plugin_state->barcodeNumeral[i]; } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 1, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 4, BARCODE_Y_START, 3, BARCODE_HEIGHT); //III -} -void number_9( - Canvas* canvas, - bool rightHand, - int startingPosition) { //UPC Code for #9 on left is OOOIOII - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, "9"); - if(rightHand) { - canvas_set_color(canvas, ColorBlack); - } else { - canvas_set_color(canvas, ColorWhite); + + checkDigit = checkDigit * 3; //times 3 + + //add all even positions to above. Confusing because 0index + for(int i = 1; i < type->numberOfDigits - 1; i += 2) { + checkDigit += plugin_state->barcodeNumeral[i]; } - canvas_draw_box(canvas, startingPosition, BARCODE_Y_START, 3, BARCODE_HEIGHT); //OOO - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 3, BARCODE_Y_START, 1, BARCODE_HEIGHT); //I - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 4, BARCODE_Y_START, 1, BARCODE_HEIGHT); //O - canvas_invert_color(canvas); - canvas_draw_box(canvas, startingPosition + 5, BARCODE_Y_START, 2, BARCODE_HEIGHT); //II + + checkDigit = checkDigit % 10; //mod 10 + + //if m = 0 then x12 = 0, otherwise x12 is 10 - m + return (10 - checkDigit) % 10; } static void render_callback(Canvas* const canvas, void* ctx) { @@ -234,144 +80,79 @@ static void render_callback(Canvas* const canvas, void* ctx) { return; } - //I originally had all of these values being generated at runtime by math, but that kept giving me trouble. - int editingMarkerPosition[12] = { - 19, - 26, - 33, - 40, - 47, - 54, - 66, - 73, - 80, - 87, - 94, - 101, - }; - int menuTextLocations[6] = { - 20, - 30, - 40, - 50, - 60, - 70, - }; - - if(plugin_state->modeIndex == 2) { //if in the menu + if(plugin_state->mode == MenuMode) { canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, 64, 6, AlignCenter, AlignCenter, "MENU"); canvas_draw_frame(canvas, 50, 0, 29, 11); //box around Menu canvas_draw_str_aligned( - canvas, 64, menuTextLocations[0], AlignCenter, AlignCenter, "View"); + canvas, 64, get_menu_text_location(0), AlignCenter, AlignCenter, "View"); canvas_draw_str_aligned( - canvas, 64, menuTextLocations[1], AlignCenter, AlignCenter, "Edit"); + canvas, 64, get_menu_text_location(1), AlignCenter, AlignCenter, "Edit"); canvas_draw_str_aligned( - canvas, 64, menuTextLocations[2], AlignCenter, AlignCenter, "Parity?"); + canvas, 64, get_menu_text_location(2), AlignCenter, AlignCenter, "Parity?"); - canvas_draw_frame(canvas, 81, menuTextLocations[2] - 2, 6, 6); + canvas_draw_frame(canvas, 83, get_menu_text_location(2) - 3, 6, 6); if(plugin_state->doParityCalculation == true) { - canvas_draw_box(canvas, 83, menuTextLocations[2], 2, 2); + canvas_draw_box(canvas, 85, get_menu_text_location(2) - 1, 2, 2); } canvas_draw_str_aligned( - canvas, 64, menuTextLocations[3], AlignCenter, AlignCenter, "TODO"); + canvas, + 64, + get_menu_text_location(3), + AlignCenter, + AlignCenter, + (barcodeTypes[plugin_state->barcodeTypeIndex])->name); canvas_draw_disc( - canvas, 40, menuTextLocations[plugin_state->menuIndex], 2); //draw menu cursor - } + canvas, 40, get_menu_text_location(plugin_state->menuIndex) - 1, 2); //draw menu cursor + } else { + BarcodeType* type = barcodeTypes[plugin_state->barcodeTypeIndex]; - if(plugin_state->modeIndex != 2) { //if not in the menu canvas_set_color(canvas, ColorBlack); - //canvas_draw_glyph(canvas, 115, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, 'M'); - canvas_draw_box(canvas, BARCODE_STARTING_POS, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - //canvas_draw_box(canvas, BARCODE_STARTING_POS + 1, 1, 1, 50); //left blank on purpose + canvas_draw_box(canvas, type->startPos - 3, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); canvas_draw_box( canvas, - (BARCODE_STARTING_POS + 2), + (type->startPos - 1), BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); //start saftey - for(int index = 0; index < 12; index++) { + + for(int index = 0; index < type->numberOfDigits; index++) { bool isOnRight = false; - if(index >= 6) { + if(index >= type->numberOfDigits / 2) { isOnRight = true; } - if((index == 11) && (plugin_state->doParityCalculation)) { //calculate the check digit - int checkDigit = - plugin_state->barcodeNumeral[0] + plugin_state->barcodeNumeral[2] + - plugin_state->barcodeNumeral[4] + plugin_state->barcodeNumeral[6] + - plugin_state->barcodeNumeral[8] + plugin_state->barcodeNumeral[10]; - //add all odd positions Confusing because 0index - checkDigit = checkDigit * 3; //times 3 - checkDigit += plugin_state->barcodeNumeral[1] + plugin_state->barcodeNumeral[3] + - plugin_state->barcodeNumeral[5] + plugin_state->barcodeNumeral[7] + - plugin_state->barcodeNumeral[9]; - //add all even positions to above. Confusing because 0index - checkDigit = checkDigit % 10; //mod 10 - //if m - 0 then x12 = 0, otherwise x12 is 10 - m - if(checkDigit == 0) { - plugin_state->barcodeNumeral[11] = 0; - } else { - checkDigit = 10 - checkDigit; - plugin_state->barcodeNumeral[11] = checkDigit; - } - } - switch(plugin_state->barcodeNumeral[index]) { - case 0: - number_0(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 1: - number_1(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 2: - number_2(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 3: - number_3(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 4: - number_4(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 5: - number_5(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 6: - number_6(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 7: - number_7(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 8: - number_8(canvas, isOnRight, editingMarkerPosition[index]); - break; - case 9: - number_9(canvas, isOnRight, editingMarkerPosition[index]); - break; + if((index == type->numberOfDigits - 1) && + (plugin_state->doParityCalculation)) { //calculate the check digit + int checkDigit = calculate_check_digit(plugin_state, type); + plugin_state->barcodeNumeral[type->numberOfDigits - 1] = checkDigit; } + int digitPosition = + get_digit_position(index, barcodeTypes[plugin_state->barcodeTypeIndex]); + draw_digit(canvas, plugin_state->barcodeNumeral[index], isOnRight, digitPosition); } canvas_set_color(canvas, ColorBlack); - //canvas_draw_box(canvas, BARCODE_STARTING_POS + 45, BARCODE_Y_START, 1, BARCODE_HEIGHT); - canvas_draw_box(canvas, BARCODE_STARTING_POS + 46, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - //canvas_draw_box(canvas, BARCODE_STARTING_POS + 47, BARCODE_Y_START, 1, BARCODE_HEIGHT); - canvas_draw_box(canvas, BARCODE_STARTING_POS + 48, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - //canvas_draw_box(canvas, BARCODE_STARTING_POS + 49, BARCODE_Y_START, 1, BARCODE_HEIGHT); + canvas_draw_box(canvas, 62, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); + canvas_draw_box(canvas, 64, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - if(plugin_state->modeIndex == 1) { + if(plugin_state->mode == EditMode) { canvas_set_color(canvas, ColorBlack); canvas_draw_box( canvas, - editingMarkerPosition[plugin_state->editingIndex], + get_digit_position( + plugin_state->editingIndex, barcodeTypes[plugin_state->barcodeTypeIndex]) - + 1, 63, 7, 1); //draw editing cursor } + int endSafetyPosition = get_digit_position(type->numberOfDigits - 1, type) + 7; canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, BARCODE_STARTING_POS + 92, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - //canvas_draw_box(canvas, 14, 1, 1, 50); //left blank on purpose + canvas_draw_box(canvas, endSafetyPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); canvas_draw_box( canvas, - (BARCODE_STARTING_POS + 2) + 92, + (endSafetyPosition + 2), BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); //end safety @@ -387,31 +168,140 @@ static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queu furi_message_queue_put(event_queue, &event, FuriWaitForever); } -static void barcode_UPCA_generator_state_init(PluginState* const plugin_state) { - int i; - for(i = 0; i < 12; ++i) { - if(i > 9) { - plugin_state->barcodeNumeral[i] = i - 10; - } else if(i < 10) { - plugin_state->barcodeNumeral[i] = i; - } +static void barcode_generator_state_init(PluginState* const plugin_state) { + for(int i = 0; i < 12; ++i) { + plugin_state->barcodeNumeral[i] = i % 10; } plugin_state->editingIndex = 0; - plugin_state->modeIndex = 0; + plugin_state->mode = ViewMode; plugin_state->doParityCalculation = true; - plugin_state->menuIndex = 0; + plugin_state->menuIndex = MENU_INDEX_VIEW; + plugin_state->barcodeTypeIndex = 0; } -int32_t barcode_UPCA_generator_app(void* p) { +static bool handle_key_press_view(InputKey key, PluginState* plugin_state) { + switch(key) { + case InputKeyOk: + case InputKeyBack: + plugin_state->mode = MenuMode; + break; + + default: + break; + } + + return true; +} + +static bool handle_key_press_edit(InputKey key, PluginState* plugin_state) { + int barcodeMaxIndex = plugin_state->doParityCalculation ? + barcodeTypes[plugin_state->barcodeTypeIndex]->numberOfDigits - 1 : + barcodeTypes[plugin_state->barcodeTypeIndex]->numberOfDigits; + + switch(key) { + case InputKeyUp: + plugin_state->barcodeNumeral[plugin_state->editingIndex] = + (plugin_state->barcodeNumeral[plugin_state->editingIndex] + 1) % 10; + break; + + case InputKeyDown: + plugin_state->barcodeNumeral[plugin_state->editingIndex] = + (plugin_state->barcodeNumeral[plugin_state->editingIndex] == 0) ? + 9 : + plugin_state->barcodeNumeral[plugin_state->editingIndex] - 1; + break; + + case InputKeyRight: + plugin_state->editingIndex = (plugin_state->editingIndex + 1) % barcodeMaxIndex; + break; + + case InputKeyLeft: + plugin_state->editingIndex = (plugin_state->editingIndex == 0) ? + barcodeMaxIndex - 1 : + plugin_state->editingIndex - 1; + break; + + case InputKeyOk: + case InputKeyBack: + plugin_state->mode = MenuMode; + break; + + default: + break; + } + + return true; +} + +static bool handle_key_press_menu(InputKey key, PluginState* plugin_state) { + switch(key) { + case InputKeyUp: + plugin_state->menuIndex = (plugin_state->menuIndex == MENU_INDEX_VIEW) ? + MENU_INDEX_TYPE : + plugin_state->menuIndex - 1; + break; + + case InputKeyDown: + plugin_state->menuIndex = (plugin_state->menuIndex + 1) % 4; + break; + + case InputKeyRight: + if(plugin_state->menuIndex == MENU_INDEX_TYPE) { + plugin_state->barcodeTypeIndex = + (plugin_state->barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? + 0 : + plugin_state->barcodeTypeIndex + 1; + } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { + plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + } + break; + case InputKeyLeft: + if(plugin_state->menuIndex == MENU_INDEX_TYPE) { + plugin_state->barcodeTypeIndex = (plugin_state->barcodeTypeIndex == 0) ? + NUMBER_OF_BARCODE_TYPES - 1 : + plugin_state->barcodeTypeIndex - 1; + } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { + plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + } + break; + + case InputKeyOk: + if(plugin_state->menuIndex == MENU_INDEX_VIEW) { + plugin_state->mode = ViewMode; + } else if(plugin_state->menuIndex == MENU_INDEX_EDIT) { + plugin_state->mode = EditMode; + } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { + plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + } else if(plugin_state->menuIndex == MENU_INDEX_TYPE) { + plugin_state->barcodeTypeIndex = + (plugin_state->barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? + 0 : + plugin_state->barcodeTypeIndex + 1; + } + break; + + case InputKeyBack: + return false; + + default: + break; + } + + return true; +} + +int32_t barcode_generator_app(void* p) { UNUSED(p); - //testing + + init_types(); + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); PluginState* plugin_state = malloc(sizeof(PluginState)); - barcode_UPCA_generator_state_init(plugin_state); + barcode_generator_state_init(plugin_state); ValueMutex state_mutex; if(!init_mutex(&state_mutex, plugin_state, sizeof(PluginState))) { - FURI_LOG_E("barcode_UPCA_generator", "cannot create mutex\r\n"); + FURI_LOG_E("barcode_generator", "cannot create mutex\r\n"); furi_message_queue_free(event_queue); free(plugin_state); return 255; @@ -430,102 +320,23 @@ int32_t barcode_UPCA_generator_app(void* p) { for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); PluginState* plugin_state = (PluginState*)acquire_mutex_block(&state_mutex); - int barcodeMaxIndex; - if(plugin_state->doParityCalculation == true) { - barcodeMaxIndex = 11; - } - if(plugin_state->doParityCalculation == false) { - barcodeMaxIndex = 12; - } if(event_status == FuriStatusOk) { // press events - if(event.type == EventTypeKey) { - if((event.input.type == InputTypePress) || (event.input.type == InputTypeRepeat)) { - switch(event.input.key) { - case InputKeyUp: - if(plugin_state->modeIndex == 1) { //if edit mode - plugin_state->barcodeNumeral[plugin_state->editingIndex]++; - } - if(plugin_state->barcodeNumeral[plugin_state->editingIndex] > 9) { - plugin_state->barcodeNumeral[plugin_state->editingIndex] = 0; - } - if(plugin_state->modeIndex == 2) { //if menu mode - plugin_state->menuIndex--; - } - if(plugin_state->menuIndex < 0) { - plugin_state->menuIndex = 3; - } - break; - case InputKeyDown: - if(plugin_state->modeIndex == 1) { - plugin_state->barcodeNumeral[plugin_state->editingIndex]--; - } - if(plugin_state->barcodeNumeral[plugin_state->editingIndex] < 0) { - plugin_state->barcodeNumeral[plugin_state->editingIndex] = 9; - } - if(plugin_state->modeIndex == 2) { //if menu mode - plugin_state->menuIndex++; - } - if(plugin_state->menuIndex > 3) { - plugin_state->menuIndex = 0; - } - break; - case InputKeyRight: - if(plugin_state->modeIndex == 1) { - plugin_state->editingIndex++; - } - if(plugin_state->editingIndex >= barcodeMaxIndex) { - plugin_state->editingIndex = 0; - } - break; - case InputKeyLeft: - if(plugin_state->modeIndex == 1) { - plugin_state->editingIndex--; - } - if(plugin_state->editingIndex < 0) { - plugin_state->editingIndex = barcodeMaxIndex - 1; - } - break; - case InputKeyOk: - if((plugin_state->modeIndex == 0) || - (plugin_state->modeIndex == 1)) { //if normal or edit more, open menu - plugin_state->modeIndex = 2; - break; - } else if( - (plugin_state->modeIndex == 2) && - (plugin_state->menuIndex == - 1)) { //if hits select in menu, while index is 1. edit mode - plugin_state->modeIndex = 1; - break; - } else if( - (plugin_state->modeIndex == 2) && - (plugin_state->menuIndex == - 0)) { //if hits select in menu, while index is 0. view mode - plugin_state->modeIndex = 0; - break; - } else if( - (plugin_state->modeIndex == 2) && - (plugin_state->menuIndex == - 2)) { //if hits select in menu, while index is 2. Parity switch - plugin_state->doParityCalculation = - !plugin_state->doParityCalculation; //invert bool - break; - } else { - break; - } - - case InputKeyBack: - if(plugin_state->modeIndex == 0) { - processing = false; - } - if(plugin_state->modeIndex == 2) { - plugin_state->modeIndex = 0; - } - break; - default: - break; - } + if(event.type == EventTypeKey && + ((event.input.type == InputTypePress) || (event.input.type == InputTypeRepeat))) { + switch(plugin_state->mode) { + case ViewMode: + processing = handle_key_press_view(event.input.key, plugin_state); + break; + case EditMode: + processing = handle_key_press_edit(event.input.key, plugin_state); + break; + case MenuMode: + processing = handle_key_press_menu(event.input.key, plugin_state); + break; + default: + break; } } } diff --git a/applications/plugins/barcode_generator/barcode_generator.h b/applications/plugins/barcode_generator/barcode_generator.h new file mode 100644 index 0000000000..7e1a078e89 --- /dev/null +++ b/applications/plugins/barcode_generator/barcode_generator.h @@ -0,0 +1,52 @@ +#define BARCODE_HEIGHT 50 +#define BARCODE_Y_START 3 +#define BARCODE_TEXT_OFFSET 9 +#define NUMBER_OF_BARCODE_TYPES 2 +#define MENU_INDEX_VIEW 0 +#define MENU_INDEX_EDIT 1 +#define MENU_INDEX_PARITY 2 +#define MENU_INDEX_TYPE 3 + +typedef enum { + EventTypeTick, + EventTypeKey, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} PluginEvent; + +typedef enum { + ViewMode, + EditMode, + MenuMode, +} Mode; + +typedef struct { + char* name; + int numberOfDigits; + int startPos; +} BarcodeType; + +typedef struct { + int barcodeNumeral[12]; //The current barcode number + int editingIndex; //The index of the editing symbol + int menuIndex; //The index of the menu cursor + Mode mode; //View, edit or menu + bool doParityCalculation; //Should do parity check? + int barcodeTypeIndex; +} PluginState; + +static const int DIGITS[10][4] = { + {3, 2, 1, 1}, + {2, 2, 2, 1}, + {2, 1, 2, 2}, + {1, 4, 1, 1}, + {1, 1, 3, 2}, + {1, 2, 3, 1}, + {1, 1, 1, 4}, + {1, 3, 1, 2}, + {1, 2, 1, 3}, + {3, 1, 1, 2}, +};