void train_code(){ char tr_speeds [NUM_TRAINS]; // initialization int i; for (i = 0; i < NUM_TRAINS; i++){ tr_speeds[i] = 0; } char stop[3]; char rcv_buff[3]; stop[0] = stop[1] = stop[2] = rcv_buff[0] = rcv_buff[1] = rcv_buff[2] = 0; char reply_buff = 0; int prompt_tid; while(1){ // Need to receive 2 bytes for the train command Receive(&prompt_tid, &rcv_buff, 2*sizeof(char)); if (rcv_buff[0] == 15){ // Reversing stop[1] = rcv_buff[1]; // train number Putc(COM1, 0); Putc(COM1, stop[1]); // Stop Reply(prompt_tid, &reply_buff, sizeof(char)); Delay(200); Putstr(COM1, rcv_buff); // Reverse rcv_buff[0] = tr_speeds[rcv_buff[1]-1]; // stored speed of the train Putstr(COM1, rcv_buff); // Set speed } else if(rcv_buff[0] == 0){ tr_speeds[rcv_buff[1]-1] = 0; Putc(COM1, 0); Putc(COM1, rcv_buff[1]); Reply(prompt_tid, &reply_buff, sizeof(char)); } else { // Setting speed tr_speeds[rcv_buff[1]-1] = rcv_buff[0]; Putstr(COM1, rcv_buff); Reply(prompt_tid, &reply_buff, sizeof(char)); } } Exit(); kprintf("Unexpected return from Exit() at train_code\n\r"); }
void draw_sensor_history( Sensor_history *history ) { char buf[1000], *ptr; int i; ptr = buf; int size = 0; size += sprintf( ptr, CURSOR_SAVE ); size += sprintf( ( ptr + size ), CURSOR_HIDE_STR ); size += cursorPositioning( ( ptr + size), 9, 4 ); for( i = 0; i < history->size; ++i ) { if( i != 0 && i % 7 == 0 ) size += cursorPositioning( ( ptr + size ), 10, 4 ); int pos = history->newest_pos - i; if( pos < 0 ) pos += SENSOR_HISTORY_LEN; size += sprintf( ( ptr + size ), "%s", history->sensors[pos] ); } size += sprintf( ( ptr + size ), CURSOR_RESTORE ); Putstr( COM2, ptr ); }
static void trainSetSpeed(const int speed, const int stopTime, const int delayer, Driver* me) { char msg[4]; msg[1] = (char)me->trainNum; if (me->lastSensorActualTime > 0) { // a/d related stuff int newSpeed = speed >=0 ? speed : 0; int now = Time(me->timeserver) * 10; if (me->speed == newSpeed) { // do nothing } else if (me->speed == 0) { // accelerating from 0 int v0 = getVelocity(me); int v1 = me->v[newSpeed][ACCELERATE]; int t0 = now + 8; // compensate for time it takes to send to train int t1 = now + 8 + me->a[newSpeed]; poly_init(&me->adPoly, t0, t1, v0, v1); me->isAding = 1; me->lastReportDist = 0; me->adEndTime = t1; } else if (newSpeed == 0) { // decelerating to 0 int v0 = getVelocity(me); int v1 = me->v[newSpeed][DECELERATE]; int t0 = now + 8; // compensate for time it takes to send to train int t1 = now + 8 + getStoppingTime(me); poly_init(&me->adPoly, t0, t1, v0, v1); me->isAding = 1; me->lastReportDist = 0; me->adEndTime = t1; } } TrainDebug(me, "Train Setting Speed %d", speed); if (speed >= 0) { if (delayer) { TrainDebug(me, "Reversing speed.------- %d", speed); msg[0] = 0xf; msg[1] = (char)me->trainNum; msg[2] = (char)speed; msg[3] = (char)me->trainNum; Putstr(me->com1, msg, 4); //TrainDebug(me, "Next Sensor: %d %d", me->nextSensorIsTerminal, me->lastSensorIsTerminal); // Update prediction if (me->nextSensorIsTerminal) { me->nextSensorBox = me->nextSensorBox == EX ? EN : EX; //TrainDebug(me, "LAst Sensor: %d ", me->lastSensorVal); } else { int action = me->nextSensorVal%2 == 1 ? 1 : -1; me->nextSensorVal = me->nextSensorVal + action; } if (me->lastSensorIsTerminal) { me->lastSensorBox = me->lastSensorBox == EX ? EN : EX; } else { int action = me->lastSensorVal%2 == 1 ? 1 : -1; me->lastSensorVal = me->lastSensorVal + action; } float distTemp = me->distanceFromLastSensor; me->distanceFromLastSensor = me->distanceToNextSensor; me->distanceToNextSensor = distTemp; char valTemp = me->nextSensorVal; me->nextSensorVal = me->lastSensorVal; me->lastSensorVal = valTemp; char boxTemp = me->nextSensorBox; me->nextSensorBox = me->lastSensorBox; me->lastSensorBox = boxTemp; if (me->nextSensorIsTerminal || me->lastSensorIsTerminal){ char isTemp = me->nextSensorIsTerminal; me->nextSensorIsTerminal = me->lastSensorIsTerminal; me->lastSensorIsTerminal = isTemp; } // Reserve the track above train and future (covers case of init) // Update prediction updatePrediction(me); int reserveStatus = reserveMoreTrack(me, 0, me->d[speed][ACCELERATE][MAX_VAL]); // moving if (reserveStatus == RESERVE_FAIL) { reroute(me); } } else { //TrainDebug(me, "Set speed. %d %d", speed, me->trainNum); msg[0] = (char)speed; Putstr(me->com1, msg, 2); if (speed == 0) { int delayTime = stopTime + 500; Reply(me->stopDelayer, (char*)&delayTime, 4); } } if (speed > me->speed) { me->speedDir = ACCELERATE; } else if (speed < me->speed) { me->speedDir = DECELERATE; } me->speed = speed; } else { //TrainDebug(me, "Reverse... %d ", me->speed); DriverMsg delayMsg; delayMsg.type = SET_SPEED; delayMsg.timestamp = stopTime + 500; if (me->speedAfterReverse == -1) { delayMsg.data2 = (signed char)me->speed; } else { delayMsg.data2 = (signed char)me->speedAfterReverse; } //TrainDebug(me, "Using delayer: %d for %d", me->delayer, stopTime); Reply(me->delayer, (char*)&delayMsg, sizeof(DriverMsg)); msg[0] = 0; msg[1] = (char)me->trainNum; Putstr(me->com1, msg, 2); me->speed = 0; me->speedDir = DECELERATE; } }
int main(void) { /* Ledstrips inits */ /* W5100 defines */ unsigned char sockstat; unsigned int rsize; char radiostat0[10], radiostat1[10]; int postidx, getidx; /* Initial variable used */ sockreg = 0; tempvalue = 0; ledmode = 0; Init_timer1(); Init_timers(); /*Init_shift();*/ OSCTUN = 21; PLLFBD = 38; /* M=40 */ CLKDIVbits.PLLPOST = 0; /* N1=2 */ CLKDIVbits.PLLPRE = 0; /* N2=2 */ /* Eraseleds();*/ /* even ledstrips have to be mirrored */ /* Mirror(patt); */ /* LCD inits */ Init_mcp(); Init_LCD(); Write_LCD(startup); /* W5100 inits */ Init_pin_SPI(); Init_SPI(); W5100_Init(gtw_addr,mac_addr,sub_mask,ip_addr); T_SPI_CS; SPI_CS = 1; Init_UART(); for (;;) { sockstat = SPI_Read(S0_SR); switch (sockstat) { case SOCK_CLOSED: if (socket(sockreg, MR_TCP, TCP_PORT) > 0) { /* Listen to Socket 0 */ if (listen(sockreg) <= 0) Delayms(1); } break; case SOCK_ESTABLISHED: /* Get the client request size */ rsize = recv_size(); if (rsize > 0) { /* Now read the client Request */ if (recv(sockreg, buf, rsize) <= 0) break; Putstr(buf); /* printf("%s",buf);*/ /* Check the Request Header */ getidx = strindex((char *) buf, "GET /"); postidx = strindex((char *) buf, "POST /"); if (getidx >= 0 || postidx >= 0) { /* Now check the Radio Button for POST request */ if (postidx >= 0) { if (strindex((char *) buf, "uBoard new color") > 0) ledmode++; } /* Create the HTTP Response Header */ strncpy((char *)buf,("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n" "<body style=\"background-color:FFFFFF;\">\r\n"),96); strcat((char *)buf,("[\n" " {\n" " \"id\": \"1\",\n" " \"name\": \"uBoard webboard\",\n" " \"ipaddr\": \"192.168.0.102\",\n" " \"subnetmask\": \"255.255.255.0\",\n" " \"gateway\": \"192.168.0.1\",\n" " \"adjustSpeedOfPattern\": \"int\",\n" " \"turnLedsOnOff\": \"boolean\"\n" " }\n" "]\n")); /* Now Send the HTTP Response */ if (send(sockreg,buf,strlen((char *)buf)) <= 0) break; /* TODO: add status */ LCD_Clear(); LCD_PutByte(ledmode); if (ledmode == 1) { strncpy(radiostat0,"",0); strncpy(radiostat1,("checked"),7); } else { strncpy(radiostat0,("checked"),7); strncpy(radiostat1,"",0); } /* Create the HTTP Radio Button Response */ strncpy((char *)buf,("<p><input type=\"radio\" name=\"radio\" value=\"0\" "),52); strcat((char *)buf,radiostat0); strcat((char *)buf,(">Turn off\r\n")); strcat((char *)buf,("<br><input type=\"radio\" name=\"radio\" value=\"1\" ")); strcat((char *)buf,radiostat1); strcat((char *)buf,(">Lounge mode\r\n")); strcat((char *)buf,("</strong><p>\r\n")); strcat((char *)buf,("<input type=\"submit\">\r\n")); strcat((char *)buf,("</form></span></body></html>\r\n")); /* Now Send the HTTP Remaining Response */ if (send(sockreg,buf,strlen((char *)buf)) <= 0) break; } /* Disconnect the socket */ disconnect(sockreg); } else Delayms(1); /* Wait for request */ break; case SOCK_FIN_WAIT: case SOCK_CLOSING: case SOCK_TIME_WAIT: case SOCK_CLOSE_WAIT: case SOCK_LAST_ACK: /* Force to close the socket */ close(sockreg); break; } } return 0; }