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