Eclipse. Обновление ADT плагина

1. Добавляем новый репозиторий для обновлений: https://dl-ssl.google.com/android/eclipse/ (как это сделать см. "Eclipse. Добавление нового репозитория обновлений").

2. Идем в "Help -> Install New Software".



2. Посмотрим на старые версии ADT, для чего нажимаем ссылку "Already instaled".



3. Выбираем старые версии ADT, нажимаем кнопку "Uninstall".



4. В "Work with" выбираем репозиторий, который был добавлен ранее - https://dl-ssl.google.com/android/eclipse/



5. Устанавливаем галку напротив "Developer tools", нажимаем кнопку "Next".



Дополнительная информация на http://developer.android.com/sdk/installing/installing-adt.html

DELPHI XE. Изменение цвета контрола при использовании стилей

Для того, что бы изменить цвет контрола, например Label, при использовании стилей (тем - "Custom Style") в Delphi XE делаем так:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.StyleElements := [];
  Label1.Font.Color := Label1.Color; // или clRed, например
end;

AVRDUDESHELL. Программа для прошивки микроконтроллеров Atmega

AVRDUDESHELL – программа для Windows и Linux (под wine, начиная с версии 01.09.2015) систем для программирования (прошивки) микроконтроллеров семейства AVR, таких как ATmega8, ATmega16, ATmega32, ATmega64 (полный список поддерживаемых микроконтроллеров см. в конце статьи). Программа поддерживает такие популярные программаторы как USBASP, AVR910, STK500 (полный список поддерживаемых программаторов см. в конце статьи). Фактически AVRDUDESHELL это графическая надстройка над консольной программой AVRDude, поэтому все те микроконтроллеры и программаторы, которые поддерживает AVRDude, поддерживает и AVRDUDESHELL.


AVRDUDESHELL. Программа для прошивки микроконтроллеров Atmega.


Главное достоинство программы - универсальность, простота и наглядность.


AVRDUDESHELL. Главное окно программы.


Множество настроек сгруппированы по категориям:


AVRDUDESHELL. Настройки программы.


В программу встроен механизм получения информации по установленным фьюзам, получающий информацию с http://www.engbedded.com/.


AVRDUDESHELL. Информация по установленным фьюзам.


Оповещение об опасных манипуляциях с фьюзами предупредит о блокировке SPI программирования


AVRDUDESHELL. Оповещение об опасных манипуляциях с фьюзами.


Перед чтением или записью микроконтроллера можно задать область памяти, с которой будет выполняться операция.


AVRDUDESHELL. Область памяти с которой будет выполняться работа.


Если необходимо - можно сохранить


AVRDUDESHELL. Сохранение фьюзов.


а потом восстановить настройки фьюзов


AVRDUDESHELL. Загрузка фьюзов.


Содержит встроенный дизассемблер


AVRDUDESHELL. Встроенный дизассемблер.


Список поддерживаемых микроконтроллеров:

ATMEGA
ATmega103, ATmega128, ATmega1280, ATmega1281, ATmega1284P, ATmega128RFA1, ATmega16, ATmega161, ATmega162, ATmega163, ATmega164P, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega324P, ATmega325, ATmega3250, ATmega328P, ATmega329, ATmega3290, ATmega3290P, ATmega329P, ATmega48, ATmega64, ATmega640, ATmega644, ATmega644P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega88

ATTINY
ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny2313, ATtiny24, ATtiny25, ATtiny26, ATtiny261, ATtiny44, ATtiny45, ATtiny461, ATtiny84, ATtiny85, ATtiny861, ATtiny88

ATXMEGA
ATxmega128A1, ATxmega128A3, ATxmega16A4, ATxmega192A3, ATxmega256A3, ATxmega256A3B, ATxmega32A4, ATxmega64A1, ATxmega64A3

AT
AT90CAN128, AT90CAN32, AT90CAN64, AT90PWM2, AT90PWM2B, AT90PWM3, AT90PWM3B, AT90S1200, AT90S2313, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90USB1286, AT90USB1287, AT90USB162, AT90USB646, AT90USB647, AT90USB82

Список поддерживаемых программаторов:

89ISP, ABCMINI, ALF, ARDUINO, ATISP, AVR109, AVR910, AVR911, AVRISP, AVRISP2, AVRISPMKII, AVRISPV2, BASCOM, BLASTER, BSD, BUTTERFLY, C2N232I, DAPA, DASA, DASA3, DRAGON_DW, DRAGON_HVSP, DRAGON_ISP, DRAGON_JTAG, DRAGON_PP, DT006, ERE-ISP-AVR, FRANK-STK200, FUTURLEC, JTAG1, JTAG1SLOW, JTAG2, JTAG2DW, JTAG2FAST, JTAG2ISP, JTAG2SLOW, JTAGMKI, JTAGMKII, MIB510, PAVR, PICOWEB, PONYSER, PONY-STK200, SIPROG, SP12, STK200, STK500, STK500HVSP, STK500PP, STK500V1, STK500V2, STK600, STK600HVSP, STK600PP, USBASP, USBTINY, XIL

С историей обновлений можно ознакомиться тут.

Инструкция по настройке программы для работы в ОС Linux (wine) находится тут.

Скачать программу AVRDUDESHELL

AVRDUDESHELL. История обновлений

Это история обновлений программы для прошивки микроконтроллеров семейтва Atmega - AVRDUDESHELL на русском:

13.11.2017
  • Загрузка-выгрузка EEPROМ в формате *.bin
  • "Забой" памяти EEPROM и FLASH произвольным значением
  • Поддержка ANSI кодировки для русских символов
  • 27.10.2017
  • Реализована возможность сохранения дизассемблированного кода.
  • 11.07.2017
  • Изменен порядок записи фьюзов.
  • 27.06.2017
  • Изменен порядок записи фьюзов.
  • 21.12.2016
  • Устранена ошибка записи HI, LOW, LOCK фьюзов для ATtiny13.
  • 01.09.2016
  • Устранена ошибка записи EXTENDED фьюзов для некоторых чипов.
  • 21.06.2016
  • Новая версия avrdude6.3 в комплекте (устранена ошибка программирования Atmega64, Atmega128).
  • Реализован "градусник" выполнения операций с чипом.
  • 13.06.2016
  • Реализованы функции создания случайных FLASH и EEPROM данных.
  • Реализована проверка записи чипа.
  • 13.05.2016
  • Реализовано масштабирование главной формы для мониторов с высоким разрешением.
  • 28.04.2016
  • Исправлен интерфейс при отображении с "нестандартными" настройками шрифтов в системе.
  • 19.04.2016
  • Изменения в службе обновлений под протокол HTTPS.
  • 18.01.2016
  • Устранена ошибка связи с Интернет.
  • Устранена ошибка программирования EEPROM последних значений FF.
  • 01.09.2015
  • Работа под ОС Linux (wine).
  • Устранена ошибка дизассемблера в случае "пустого" HEX файла.
  • 03.02.2015
  • Поддержка нескольких программ avrdude одновременно.
  • Поддержка FTDI программирования чипов.
  • Поддержка программы avrdude до версии 6.1.
  • Дизассемблер версии 1.00.
  • 21.01.2015
  • Качественно новая версия программы.
  • Переезд на новую площадку.
  • Новый дизайн.
  • Возможность сохранять и восстанавливать настройки фьюзов.
  • Теперь все формы можно растягивать.
  • Автоматическое открытие файлов проекта.
  • Строка адресов для дампов FLASH и EEPROM.
  • Строка адресов может расчитыватся автоматически.
  • Возможность связи *.hex, *.eep, *.fus файлов с приложением.
  • Загрузка файлов *.hex, *.eep, *.fus из командной строки.
  • Альфа 0.98 версия дизассемблера.
  • Устранена ошибка прописных и строчных символов при задании порта подключения программатора.
  • Устранена ошибка сохранения первого байта в файлы *.hex, *.eep.
  • Устранена ошибка размера дампа при автоматическом обновлении файлов проекта.
  • 09.12.2013
  • Уточнен перевод.
  • Устранена ошибка - теперь обновления можно отключать.
  • 09.09.2013
  • Доработка механизма обновления программы в связи с переездом на новую площадку.
  • 08.01.2013
  • Доработан механизм работы с фьюзами для младшего семейства микроконтроллеров типа ATtiny.
  • Добавлено описание фьюзов для микроконтроллера ATtiny11, ATtiny12.
  • Добавлена кнопка редактирования файла конфигурации AVRDUDE.
  • Добавлена кнопка копирования в буфер обмена командной строки.
  • Добавлен перевод некоторых фраз.
  • 28.11.2012
  • Первая стабильная версия программы

  • и английском:

    13.11.2017
  • Загрузка-выгрузка EEPROМ в формате *.bin
  • "Забой" памяти EEPROM и FLASH произвольным значением
  • Поддержка ANSI кодировки для русских символов
  • 27.10.2017
  • Реализована возможность сохранения дизассемблированного кода.
  • 11.07.2017
  • Изменен порядок записи фьюзов.
  • 27.06.2017
  • Изменен порядок записи фьюзов.
  • 21.12.2016
  • Устранена ошибка записи HI, LOW, LOCK фьюзов для ATtiny13.
  • 01.09.2016
  • Устранена ошибка записи EXTENDED фьюзов для некоторых чипов.
  • 21.06.2016
  • Новая версия avrdude6.3 в комплекте (устранена ошибка программирования Atmega64, Atmega128).
  • Реализован "градусник" выполнения операций с чипом.
  • 13.06.2016
  • Реализованы функции создания случайных FLASH и EEPROM данных.
  • Реализована проверка записи чипа.
  • 13.05.2016
  • Реализовано масштабирование главной формы для мониторов с высоким разрешением.
  • 28.04.2016
  • Исправлен интерфейс при отображении с "нестандартными" настройками шрифтов в системе.
  • 19.04.2016
  • Изменения в службе обновлений под протокол HTTPS.
  • 18.01.2016
  • Устранена ошибка связи с Интернет.
  • Устранена ошибка программирования EEPROM последних значений FF.
  • 01.09.2015
  • Работа под ОС Linux (wine).
  • Устранена ошибка дизассемблера в случае "пустого" HEX файла.
  • 03.02.2015
  • Поддержка нескольких программ avrdude одновременно.
  • Поддержка FTDI программирования чипов.
  • Поддержка программы avrdude до версии 6.1.
  • Дизассемблер версии 1.00.
  • 21.01.2015
  • Качественно новая версия программы.
  • Переезд на новую площадку.
  • Новый дизайн.
  • Возможность сохранять и восстанавливать настройки фьюзов.
  • Теперь все формы можно растягивать.
  • Автоматическое открытие файлов проекта.
  • Строка адресов для дампов FLASH и EEPROM.
  • Строка адресов может расчитыватся автоматически.
  • Возможность связи *.hex, *.eep, *.fus файлов с приложением.
  • Загрузка файлов *.hex, *.eep, *.fus из командной строки.
  • Альфа 0.98 версия дизассемблера.
  • Устранена ошибка прописных и строчных символов при задании порта подключения программатора.
  • Устранена ошибка сохранения первого байта в файлы *.hex, *.eep.
  • Устранена ошибка размера дампа при автоматическом обновлении файлов проекта.
  • 09.12.2013
  • Уточнен перевод.
  • Устранена ошибка - теперь обновления можно отключать.
  • 09.09.2013
  • Доработка механизма обновления программы в связи с переездом на новую площадку.
  • 08.01.2013
  • Доработан механизм работы с фьюзами для младшего семейства микроконтроллеров типа ATtiny.
  • Добавлено описание фьюзов для микроконтроллера ATtiny11, ATtiny12.
  • Добавлена кнопка редактирования файла конфигурации AVRDUDE.
  • Добавлена кнопка копирования в буфер обмена командной строки.
  • Добавлен перевод некоторых фраз.
  • 28.11.2012
  • Первая стабильная версия программы

  • Скачать программу можно на официальной станице.

    Eclipse. Добавление нового репозитория обновлений

    1. Идем "Windows -> Preferens"



    2. Добавляем новый репозиторий в список на вкладке "Install/Update -> Available Software Sites"


    Eclipse. Настройка папки SDK

    Идем в "Windows -> Preferences". Переходим на вкладку "Android", редактируем поле "SDK Location".

    Eclipse. Настройка папки SDK

    Android. SQLite пример использования

    Нашел очень классный пример работы с БД SQLite на http://hmkcode.com/android-simple-sqlite-database-tutorial/, настолько наглядный, что переписал его себе.

    1. Класс для работы с записями таблице:
    package com.hmkcode.android.model;
     
    public class Book {
     
        private int id;
        private String title;
        private String author;
     
        public Book(){}
     
        public Book(String title, String author) {
            super();
            this.title = title;
            this.author = author;
        }
     
        //getters & setters
     
        @Override
        public String toString() {
            return "Book [id=" + id + ", title=" + title + ", author=" + author
                    + "]";
        }
    }
    


    2. Класс для работы с БД:
    package com.hmkcode.android.sqlite;
     
    import java.util.LinkedList;
    import java.util.List;
     
    import com.hmkcode.android.model.Book;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
     
    public class MySQLiteHelper extends SQLiteOpenHelper {
     
        // Database Version
        private static final int DATABASE_VERSION = 1;
        // Database Name
        private static final String DATABASE_NAME = "BookDB";
     
        public MySQLiteHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION); 
        }
     
        @Override
        public void onCreate(SQLiteDatabase db) {
            // SQL statement to create book table
            String CREATE_BOOK_TABLE = "CREATE TABLE books ( " +
                    "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "title TEXT, "+
                    "author TEXT )";
     
            // create books table
            db.execSQL(CREATE_BOOK_TABLE);
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Drop older books table if existed
            db.execSQL("DROP TABLE IF EXISTS books");
     
            // create fresh books table
            this.onCreate(db);
        }
        //---------------------------------------------------------------------
     
        /**
         * CRUD operations (create "add", read "get", update, delete) book + get all books + delete all books
         */
     
        // Books table name
        private static final String TABLE_BOOKS = "books";
     
        // Books Table Columns names
        private static final String KEY_ID = "id";
        private static final String KEY_TITLE = "title";
        private static final String KEY_AUTHOR = "author";
     
        private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR};
     
        public void addBook(Book book){
            Log.d("addBook", book.toString());
            // 1. get reference to writable DB
            SQLiteDatabase db = this.getWritableDatabase();
     
            // 2. create ContentValues to add key "column"/value
            ContentValues values = new ContentValues();
            values.put(KEY_TITLE, book.getTitle()); // get title
            values.put(KEY_AUTHOR, book.getAuthor()); // get author
     
            // 3. insert
            db.insert(TABLE_BOOKS, // table
                    null, //nullColumnHack
                    values); // key/value -> keys = column names/ values = column values
     
            // 4. close
            db.close();
        }
     
        public Book getBook(int id){
     
            // 1. get reference to readable DB
            SQLiteDatabase db = this.getReadableDatabase();
     
            // 2. build query
            Cursor cursor =
                    db.query(TABLE_BOOKS, // a. table
                    COLUMNS, // b. column names
                    " id = ?", // c. selections
                    new String[] { String.valueOf(id) }, // d. selections args
                    null, // e. group by
                    null, // f. having
                    null, // g. order by
                    null); // h. limit
     
            // 3. if we got results get the first one
            if (cursor != null)
                cursor.moveToFirst();
     
            // 4. build book object
            Book book = new Book();
            book.setId(Integer.parseInt(cursor.getString(0)));
            book.setTitle(cursor.getString(1));
            book.setAuthor(cursor.getString(2));
     
            Log.d("getBook("+id+")", book.toString());
     
            // 5. return book
            return book;
        }
     
        // Get All Books
        public List<Book> getAllBooks() {
            List<Book> books = new LinkedList<Book>();
     
            // 1. build the query
            String query = "SELECT  * FROM " + TABLE_BOOKS;
     
            // 2. get reference to writable DB
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor cursor = db.rawQuery(query, null);
     
            // 3. go over each row, build book and add it to list
            Book book = null;
            if (cursor.moveToFirst()) {
                do {
                    book = new Book();
                    book.setId(Integer.parseInt(cursor.getString(0)));
                    book.setTitle(cursor.getString(1));
                    book.setAuthor(cursor.getString(2));
     
                    // Add book to books
                    books.add(book);
                } while (cursor.moveToNext());
            }
     
            Log.d("getAllBooks()", books.toString());
     
            // return books
            return books;
        }
     
         // Updating single book
        public int updateBook(Book book) {
     
            // 1. get reference to writable DB
            SQLiteDatabase db = this.getWritableDatabase();
     
            // 2. create ContentValues to add key "column"/value
            ContentValues values = new ContentValues();
            values.put("title", book.getTitle()); // get title
            values.put("author", book.getAuthor()); // get author
     
            // 3. updating row
            int i = db.update(TABLE_BOOKS, //table
                    values, // column/value
                    KEY_ID+" = ?", // selections
                    new String[] { String.valueOf(book.getId()) }); //selection args
     
            // 4. close
            db.close();
     
            return i;
     
        }
     
        // Deleting single book
        public void deleteBook(Book book) {
     
            // 1. get reference to writable DB
            SQLiteDatabase db = this.getWritableDatabase();
     
            // 2. delete
            db.delete(TABLE_BOOKS,
                    KEY_ID+" = ?",
                    new String[] { String.valueOf(book.getId()) });
     
            // 3. close
            db.close();
     
            Log.d("deleteBook", book.toString());
     
        }
    }
    


    2. И пример использования:
    package com.hmkcode.android;
     
    import java.util.List;
    import com.hmkcode.android.model.Book;
    import com.hmkcode.android.sqlite.MySQLiteHelper;
    import android.os.Bundle;
    import android.app.Activity;
     
    public class MainActivity extends Activity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            MySQLiteHelper db = new MySQLiteHelper(this);
     
            /**
             * CRUD Operations
             * */
            // add Books
            db.addBook(new Book("Android Application Development Cookbook", "Wei Meng Lee"));  
            db.addBook(new Book("Android Programming: The Big Nerd Ranch Guide", "Bill Phillips and Brian Hardy"));      
            db.addBook(new Book("Learn Android App Development", "Wallace Jackson"));
     
            // get all books
            List<Book> list = db.getAllBooks();
     
            // delete one book
            db.deleteBook(list.get(0));
     
            // get all books
            db.getAllBooks();
     
        }
     
    }
    


    На основании этой статьи была разработана программа для автоматиеского создания java классов для работы с БД SQLite - SQLiteCreator.