package lejos.nxt; /** * This class is designed for use by other lejos classes to * read persistent settings. User programs should use the Settings class * * @author Lawrie Griffiths * */ public class SystemSettings { private static final int SETTINGS_PAGE = 0; private static final int MAX_SETTING_SIZE = 16; private static byte[] buf = new byte[256]; private static final String version = "NXJ Settings 1.0"; private static final String versionName = "settings.version"; // Add to this String array to define new persistent // settings. There is a maximum of 16 including the version. private static final String[] names = { versionName, "lejos.volume", "lejos.default_program", "lejos.keyclick_volume", "lejos.default_autoRun", "lejos.sleep_time", "lejos.usb_serno", "lejos.usb_name", "lejos.bluetooth_pin" }; /** * Read the settings page */ static { Flash.readPage(buf, SETTINGS_PAGE); // Intialize page to all zeros and set version in slot 0, // if settings not already set up. if (!getValue(0).equals(version)) { for(int i=0;i<Flash.BYTES_PER_PAGE;i++) buf[i] = 0; setSetting(versionName,version); }; } /** * Get the slot number where a setting is stored * * @param key the setting name * @return the slot number (0 - 15) * */ static int getSlot(String key) { for(int i= 0;i<names.length;i++) { if (names[i].equals(key)) return i; } return -1; } /** * Write the String value of a setting to a slot * * @param slot the slot (0 - 15) * @param value the String value */ static void setSlot(int slot, String value) { for(int i=0;i<MAX_SETTING_SIZE;i++) buf[slot*MAX_SETTING_SIZE+i] = 0; for(int i=0;i<value.length();i++) buf[slot*MAX_SETTING_SIZE+i] = (byte) value.charAt(i); } /** * Get the String value from a slot * * @param slot the slot number * @return the contents of the slot as a String */ static String getValue(int slot) { int l = 0; for(int i=0;i<MAX_SETTING_SIZE && buf[slot*MAX_SETTING_SIZE+i] != 0;i++) l++; char[] chars = new char[l]; for(int i=0;i<l;i++) chars[i] = (char) buf[slot*MAX_SETTING_SIZE+i]; return new String(chars); } /** * Get the value for a leJOS NXJ persistent setting as a String * * @param key the name of the setting * @param defaultValue the default value * @return the value */ public static String getStringSetting(String key, String defaultValue) { int slot = getSlot(key); if (slot < 0) return defaultValue; else { String s = getValue(slot); if (s.length() == 0) return defaultValue; else return s; } } /** * Get the value for a leJOS NXJ persistent setting as an Integer * * @param key the name of the setting * @param defaultValue the default value * @return the value */ public static int getIntSetting(String key, int defaultValue) { String s = getStringSetting(key, null); if (s == null) { return defaultValue; } else { try { return Integer.parseInt(s); } catch (NumberFormatException e) { return defaultValue; } } } /** * Set a leJOS NXJ persistent setting. * * @param key the name of the setting * @param value the value to set it to */ static void setSetting(String key, String value) { int slot = getSlot(key); if (slot >= 0) { setSlot(slot, value); Flash.writePage(buf, SETTINGS_PAGE); } } /** * Get the names of the the leJOS NXJ Settings * * @return a String array of the names */ static String[] getSettingNames() { return names; } }