Jump to content
    

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();
    }
}

Share this post


Link to post
Share on other sites

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

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

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

template<typename cs_pin>
class TDisplay
{
...

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

AHTOXA

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

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:

Share this post


Link to post
Share on other sites

Конечно:

#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

Share this post


Link to post
Share on other sites

Хм. Странно.

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

:)

 

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...