| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | //! @file//! @date Jun 20, 2019//! @author Marek Běl#include "eeprom.h"#include "Marlin.h"#include <avr/eeprom.h>#include <stdint.h>#include "language.h"#if 0template <typename T>static T eeprom_read(T *address);template<>char eeprom_read<char>(char *address){    return eeprom_read_byte(reinterpret_cast<uint8_t*>(address));}#endiftemplate <typename T>static void eeprom_write(T *address, T value);template<>void eeprom_write<char>(char *addres, char value){    eeprom_write_byte(reinterpret_cast<uint8_t*>(addres), static_cast<uint8_t>(value));}template <typename T>static bool eeprom_is_uninitialized(T *address);template <>bool eeprom_is_uninitialized<char>(char *address){    return (0xff == eeprom_read_byte(reinterpret_cast<uint8_t*>(address)));}bool eeprom_is_sheet_initialized(uint8_t sheet_num){  return (0xffff != eeprom_read_word(reinterpret_cast<uint16_t*>(&(EEPROM_Sheets_base->  s[sheet_num].z_offset))));}void eeprom_init(){    if (eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) == 0xff) eeprom_write_byte((uint8_t*)EEPROM_POWER_COUNT, 0);    if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X) == 0xff) eeprom_write_byte((uint8_t*)EEPROM_CRASH_COUNT_X, 0);    if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y) == 0xff) eeprom_write_byte((uint8_t*)EEPROM_CRASH_COUNT_Y, 0);    if (eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) == 0xff) eeprom_write_byte((uint8_t*)EEPROM_FERROR_COUNT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) == 0xffff) eeprom_write_word((uint16_t*)EEPROM_POWER_COUNT_TOT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT) == 0xffff) eeprom_write_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) == 0xffff) eeprom_write_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) == 0xffff) eeprom_write_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) == 0xffff) eeprom_update_word((uint16_t *)EEPROM_MMU_FAIL_TOT, 0);    if (eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) == 0xffff) eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0);    if (eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);    if (eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);    if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE)    {        eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), 0);        // When upgrading from version older version (before multiple sheets were implemented in v3.8.0)        // Sheet 1 uses the previous Live adjust Z (@EEPROM_BABYSTEP_Z)        int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z);        eeprom_update_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep);    }        for (uint_least8_t i = 0; i < (sizeof(Sheets::s)/sizeof(Sheets::s[0])); ++i)    {        bool is_uninitialized = true;        for (uint_least8_t j = 0; j < (sizeof(Sheet::name)/sizeof(Sheet::name[0])); ++j)        {            if (!eeprom_is_uninitialized(&(EEPROM_Sheets_base->s[i].name[j]))) is_uninitialized = false;        }        if(is_uninitialized)        {            SheetName sheetName;            eeprom_default_sheet_name(i,sheetName);            for (uint_least8_t a = 0; a < sizeof(Sheet::name); ++a){                eeprom_write(&(EEPROM_Sheets_base->s[i].name[a]), sheetName.c[a]);            }        }    }    if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))))    {        eeprom_switch_to_next_sheet();    }    check_babystep();#ifdef PINDA_TEMP_COMPif (eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION, 0);#endif //PINDA_TEMP_COMP	if (eeprom_read_dword((uint32_t*)EEPROM_JOB_ID) == EEPROM_EMPTY_VALUE32)		eeprom_update_dword((uint32_t*)EEPROM_JOB_ID, 0);}//! @brief Get default sheet name for index//!//! | index | sheetName |//! | ----- | --------- |//! | 0     | Smooth1   |//! | 1     | Smooth2   |//! | 2     | Textur1   |//! | 3     | Textur2   |//! | 4     | Satin 1   |//! | 5     | Satin 2   |//! | 6     | Custom1   |//! | 7     | Custom2   |//!//! @param[in] index//! @param[out] sheetNamevoid eeprom_default_sheet_name(uint8_t index, SheetName &sheetName){    static_assert(8 == sizeof(SheetName),"Default sheet name needs to be adjusted.");    if (index < 2)    {        strcpy_P(sheetName.c, PSTR("Smooth"));    }    else if (index < 4)    {        strcpy_P(sheetName.c, PSTR("Textur"));    }    else if (index < 6)    {        strcpy_P(sheetName.c, PSTR("Satin "));    }    else    {        strcpy_P(sheetName.c, PSTR("Custom"));    }    sheetName.c[6] = '0' + ((index % 2)+1);    sheetName.c[7] = '\0';}//! @brief Get next initialized sheet//!//! If current sheet is the only sheet initialized, current sheet is returned.//!//! @param sheet Current sheet//! @return next initialized sheet//! @retval -1 no sheet is initializedint8_t eeprom_next_initialized_sheet(int8_t sheet){    for (int8_t i = 0; i < static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet)); ++i)    {        ++sheet;        if (sheet >= static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0;        if (eeprom_is_sheet_initialized(sheet)) return sheet;    }    return -1;}void eeprom_switch_to_next_sheet(){    int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));    sheet = eeprom_next_initialized_sheet(sheet);    if (sheet >= 0) eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), sheet);}
 |