Что нового?
По сравнению с предыдущими решениями OpenCPU, новый OpenCPU модуль предоставляет RIL драйвер на уровне User API, который значительно облегчает разработку. Когда разработчик посылает AT команды ядру системы, полученные ответы обрабатываются сперва в RIL, а затем RIL возвращает данные в приложение. Следующий код демонстрирует различия в деталях.
Новое OpenCPU решение:
s32 RIL_NW_GetSignalQuality(u32 * rssi, u32 * ber) { s32 retRes = 0; char strAT[] = "AT+CSQ\0"; ST_CSQ_Reponse pCSQ_Reponse; // Здесь отправка “AT+CSQ” команды retRes = Ql_RIL_SendATCmd(strAT,Ql_strlen(strAT), ATResponse_CSQ_Handler,(void*)&pCSQ_Reponse,0); // Теперь ответ на “AT+CSQ” записывается в pCSQ_Reponse и из нее можно получить значение CSQ if(RIL_AT_SUCCESS == retRes) { *rssi = pCSQ_Reponse.rssi; *ber = pCSQ_Reponse.ber; } return retRes; }
Ранее используемое OpenCPU решение:
// Здесь отправка “AT+CSQ” команды void SendAtCmd() { s32 ret; ret = Ql_SendToModem(ql_md_port1, (u8*)"AT+CSQ\r", Ql_strlen("AT+CSQ\r")); } //Здесь получаем ответ “AT+CSQ” в главном цикле программы. void ql_entry( ) { switch (g_cmd_idx) { case 1:// Echo mode off Ql_sprintf((char *)buffer, "ATE0\n"); while(1) { Ql_GetEvent(&g_event); switch(g_event.eventType) { case EVENT_MODEMDATA: { //TODO: receive and handle data from CORE through virtual modem port PortData_Event* pPortEvt = (PortData_Event*)&g_event.eventData.modemdata_evt; // Here receive URC and the AT response break; } } } } }
Поддержка GCC компилятора
M66 OpenCPU поддерживает бесплатный компилятор GCC от Sourcery CodeBench ARM EABI, а также поддерживает ARM RVCT компилятор. Предыдущий OpenCPU поддерживал лишь RVCT.
Поддержка IDE
M66 OpenCPU поддерживает большое количество инструментов таких, как Source Insight, Eclipse и Microsoft Visual Studio.
Простота конфигурации и инициализации GPIO
M66 OpenCPU предоставляет очень простой метод конфигурации и инициализации GPIO. Далее простой пример кода инициализации пина NETLIGHT. После подачи питания NETLIGHT пин должен быть сконфигурирован как выход с низким уровнем и подтяжкой к нулю.
Имя функции / Название пина / Направление вход-выход / Уровень / Подтяжка GPIO_ITEM ( PINNAME_NETLIGHT, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLDOWN)
Кроме того, разработчик может вызвать API функцию перепрограммирования GPIO. Например, вызов QI_GPIO_SetLevel() может изменить логический уровень на пине GPIO.
Простота добавления новой задачи (потока)
Добавить новую задачу стало еще проще, просто добавив ее в “custom_task_cfg.h” файл.
ID имя задачи: Разработчик может определить имя задачи и система будет автоматически определять и присваивать значение.
Размер стека задачи: Диапазон размера стека в пределах от 1 до 10 кбайт, если есть какие-либо операции с файлами в задаче, то размер стека должен быть установлен по меньшей мере в 5 кбайт, чтобы предотвратить переполнение стека.
TASK_ITEM (Proc_main_task, main_task_id, 4*1024, DEFAULT_VALUE1, DEFAULT_VALUE2)
Программирование пина Power Key в приложении
Дадим пример как включать и выключать питание модуля с помощью пина Power Key.
static const ST_PowerKeyCfg pwrkeyCfg = { { TRUE, // включение питания по нажатию PWRKEY TRUE, // выключение питания по нажатию PWRKEY };
Программирование пина Reset в приложении
EMERG_OFF пин может работать в двух режимах. Один режим “Power Down” и другой “Reset”, который как раз и есть режим по умолчанию:
static const ST_EmergOffCfg emergoffCfg = { EMERGOFF_RESET };
В режиме EMERGOFF_RESET по низкому логическом уровню на пине EMERG_OFF модуль сбросится.
В режиме EMERGOFF_POWEROFF по низкому логическом уровню на пине EMERG_OFF модуль выключится.
Язык программирования для пользовательского приложения по умолчанию Си.
static const ST_PowerKeyCfg pwrkeyCfg = {
{
TRUE, // включение питания по низкому уровню на входе PWRKEY
TRUE, // выключение питания по низкому уровню на входе PWRKEY
};