Перейти к содержанию
    

scmRtos для медных чайников

по ходу дела всегда можно что-то подправить/изменить/добавить.

Ну да, что и происходит.

Посмотри пожалуйста.

 

template<typename cs_pin>
class TDisplay
{
  private:
      spi_base_t& spi;
      typedef cs_pin LCD_CS;
      
      Pin<2, 6, 'H'> LCD_RS;    // H for Data, L for Command
      Pin<1, 4, 'L'> LCD_RST;   // Active 0, set to it during CSL
      uint8_t   status;         // 1/0 - On/Off. OLED requires to be off when not in use
      
      unsigned char   *font;
      uint8_t fontnumber, fontwidth, fontheight;
      uint8_t x, y; // position on the screen
      
      inline void select(void) { spi.lock(); LCD_CS::On(); }
      inline void deselect(void) { LCD_CS::Off(); spi.unlock();  }
      inline void send(uint8_t data) { spi << data; }
      void send_array(uint8_t *data, uint16_t count)
      { select();
        for(uint16_t i=0; i<count; i++)
          spi << data[i];
        deselect();
      }
      void send_command(uint8_t *data, uint16_t count);
      void send_data(uint8_t *data, uint16_t count);
      void goto_xy(uint8_t x, uint8_t y);
  public:
      TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref);            
      void Set_contrast(uint8_t data);
      
      uint8_t getstatus(void);
      void On(void);    // Because of using OLED display
      void Off(void);   // Because of using OLED display
      
      void SetFont(uint8_t num);
      uint8_t GetFont(void);
      void ClrLines(unsigned char startline, unsigned char linesnum);    // Clear number of text lines
      void ClrText(unsigned char line, unsigned char xpos, unsigned char length); // Clear part of the line
      void putchar(unsigned char ch, uint8_t xpos, uint8_t ypos);
      void putstring(char *string, uint8_t xpos, uint8_t ypos);
      void ShowFont(unsigned char num);
}

 

И несколько начальных функций. Не надо-ли что-то подправить? Хотелось бы понять перед тем, как перейду к описанию public функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. :rolleyes:

Массив init приведён просто для референса. С ним как раз более-менее всё понятно. :)

Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены :)

 

const uint8_t init[] =  {0x40,    //Display start line 0
                         0xa1,    //ADC reverse    <<<< Probably need to be changed
                         0xc0,    //Normal COM0...COM63
                         0xa6,    //Display normal
                         0xa2,    //Set Bias 1/9 (Duty 1/65)
                         0x2f,    //Booster, Regulator and Follower On
                         0xf8,    //Set internal Booster to 4x
                         0x00,
                         0x27,    //Contrast set
                         0x81,
                         0x16,
                         0xac,    //Set indicator
                         0x00,     //0x01,
                         0xAF, //};    //Display on
                         0xb0,    //Page start sddress 0
                         0x10,    //Set Higher Column Start Address 0
                         0x00     //Set Lower Column Start Address 0
                         };

/**************** Functions **************************************************/

void TDisplay::send_command(uint8_t *data, uint16_t count)
{
  LCD_RS::Off();    // switch to send command
  send_array(data, count);  // SPI CS controlled inside this function
}

void TDisplay::send_data(uint8_t *data, uint16_t count)
{
  LCD_RS::On();    // switch to send data
  send_array(data, count);  // SPI CS controlled inside this function
}

// Set symbol position in text mode 
//Parameter:
//     x:    X - Position on screen (0 - 127)
//     y:    Y - Position on screen (0 - 8)
void TDisplay::goto_xy(uint8_t x, uint8_t y);
{
  uint8_t set[] = {0xb0, 0x10, 0x00};    //Control commands array
  set[0] += y;        //Y - Add Y Position to Set Page Start Address
  set[1] += x >> 4;   //High - Nibble auf Steuerbefehl addieren
  set[2] += x & 0x0f; //Low - Nibble auf Steuerbefehl addieren
  send_command(set, 3);
}

//TDisplay constructor
TDisplay::TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref)
{
  LCD_RST::Off();   // unreset LCD
  
  send_command((uint8_t *)init, sizeof(init));  // Initialization

    for(uint8_t line=0; line<8; line++) // clear display memory 
    {
        goto_xy(0, line);
        spiref.select();
        send(0);
        spiref.deselect();
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я, честно говоря, не совсем понимаю, что я должен там высмотреть:)

В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё.

Единственное замечание: если у вас шаблон

template<typename cs_pin>
class TDisplay
{
...

, то реализация функций должна быть в том же *.h файле, и выглядеть вот так:

template<typename cs_pin>
void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count)
{
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, вот такие замечания и нужны :) Спасибо.

Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам :) Мне только, чтобы по форме правильно было.

 

А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр

Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле.

Короче, лучше про это почитать какую-нибудь книжку:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AHTOXA

получил сообщение в IAR

Error[Pe020]: identifier "namespace" is undefined      D:\Designs\M3\Firmware\M3_Terminal\scmRTOS\Common\usrlib.h 52

Пример Event компилируется. В нём такой ошибки, естественно, не возникает.

Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал?

 

Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять... :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

identifier "namespace" is undefined
говорит о том, что вы пытаетесть C++ заголовочный файл компилировать в режиме C. А это возможно, если вы какой-то из заголовочных файлов ОС (вероятно scmRTOS.h) прямо или косвенно включили в какой-то из файлов с расширением .c

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел опции компиляции. Там стоял автоматическкий выбор компилятора в зависимости от расширения. Поставил использование С++ - этот момент прошёл нормально.

Теперь пытаюсь понять, почему

Error[Pe864]: spi_t is not a template D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19 
Error[Pe020]: identifier "SPI1" is undefined D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19

при том, что spi.h включён в проект. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно:

#ifndef M3_TERMINAL_H
#define M3_TERMINAL_H

#define CSL_used

#include "Peripheral\pin.h"
#include "Peripheral\spi.h"

typedef spi_t<SPI1> TSpi1;
extern    TSpi1 spi1;

typedef TDisplay < Pin<2, 5, 'L'> > TDisplay;
extern    TDisplay    display;

#endif  // M3_TERMINAL_H

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. Странно.

1. Возможно где-то ещё есть объявление типа spi_t.

2. Я не разбираюсь в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.

3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался, мой косяк был - кросс ссылки на файлы .h :)

3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.

в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 ;)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.

А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

 

К примеру в Eclipse или Visual Studio хидеры включаются в проект. IAR EW - тоже какбы-IDE.

 

Разобрался, мой косяк был - кросс ссылки на файлы .h

Кросс ссылки - это что? Не представил...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:)

 

А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp.

Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.

Угу, именно так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...