#include "X25128.h" #include "LCD.h" #include "ds1820.h" char current_main_menu[16]; char current_menu_number[2]; char nbr_of_termometers[1]; char nbr_of_other_menus; struct menu{ char string[16]; }; /* Initierar menyn, detta måste göras efter att find_slave är anropat, så att det är fastställt hur många termometrar det finns. */ void init_menu(void){ char nbr_of_other_menus; char address[2]; address[0] = 0x00; address[1] = 0x00; X25128_read_data(nbr_of_termometers, 0x01, address); nbr_of_other_menus = 0; nbr_of_termometers[0] = ds1820_nbr_of_thermos(); current_menu_number[0] = 0xFF; } /* Uppdaterar sub_menyn, används enbart internt. */ char menu_char_temp[4]; monitor void menu_update_sub_menu(void){ int int_temp[2]; char address[2]; int tmp; switch(current_menu_number[1]){ case 0: //Aktuellt värde tmp = (1 + (8 + 14 + 0 * 4)* nbr_of_termometers[0] + current_menu_number[0] * 4); break; case 1: //Min-värde tmp = (1 + (8 + 14 + 1 * 4)* nbr_of_termometers[0] + current_menu_number[0] * 4); LCD_write_string(0x41, "Min"); break; case 2: //Max-värde tmp = (1 + (8 + 14 + 2 * 4)* nbr_of_termometers[0] + current_menu_number[0] * 4); LCD_write_string(0x41, "Max"); break; /* case 3: //Medel-värde tmp = (1 + (8 + 14 + 3 * 4)* nbr_of_termometers[0] + current_menu_number[0] * 4); LCD_write_string(0x41, "Medel"); break; */ } address[1] = tmp%256; address[0] = tmp/256; X25128_read_data(menu_char_temp, 4, address); int_temp[0] = ds1820_convert_temp(menu_char_temp); //lägger heltalsdelen av temperaturen i int_temp[0] ds1820_convert_temp_decimals(menu_char_temp, int_temp); //lägger decimaldelen av temperaturen i char_temp[1] LCD_write_temp(0x47, int_temp); LCD_write_character(0x40, 0x3C); LCD_write_character(0x4F, 0x3E); } /* Ritar om hela menyn, samt hämtar nya mätvärden om det behövs. */ monitor void menu_update(void){ if(current_menu_number[0] != 0xFF){ LCD_cls(); LCD_write_string(0x01, current_main_menu); LCD_write_character(0x00, 0x7F); LCD_write_character(0x0F, 0x7E); menu_update_sub_menu(); } } /* Laddar in menyns namn från minnet, och uppdaterar skärmen */ void menu_update_main_menu(void){ char address[2]; address[0] = 0x00; address[1] = 0x01 + nbr_of_termometers[0] * 8 + current_menu_number[0] * 14; X25128_read_data(current_main_menu, 0x10, address); menu_update(); } /* Byter till nästa huvudmeny. */ void menu_next_main_menu(void){ if(current_menu_number[0] == 0xFF){ current_menu_number[0] = 0; } else{ current_menu_number[0] = (current_menu_number[0] + 1) % (nbr_of_termometers[0] + nbr_of_other_menus); } menu_update_main_menu(); } /* Byter till föregående huvudmeny. */ void menu_last_main_menu(void){ if(current_menu_number[0] == 0 || current_menu_number[0] == 0xFF) current_menu_number[0] = nbr_of_termometers[0] + nbr_of_other_menus - 1; else current_menu_number[0] = (current_menu_number[0] - 1); menu_update_main_menu(); } /* Byter till nästa submeny. */ void menu_next_sub_menu(void){ if(current_menu_number[0] < nbr_of_termometers[0]) current_menu_number[1] = (current_menu_number[1] + 1 + 3) % 3; else ; //Andra menyer än termometrar menu_update(); } /* Byter till föregående submeny. */ void menu_last_sub_menu(void){ if(current_menu_number[0] < nbr_of_termometers[0]) current_menu_number[1] = (current_menu_number[1] - 1 + 3) % 3; else ; //Andra menyer än termometrar menu_update(); } char menu_get_current_main_menu(void){ return current_menu_number[0]; }