Chudik 0 13 октября, 2012 Опубликовано 13 октября, 2012 · Жалоба по ходу дела всегда можно что-то подправить/изменить/добавить. Ну да, что и происходит. Посмотри пожалуйста. 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(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 13 октября, 2012 Опубликовано 13 октября, 2012 · Жалоба Я, честно говоря, не совсем понимаю, что я должен там высмотреть:) В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё. Единственное замечание: если у вас шаблон template<typename cs_pin> class TDisplay { ... , то реализация функций должна быть в том же *.h файле, и выглядеть вот так: template<typename cs_pin> void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count) { ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 13 октября, 2012 Опубликовано 13 октября, 2012 · Жалоба Ну, вот такие замечания и нужны :) Спасибо. Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам :) Мне только, чтобы по форме правильно было. А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле. Короче, лучше про это почитать какую-нибудь книжку:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба AHTOXA получил сообщение в IAR Error[Pe020]: identifier "namespace" is undefined D:\Designs\M3\Firmware\M3_Terminal\scmRTOS\Common\usrlib.h 52 Пример Event компилируется. В нём такой ошибки, естественно, не возникает. Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал? Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять... :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Я в IAR-е не копенгаген:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 139 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба identifier "namespace" is undefinedговорит о том, что вы пытаетесть C++ заголовочный файл компилировать в режиме C. А это возможно, если вы какой-то из заголовочных файлов ОС (вероятно scmRTOS.h) прямо или косвенно включили в какой-то из файлов с расширением .c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Посмотрел опции компиляции. Там стоял автоматическкий выбор компилятора в зависимости от расширения. Поставил использование С++ - этот момент прошёл нормально. Теперь пытаюсь понять, почему 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба А в файле M3_Terminal.h есть строчка #include "spi.h" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Конечно: #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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Хм. Странно. 1. Возможно где-то ещё есть объявление типа spi_t. 2. Я не разбираюсь в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо. 3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Разобрался, мой косяк был - кросс ссылки на файлы .h :) 3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа. в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо. А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. К примеру в Eclipse или Visual Studio хидеры включаются в проект. IAR EW - тоже какбы-IDE. Разобрался, мой косяк был - кросс ссылки на файлы .h Кросс ссылки - это что? Не представил... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 19 октября, 2012 Опубликовано 19 октября, 2012 · Жалоба в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 ;) :) А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp. Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 19 октября, 2012 Опубликовано 19 октября, 2012 · Жалоба Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно. Угу, именно так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться