//char text[] = "{\"msg_type\":\"ctr\",\"deviceid\":\"113344\",\"bcm_fun_trunklock\":\"ON\"}"; static void thread_sim900_rx_entry(void *parg) { INT8U err; uint8_t start = 0; uint8_t thischar = 0; parg = parg; printf("Enter: %s\r\n", __func__); while(1) { OSSemPend(rx_semaphore, 0, &err); if(err != OS_NO_ERR) continue; while(rb_get(&rx_rb, &thischar, 1) == TRUE) { printf("%c", thischar); if(status == STATUS_CONNECTED) { if(thischar == '{') { clear_rx_buf(); start = 1; rx_buffer[rx_offset ++] = thischar; } else if(thischar == '}') { rx_buffer[rx_offset ++] = thischar; start = 0; if(rx_offset >= 10) { if(recvFunc != NULL) recvFunc((uint8_t *)rx_buffer); } } else { if(start) rx_buffer[rx_offset ++] = thischar; } } else // init part { rx_buffer[rx_offset ++] = thischar; } } } }
void sim900_connect(void) { uint8_t i = 0; uint8_t retry = 3; printk("connect...\r\n"); while(1) { switch(status) { case STATUS_POWERON: sim900_poweron(); clear_rx_buf(); printk("wait for at done\r\n"); for(i = 0; i < retry; i++) { sim900_write("AT\r\n", 4); //sim900_wait(5000000); OSTimeDlyHMSM(0, 0, 0, 400); if(!check_at()) { status = STATUS_CONFIG; break; } clear_rx_buf(); } break; //case STATUS_INIT: case STATUS_CONFIG: printk("wait for config done\r\n"); OSTimeDlyHMSM(0, 0, 10, 0); sim900_write("AT+CREG?\r\n", 10); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CIPMODE=1\r\n", 14); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CGATT?\r\n", 11); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CSTT=\"CMNET\"\r\n", 17); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CIICR\r\n", 10); OSTimeDlyHMSM(0, 0, 2, 0); printk("try to get ip address\r\n"); sim900_write("AT+CIFSR\r\n", 10); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CGATT=1\r\n", 12); OSTimeDlyHMSM(0, 0, 0, 100); sim900_write("AT+CGSN\r\n", 9); OSTimeDlyHMSM(0, 0, 0, 100); status = STATUS_CONNECTING; break; case STATUS_CONNECTING: printk("wait for connecting...\r\n"); sim900_write("AT+CIPSTATUS\r\n", 14); OSTimeDlyHMSM(0, 0, 2, 0); for(i = 0; i < 1; i++) { clear_rx_buf(); sim900_write(connect_cmd, strlen((char *)&connect_cmd[0])); OSTimeDlyHMSM(0, 0, 3, 0); if(!check_at()) { status = STATUS_CONNECTED; break; } clear_rx_buf(); } if(i >= 1) { //retry failed sim900_write("+++\r\n", 5); OSTimeDlyHMSM(0, 0, 1, 0); sim900_write("AT+CIPCLOSE\r\n", 13); OSTimeDlyHMSM(0, 0, 1, 0); sim900_write("AT+CIPSHUT\r\n", 12); OSTimeDlyHMSM(0, 0, 1, 0); status = STATUS_CONFIG; } break; case STATUS_CONNECTED: printk("Connect done!\r\n"); clear_buf(); return; default: break; } } }
static int Send_Selecting(unsigned char *p, int length) /****************************************************************/ { int i = 0; int st; int result = 0; //unsigned char text[32]; int sendRetry = 0; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 500000000; //0.5sec if(g_dbgShow) printf(" -S- SELECTING\n"); st = SEL_START_MSG; for(;;) { switch (st) { case SEL_START_MSG: //if(g_dbgShow) printf(" -S- SEL_START_MSG\n"); clear_rx_buf(); comm_start_msg(TYPE_SEL); // selecting protocol st = SEL_RECEIVE_START_ACK; break; case SEL_RECEIVE_START_ACK: //if(g_dbgShow) printf(" -S- SEL_RECEIVE_START_ACK\n"); //sleep(1); //nanosleep(&ts, NULL); //IfaceGhpSelectSleep(0, 50); // jong2ry 2011_0303 //IfaceGhpSelectSleep(0, 500); IfaceGhpSelectSleep(0, 100); clear_rx_buf(); //result = RecvUart2(rxbuf, sizeof(rxbuf)); result = OnReadIn(); if ( g_dbgShow ) printf(" -S- Get Ack result = %d, %x\n", result, rxbuf[0]); //for (i = 0; i < result; i++) // printf("%c ",rxbuf[i]); //printf("\n############################\n"); if (result == 1 && rxbuf[0] == 0x06) //if (result = 1 && rxbuf[0] == 0x06) //if (rxbuf[result - 1] == 0x06) { st = SEL_SEND_TEXT; break; } else { if (sendRetry > 5) { comm_eot_msg(); return SEL_RETRY; } else { st = SEL_START_MSG; sendRetry++; //sleep(1); IfaceGhpSelectSleep(1, 0); } break; } break; case SEL_SEND_TEXT: if(g_dbgShow) printf(" -S- SEL_SEND_TEXT\n"); //SendUart2(p, length); OnWriteOut(p, length); if ( g_dbgShow ) { for (i = 0; i < length; i++) printf("%c ",p[i]); printf("\n"); } st = SEL_RECEIVE_TEXT_ACK; break; case SEL_RECEIVE_TEXT_ACK: //if(g_dbgShow) printf(" -S- SEL_RECEIVE_TEXT_ACK\n"); //sleep(1); //nanosleep(&ts, NULL); // jong2ry 2011_0303 //IfaceGhpSelectSleep(0, 500); IfaceGhpSelectSleep(0, 100); clear_rx_buf(); //result = RecvUart2(rxbuf, sizeof(rxbuf)); result = OnReadIn(); //for (i = 0; i < result; i++) // printf("%x ",rxbuf[i]); //printf("\n"); st = SEL_SEND_EOT; break; case SEL_SEND_EOT: if(g_dbgShow) printf(" -S- SEL_SEND_EOT\n"); comm_eot_msg(); return SEL_OK; } } }
int iface_ghp_main(void) /****************************************************************/ { //int i = 0; //unsigned char tempVal = 0; // int j = 0; int st = 0; int result = 0; //DEL point_info point; //int pollingCount = 0; IfaceGhpSelectSleep(3, 0); /* initialize ghp interface */ init_data(); clear_tx_buf(); // clear tx buffer. clear_rx_buf(); // clear rx buffer. set_pcm_number(); // set pcm nummber. init_uart(); // init uart2 channel. init_poll(); get_sddc(); // get sddc number. get_unit_cnt(); // get indoor unit count. get_ghp_data(); // get ghp-point data. init_queue(); g_CntHaksaInit = 0; /* Test Code. 반드시 현장에서 지워야 한다. */ while( 1 ) { IfaceGhpSelectSleep(3, 0); } /* uart2 통신에 의한 Delay가 발생하는 상황을 재현하고자 한다. Test가 끝나면 반드시 주석으로 막아 실행되지 않도록 한다. */ #if 0 printf("Test Code\n"); memset(txbuf, 0, sizeof(txbuf)); for (i = 0; i < 256; i++) { txbuf[i] = tempVal++; } printf("init poll\n"); init_poll(); while(1) { result = OnReadIn(); if ( 0 < result ) { printf("Rx (%d)\n", result); /* for (i = 0; i < result; i++) { printf("%x ", rxbuf[i]); } printf("\n\n"); */ printf("Write\n"); OnWriteOut(rxbuf, result); printf("scehdule\n"); Check_Schedule(g_unitCnt); } } #endif #if 0 while( 1 ) { IfaceGhpSelectSleep(1, 0); Chk_Group_Control(); // 전체 정지 모드 Set_AllStopMode(g_unitCnt); // 실내기 온도 제한 Set_Temperature(g_unitCnt); } #endif //super loop st = ST_GET_POLLING; do{ // 전체 정지 모드 Set_AllStopMode(g_unitCnt); // 실내기 온도 제한 Set_Temperature(g_unitCnt); Get_RunUnit(g_unitCnt); // 각 동의 층별제어 및 실내기 타입별 온도제어를 한다. Chk_Group_Control(); // jong2ry test. // It is scheduler function. Check_Schedule(g_unitCnt); //sleep(1); //continue; Set_AllHaksaMode(g_unitCnt); switch(st) { case ST_GET_POLLING: //if(g_dbgShow) printf("ST_GET_POLLING\n"); result = Send_Polling(); //printf("result = %d\n", result); switch(result) { case POLL_REQUIRE_STARTUP: st = ST_STARTUP; break; case POLL_EMPTY_DATA: case POLL_OK: if (Send_Polling() == POLL_REQUIRE_STARTUP) { st = ST_STARTUP; break; } else { st = ST_CHK_USER_CONTROL; break; } default: //if(g_dbgShow) printf(">>> POLLING ERROR\n"); st = ST_CHK_USER_CONTROL; break; } break; case ST_CHK_USER_CONTROL: CheckUserControl(); st = ST_GET_USER_CONTROL; break; case ST_GET_USER_CONTROL: //if(g_dbgShow) printf("ST_GET_USER_CONTROL\n"); while(Do_User_Control()) { if (Send_Polling() == POLL_REQUIRE_STARTUP) { st = ST_STARTUP; break; } // 전체 정지 모드 Set_AllStopMode(g_unitCnt); // 실내기 온도 제한 Set_Temperature(g_unitCnt); Get_RunUnit(g_unitCnt); // 각 동의 층별제어 및 실내기 타입별 온도제어를 한다. Chk_Group_Control(); } st = ST_GET_GHP_UNIT; break; case ST_GET_GHP_UNIT: //if(g_dbgShow) printf("ST_GET_GHP_UNIT\n"); Get_Ghp_Unit(); if (Send_Polling() == POLL_REQUIRE_STARTUP) { st = ST_STARTUP; break; } //if(g_dbgShow) printf("\n\n"); st = ST_GET_POLLING; break; case ST_STARTUP: //if(g_dbgShow) printf("ST_STARTUP\n"); Startup_SDDC(); st = ST_GET_POLLING; break; default: //if(g_dbgShow) printf("default\n"); st = ST_GET_POLLING; break; } }while(1); //exit(1); system("killall duksan"); }
static int Send_Polling(void) /****************************************************************/ { int st; int result = 0; int length = 0; int i = 0; //unsigned char text[256]; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 500000000; //0.5sec st = POLL_START_MSG; if(g_dbgShow) printf(" -P- POLLLING\n"); for(;;) { switch (st) { case POLL_START_MSG: //if(g_dbgShow) printf(" -P- POLL_START_MSG\n"); clear_rx_buf(); comm_start_msg(TYPE_POLL); // polling protocol st = POLL_RECEIVE_TEXT; break; case POLL_RECEIVE_TEXT: //if(g_dbgShow) printf(" -P- POLL_RECEIVE_TEXT\n"); //sleep(1); //nanosleep(&ts, NULL); // jong2ry 2011_0303 //IfaceGhpSelectSleep(0, 500); IfaceGhpSelectSleep(0, 100); //length = RecvUart2(rxbuf, sizeof(rxbuf)); length = OnReadIn(); if ( g_dbgShow ) { printf(" -P- length = %d\n", length); for (i = 0; i < length; i++) printf("%c ",rxbuf[i]); printf("\n======================\n"); } if (length == -1) { //st = POLL_EOT_MSG; comm_eot_msg(); return POLL_EMPTY_DATA; } else if (rxbuf[0] == 0x04) { if ( g_dbgShow ) printf("return...\n"); return POLL_OK; } else st = POLL_DATA_HANDLER; break; case POLL_DATA_HANDLER: //if(g_dbgShow) printf(" -P- POLL_DATA_HANDLER\n"); //printf("Check >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); //printf("result = %d\n", result); result = RecvDataParsing(rxbuf, length); //printf(" -P- result = %d\n", length); st = POLL_ACK_MSG; break; case POLL_ACK_MSG: //if(g_dbgShow) printf(" -P- POLL_ACK_MSG\n"); comm_ack_msg(); st = POLL_RECEIVE_EOT; break; case POLL_RECEIVE_EOT: if(g_dbgShow) printf(" -P- POLL_RECEIVE_EOT\n"); clear_rx_buf(); //length = RecvUart2(text, sizeof(text)); length = OnReadIn(); if ( g_dbgShow ) printf(" -P- length = %d, %x\n", length, rxbuf[0]); //if(length == 1 && text[0] == 0x04) if(length == 1 && rxbuf[0] == 0x04) { if (result == POLL_REQUIRE_STARTUP) return POLL_REQUIRE_STARTUP; else if (result == POLL_ERROR) return POLL_ERROR; else return POLL_OK; } else st = POLL_EOT_MSG; case POLL_EOT_MSG: if(g_dbgShow) printf(" -P- POLL_EOT_MSG\n"); comm_eot_msg(); if (result == POLL_REQUIRE_STARTUP) return POLL_REQUIRE_STARTUP; else if (result == POLL_ERROR) return POLL_ERROR; else return POLL_OK; case POLL_WAIT_15SEC: if(g_dbgShow) printf(" -P- POLL_WAIT_15SEC\n"); if (result == POLL_REQUIRE_STARTUP) return POLL_REQUIRE_STARTUP; else return POLL_NG; } } }