// регистрация в Интернет посредством GPRS Status On_GPRS(uint32_t timeout) { Timer1_Start(timeout); while(!Timer1_Status()) { modem_QISTAT(); switch (qistat) { case IP_INITIAL: modem_QIREGAPP(OFF); // регистрируем подключение GPRS break; case IP_START: modem_QIACT(); // регистрируемся в сети case IP_CONFIG: case IP_GPRSACT: modem_QILOCIP(); // Запрашиваем локальный IP адрес break; case IP_STATUS: case IP_CONNECTING: case IP_CLOSE: case CONNECT_OK: Timer1_Stop(); return SUCCESS; case IP_IND: break; case PDP_DEACT: default: modem_QIDEACT(); } } // End while Timer1_Stop(); return ERROR; }
Status Server_Send(char *output, uint32_t len, uint32_t time) { // Вывод данных из буфера output длиной len за время time uint32_t count = 0; uint32_t pktlen; if (!connect) return ERROR; // Пропал коннект, ничего не делаем modem_QISDE(OFF); // Отключим эхо при выводе Timer1_Start(time); while(!Timer1_Status() && len) { if (len > 1460) { pktlen = 1460; } else pktlen = len; modem_QISEND(output, pktlen); if (!connect) return ERROR; // В процессе передачи связь разорвалась if (mdm_err) break; if (send_ok == 1) { len -= pktlen; output += pktlen; } } Timer1_Stop(); if (len) return ERROR; return SUCCESS; }
// ============================= Отправляет команду на СП из буфера rd_UART и читает ответ в wr_UART ============================================= // Status SendRcvdCmd() { uint8_t length; uint16_t delay = 100; unsigned char *p_Out = &data_wr_UART[0]; Timer1_Start(2500); //-----------очистка буфера от мусора(заполнение нулями) memset(data_wr_UART,0,255); CS_Force(0); //активируем SS if(WAIT) //если перепад при неактивном WAIT { CS_Force(1); //сбрасываем SS while(WAIT); //ждем перепада WAIT в активное состояние CS_Force(0); //снова активируем SS } //------------отправка команды for(length=0;length<UART_RCV_COUNT;length++) { delay = 50; while(delay--); SPY_Byte(data_rd_UART[length]); } CS_Force(1); Timer1_Stop(); while(!WAIT); //ждем перепада в 1 while(WAIT); //ждем готовности(перепада в 0) Timer1_Start(2500); CS_Force(0); //-------------получение ответа SPY_Byte(0);//отправка лишнего байта чтобы избавиться от мусора(остатка последней команды) for(length=1;length<255;length++) { *p_Out++ = SPY_Byte(length); delay = 50; while(delay--); if(WAIT) break; //если придет WAIT==1, значит пора прекратить прием данных } CS_Force(1); return SUCCESS; }
// Ожидание очистки выходного буфера Status Server_Flush(uint32_t time) { Timer1_Start(time); while (!Timer1_Status()) { modem_QISACK(0); if (qi_sent == qi_acked) break; } Timer1_Stop(); if (qi_sent == qi_acked) return SUCCESS; return ERROR; }
// Ожидание прихода данных в течении времени time. Если данные пришли - SUCCESS Status Server_Receive(uint32_t time) { uint32_t len = 0; Timer1_Start(time); while(!Timer1_Status()) { while (GetAnswer(answer)) { Parse_Ans(answer); } if (!connect) return ERROR; // Пропал коннект, ничего не делаем if (qirdi) { do { len = input_len; modem_QIRD(RING_SIZE - input_len); // Чтобы случайно из буфера не выйти } while (len != input_len); if (input_len > 5) break; } } Timer1_Stop(); if (len != input_len) return ERROR; return SUCCESS; }
void main(void) { // Enable Global Interrupt M8C_EnableGInt; // Clear the flags FlagsElevator = 0; FlagsAileron = 0;// new for motorcontroll2 FlagUltrasoon = 0; // Start timers and enable interrupt Timer1_Start(); Timer1_EnableInt(); Timer2_Start();// new for motorcontroll2 Timer2_EnableInt();// new for motorcontroll2 Timer3_Start(); Timer3_EnableInt(); TriggerUltrasoon(); // Init motors PWM1_Start(); PWM2_Start(); #if (DEBUG_LCD) LCD_Start(); #endif while (TRUE) { float aileronNormalized, elevatorNormalized; float distance; float speed, direction; float motorLeft, motorRight; BOOL forward; aileronNormalized = EvaluateAileron(PulseWidthAileron); direction = fabs(aileronNormalized); elevatorNormalized = EvaluateElevator(PulseWidthElevator); speed = fabs(elevatorNormalized); forward = (elevatorNormalized >= 0); distance = EvaluateUltrasoonSensor(); if (distance < MIN_SAFE_DISTANCE) { if (forward) speed = 0; } motorLeft = speed; // default is straight forward motorRight = speed; if (aileronNormalized < 0) // turning left { motorRight = speed; motorLeft = speed * (1 - direction); } else if (aileronNormalized > 0) // turning right { motorLeft = speed; motorRight = speed * (1 - direction); } if (forward) { // ccw PRT1DR |= 0x08; // AIN1 PRT1DR &= ~0x02; // AIN2 PRT1DR |= 0x20; // BIN1 PRT1DR &= ~0x80; // BIN2 } else { //cw PRT1DR &= ~0x08; // AIN1 PRT1DR |= 0x02; // AIN2 PRT1DR &= ~0x20; // BIN1 PRT1DR |= 0x80; // BIN2 } // Denormalize to Engine motorLeft *= (MAX_POWER - MIN_POWER); motorLeft += MIN_POWER; motorRight *= (MAX_POWER - MIN_POWER); motorRight += MIN_POWER; PWM1_WritePulseWidth(motorLeft); PWM2_WritePulseWidth(motorRight); #if (DEBUG_LCD) LCD_Position(0,7); LCD_PrHexInt(motorLeft); LCD_Position(1,7); LCD_PrHexInt(motorRight); LCD_Position(0,12); LCD_PrCString(forward ? "F" : "B"); #endif } }