void protocol_switcher_app_init(void) { telnet_client_init(); siemensTCP_app_init(); specserver_app_init(); webclient_init(); httpd_init(); resolv_init(); #ifndef USE_STATIC_IP // Initialize the DHCP Client Application. static struct uip_eth_addr sTempAddr; uip_getethaddr(sTempAddr); dhcpc_init(&sTempAddr.addr[0], 6); dhcpc_request(); #else uip_ip4addr_t uip_dnsaddr; uip_ipaddr(uip_dnsaddr, DNS_IP1, DNS_IP2, DNS_IP3, DNS_IP4 ); resolv_conf(uip_dnsaddr); #endif }
int main(void) { uint8_t i; P5DIR|=BIT1; //P5OUT&=~BIT1; P5OUT|=BIT1; _DINT(); //Disable Interrupts -- For initlization purposes WDTCTL = WDTPW + WDTHOLD; //Stop WDT /* Set System Clock Frequency to (121+1) * 32786 * 2 = 7.995392Mhz This freq. allows for 2400 - 230400 bit rate UART operation with less than 0.86% error */ FLL_CTL0 = (DCOPLUS | XCAP18PF); //Enable Frequency Multiplier (DCO+) and XIN/XOUT caps to 18pF SCFI0 = (FLLD_2 | FN_8); //Set Multiplier to 2, and DCO range to 8MHz nominal SCFQCTL = 121; //7.995392Mhz Operation with No Modulation //setup serial port #if DEBUG_SERIAL debug_serial_init(); printf("asd %i",23244); #endif for(i=0;i<6;i++) uNet_eth_address.addr[i]=_eth_addr[i]; // init NIC device driver #if DEBUG_SERIAL printf("MAC address:%x:%x:%x:%x:%x:%x\r\n",\ (int)_eth_addr[0],(int)_eth_addr[1],(int)_eth_addr[2],\ (int)_eth_addr[3],(int)_eth_addr[4],(int)_eth_addr[5]); printf("Initializing NIC...\r\n"); #endif nic_init(_eth_addr); uip_ipaddr_t ipaddr; uip_setethaddr(uNet_eth_address); #if DEBUG_SERIAL printf("Initializing uIP...\r\n"); #endif //init uIP uip_init(); #if DEBUG_SERIAL printf("Initializing ARP...\r\n"); #endif //init ARP cache uip_arp_init(); #if DEBUG_SERIAL printf("Initializing timer...\r\n"); #endif // init periodic timer clock_init(); //#if DEBUG_SERIAL printf("Initializing webclient...\r\n"); //#endif webclient_init(); _EINT(); // reenable interrupts if(!_enable_dhcp) { #if DEBUG_SERIAL printf("Initializing tcp/ip settings\r\n"); #endif //#if DEBUG_SERIAL printf("IP %i.%i.%i.%i\r\n", (int)_ip_addr[0],(int)_ip_addr[1],(int)_ip_addr[2],(int)_ip_addr[3]); printf("NetMask %i.%i.%i.%i\r\n", (int)_net_mask[0],(int)_net_mask[1],(int)_net_mask[2],(int)_net_mask[3]); printf("Gateway %i.%i.%i.%i\r\n", (int)_gateway[0],(int)_gateway[1],(int)_gateway[2],(int)_gateway[3]); //#endif uip_ipaddr(ipaddr, _ip_addr[0], _ip_addr[1], _ip_addr[2], _ip_addr[3]); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, _net_mask[0], _net_mask[1], _net_mask[2], _net_mask[3]); uip_setnetmask(ipaddr); uip_ipaddr(ipaddr, _gateway[0], _gateway[1], _gateway[2], _gateway[3]); uip_setdraddr(ipaddr); } else { #if DEBUG_SERIAL printf("Going to query DHCP server...\r\n"); #endif uip_ipaddr(ipaddr, 0, 0, 0, 0); uip_sethostaddr(ipaddr); uip_setnetmask(ipaddr); uip_setdraddr(ipaddr); } timer_set(&periodic_timer, CLOCK_SECOND * 2 ); timer_set(&arp_timer, CLOCK_SECOND * 10); /* if(_enable_dhcp) { dhcpc_init(&uNet_eth_address.addr[0], 6); dhcpc_request(); } */ /* Initialize Scheduler so that it can be used */ //Scheduler_Init(); /* Initialize USB Subsystem */ //USB_Init(); //Scheduler_SetTaskMode(NetTask, TASK_RUN); /* Scheduling - routine never returns, so put this last in the main function */ //Scheduler_Start(); //#if DEBUG_SERIAL printf("Starting main loop...\r\n"); //#endif while(1) { NetTask(); webclient_get("www", SERVER_PORT,"/"); } }
int main(void) { sei(); uint8_t resetSource = MCUSR; MCUSR = 0; wdt_reset(); wdt_disable(); wdt_enable(WDTO_1S); WDTCSR |= (1 << WDIE); //enable watchdog interrupt wdt_reset(); cli(); clock_init(); usart_init(1000000, 9600); stdout = &uart_str; stderr = &uart_str; stdin = &uart_str; uip_ipaddr_t ipaddr; struct timer periodic_timer, arp_timer; uint16_t timer_OW, timer_Simple, timer_Count, timer_EEProm, timer_SendData, timer_IOalarm, timer_network; timer_OW = 0; timer_Simple = 0; timer_Count = 0; timer_EEProm = 0; timer_SendData = 0; timer_IOalarm = 0; timer_network = 0; if(resetSource & (1<<WDRF)) { printf("Mega was reset by watchdog...\r\n"); } if(resetSource & (1<<BORF)) { printf("Mega was reset by brownout...\r\n"); } if(resetSource & (1<<EXTRF)) { printf("Mega was reset by external...\r\n"); } if(resetSource & (1<<PORF)) { printf("Mega was reset by power on...\r\n"); } //else jtag (disabled) //sensorScan = (uint8_t*) & tempbuf; if (eepromReadByte(0) == 255 || eepromReadByte(11) == 255) { printf_P(PSTR("Setting default values\r\n")); //Set defaults eepromWriteByte(0, 0); //init myip[0] = 192; myip[1] = 168; myip[2] = 1; myip[3] = 67; //47 in final versions netmask[0] = 255; netmask[1] = 255; netmask[2] = 255; netmask[3] = 0; gwip[0] = 192; gwip[1] = 168; gwip[2] = 1; gwip[3] = 1; dnsip[0] = 8; dnsip[1] = 8; dnsip[2] = 8; dnsip[3] = 8; eepromWriteByte(29, 80); //web port eepromWriteByte(10, 0); //dhcp off save_ip_addresses(); wdt_reset(); eepromWriteStr(200, "SBNG", 4); //default password eepromWriteByte(204, '\0'); eepromWriteByte(205, '\0'); eepromWriteByte(206, '\0'); eepromWriteByte(207, '\0'); eepromWriteByte(208, '\0'); eepromWriteByte(209, '\0'); eepromWriteByte(100, 1); //Analog port 0 = ADC eepromWriteByte(101, 1); //Analog port 1 = ADC eepromWriteByte(102, 1); //Analog port 2 = ADC eepromWriteByte(103, 1); //Analog port 3 = ADC eepromWriteByte(104, 1); //Analog port 4 = ADC eepromWriteByte(105, 1); //Analog port 5 = ADC eepromWriteByte(106, 1); //Analog port 6 = ADC eepromWriteByte(107, 1); //Analog port 7 = ADC eepromWriteByte(110, 0); //Digital port 0 = OUT eepromWriteByte(111, 0); //Digital port 1 = OUT eepromWriteByte(112, 0); //Digital port 2 = OUT eepromWriteByte(113, 0); //Digital port 3 = OUT wdt_reset(); for (uint8_t alarm=1; alarm<=4; alarm++) { uint16_t pos = 400 + ((alarm-1)*15); //400 415 430 445 eepromWriteByte(pos+0, 0); //enabled eepromWriteByte(pos+1, 0); //sensorid eepromWriteByte(pos+2, 0); //sensorid eepromWriteByte(pos+3, 0); //sensorid eepromWriteByte(pos+4, 0); //sensorid eepromWriteByte(pos+5, 0); //sensorid eepromWriteByte(pos+6, 0); //sensorid eepromWriteByte(pos+7, 0); //sensorid eepromWriteByte(pos+8, 0); //sensorid eepromWriteByte(pos+9, '<'); //type eepromWriteByte(pos+10, 0); //value eepromWriteByte(pos+11, 0); //target eepromWriteByte(pos+12, 0); //state eepromWriteByte(pos+13, 0); //reverse eepromWriteByte(pos+14, 0); //not-used } eepromWriteByte(1, EEPROM_VERSION); } /* findSystemID(systemID); if (systemID[0] == 0) { printf_P(PSTR("No system id found, add a DS2401 or use old software")); // fprintf(&lcd_str, "?f?y0?x00No system id found?nAdd a DS2401 or use old software?n"); wdt_disable(); wdt_reset(); while (true); } else { */ //MAC will be 56 51 99 36 14 00 with example system id mymac[1] = systemID[1]; mymac[2] = systemID[2]; mymac[3] = systemID[3]; mymac[4] = systemID[4]; mymac[5] = systemID[5]; // } // fprintf(&lcd_str, "?y1?x00ID: %02X%02X%02X%02X%02X%02X%02X%02X?n", systemID[0], systemID[1], systemID[2], systemID[3], systemID[4], systemID[5], systemID[6], systemID[7]); loadSimpleSensorData(); //Set digital pins based on selections... for (uint8_t i=8; i<=11; i++) { if (simpleSensorTypes[i] == 0) { //output SETBIT(DDRC, (i-6)); } else { //input CLEARBIT(DDRC, (i-6)); } } network_init(); timer_set(&periodic_timer, CLOCK_SECOND / 2); timer_set(&arp_timer, CLOCK_SECOND * 10); uip_init(); //sættes hvert for sig for uip og enc, skal rettes til en samlet setting, så vi kan bruge mymac struct uip_eth_addr mac = { {UIP_ETHADDR0, UIP_ETHADDR1, UIP_ETHADDR2, UIP_ETHADDR3, UIP_ETHADDR4, UIP_ETHADDR5} }; // struct uip_eth_addr mac = {mymac[0], mymac[1], mymac[2], mymac[3], mymac[4], mymac[5]}; uip_setethaddr(mac); httpd_init(); /* #ifdef __DHCPC_H__ dhcpc_init(&mac, 6); #else */ uip_ipaddr(ipaddr, myip[0], myip[1], myip[2], myip[3]); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, gwip[0], gwip[1], gwip[2], gwip[3]); uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, netmask[0], netmask[1], netmask[2], netmask[3]); uip_setnetmask(ipaddr); //#endif /*__DHCPC_H__*/ printf("Setting ip to %u.%u.%u.%u \r\n", myip[0], myip[1], myip[2], myip[3]); resolv_init(); uip_ipaddr(ipaddr, dnsip[0], dnsip[1], dnsip[2], dnsip[3]); resolv_conf(ipaddr); webclient_init(); printf("Stokerbot NG R3 ready - Firmware %u.%u ...\r\n", SBNG_VERSION_MAJOR, SBNG_VERSION_MINOR); // fprintf(&lcd_str, "?y2?x00Firmware %u.%u ready.", SBNG_VERSION_MAJOR, SBNG_VERSION_MINOR); // SPILCD_init(); wdt_reset(); while (1) { //Only one event may fire per loop, listed in order of importance //If an event is skipped, it will be run next loop if (tickDiff(timer_Count) >= 1) { timer_Count = tick; wdt_reset(); //sikre at watchdog resetter os hvis timer systemet fejler, vi når her hvert 2ms updateCounters(); //bør ske i en interrupt istedet, for at garentere 2ms aflæsning } else if (tickDiffS(timer_IOalarm) >= 5) { printf("Timer : IO alarm \r\n"); timer_IOalarm = tickS; timedAlarmCheck(); } else if (tickDiffS(timer_OW) >= 2) { printf("Timer : OW \r\n"); timer_OW = tickS; updateOWSensors(); } else if (tickDiffS(timer_Simple) >= 5) { printf("Timer : Simple\r\n"); timer_Simple = tickS; updateSimpleSensors(); } else if (tickDiffS(timer_SendData) >= 59) { printf("Timer : webclient \r\n"); timer_SendData = tickS; webclient_connect(); } else if (tickDiffS(timer_EEProm) >= 60 * 30) { printf("Timer : eeprom \r\n"); timer_EEProm = tickS; timedSaveEeprom(); } //Net handling below if (tickDiff(timer_network) >= 1) { timer_network = tick; uip_len = network_read(); if (uip_len > 0) { if (BUF->type == htons(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); if (uip_len > 0) { uip_arp_out(); network_send(); } } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); if (uip_len > 0) { network_send(); } } } else if (timer_expired(&periodic_timer)) { timer_reset(&periodic_timer); //FLIPBIT(PORTC,5); // printf("Timers : %u %u \r\n", tick, tickS); for (uint8_t i = 0; i < UIP_CONNS; i++) { uip_periodic(i); if (uip_len > 0) { uip_arp_out(); network_send(); } } #if UIP_UDP for (uint8_t i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); if (uip_len > 0) { uip_arp_out(); network_send(); } } #endif /* UIP_UDP */ if (timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } } } return 0; }
static portTASK_FUNCTION( tunggu, pvParameters ) { struct t_env *envx; envx = (char *) ALMT_ENV; portBASE_TYPE xARPTimer; uip_ipaddr_t xIPAddr; int loop; int mul; unsigned int timer_menit=0; unsigned int loop_menit=0; static volatile portTickType xStartTime, xCurrentTime; vTaskDelay(200); /* baca environtment (dapat IP dll dulu) */ baca_env(0); printf("UIP : uip_init\r\n"); uip_init (); //uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); uip_ipaddr( xIPAddr, envx->IP0, envx->IP1, envx->IP2, envx->IP3 ); uip_sethostaddr( xIPAddr ); printf("ARP : arp_init\r\n"); uip_arp_init (); printf("Init ENC28J .. "); if (enc28j60Init() == 1) { printf(" .. ENC OK\r\n"); } else printf("ENC tidak respons !\r\n"); #ifdef PAKE_HTTP printf("SIMPLE HTTP : init\r\n"); httpd_init (); #endif #ifdef PAKE_TELNETD printf("SIMPLE TELNET : init\r\n"); telnetd_init (); #endif #ifdef BOARD_KOMON printf("MONITA : monita init\r\n"); // monita_init(); #endif #if (PAKAI_KONTROL == 1) printf("MONITA : monita kontrol init\r\n"); kontrol_init(); #endif //#ifdef BOARD_TAMPILAN //#ifdef CARI_SUMBERNYA #ifdef SAMPURASUN_SERVER printf("MONITA : sambungan_aktif init\r\n"); sambungan_init(); mul = 0; #endif #ifdef SAMPURASUN_CLIENT //printf("MONITA : monita init\r\n"); printf("Monita : sampurasun client init !\r\n"); monita_init(); #endif #ifdef PAKAI_WEBCLIENT int ngitung=0; webclient_init(); printf("webclient inited !\r\n"); unsigned char datakeserver[512]; int wclient=0, jmlData=0, nos=0, flag_nos=0, flag_sumber=0, jmlsumbernya=0; //int noPMaktif[JML_SUMBER]; char il[256], dl[256]; char ipdest[15], angkaangka[5]; extern int kirimURL; extern char terkirimURL; extern int noawal; int tiapKirim=950; int maxkirim=12; #endif #ifdef PAKAI_KIRIM_BALIK int anginkecil=0; int giliran; extern int sumber_datanya; extern int target_kirim; target_kirim = 4-1; sumber_datanya=3-1; //giliran=1-1; printf("Kirim Balik inited, Target data: sumber %d, target kirim: %d !\r\n", sumber_datanya+1, target_kirim+1); #endif /* Initialise the local timers */ xStartTime = xTaskGetTickCount (); xARPTimer = 0; /* supaya cukup waktu buat siap2 */ loop = -1000; #ifdef BOARD_KOMON_420_SABANG vTaskDelay(200); #endif #ifdef PAKAI_WEBCLIENT vTaskDelay(2000); vTaskDelay(2000); #endif //printf("mau loop for\r\n"); for (;;) { vTaskDelay(1); //portYIELD(); #if 1 #ifdef PAKAI_WEBCLIENT if (envx->statusWebClient==1) { wclient++; if (envx->burst==1) { jmlData=kirimModul(1, 0, 0, il, dl); //jmlsumbernya=1; tiapKirim = 500; } else { // kirim 1-1 /* #ifdef BANYAK_SUMBER struct t_sumber *pmx; pmx = (char *) ALMT_SUMBER; jmlsumbernya=0; for(selang=0; selang<JML_SUMBER; selang++) { if (pmx[selang].status==1) { printf("selang: %d, status: %d\r\n", selang, pmx[selang].status); noPMaktif[jmlsumbernya]=selang; jmlsumbernya++; } } if (jmlsumbernya==0) { jmlsumbernya=1; } //jmlData=kirimModul(0, noPMaktif[sumbernya], 0, il, dl); printf("jml Data: %d, sumbernya: %d\r\n", jmlData, sumbernya); // kenapa ini ??? harusnya tiap detik, knapa jadi tiap 4 detik ???? //tiapKirim = (int) (100/jmlsumbernya); tiapKirim = (int) (195/jmlsumbernya); //printf("wclient: %d\r\n", wclient); #endif //*/ } if (wclient == tiapKirim) { ngitung++; struct t_sumber *sumber; sumber = (char *) ALMT_SUMBER; if (!flag_nos) { nos++; while(sumber[nos-1].status!=1) { // cari modul sumber aktif if (nos>JML_SUMBER) { nos=0; jmlsumbernya=0; } nos++; } } jmlsumbernya++; //printf("kirim: %5d, nos: %d, wclient: %d, sumber.status: %d, jmlsumbernya: %d\r\n", ngitung, nos-1, wclient, sumber[nos-1].status, jmlsumbernya); // cek datanya PM ?? // <--- ternyata gak cuma PM, modul lain juga bisa if (sumber[nos-1].tipe==0 || sumber[nos-1].tipe==1 || sumber[nos-1].tipe==100) { // PM710 || PM810 jmlData=kirimModul(0, nos-1, noawal, il, dl); if (jmlData==12) { flag_nos=1; } else { // sudah habis, reset ke 0 flag_nos=0; noawal=0; } //printf("nilai noawal: %d, flagnos: %d\r\n", noawal, flag_nos); } else { jmlData=kirimModul(0, nos-1, 0, il, dl); noawal=0; } // hitung jml loop kirim ke server if (flag_sumber<jmlsumbernya) { flag_sumber=jmlsumbernya; tiapKirim=950/jmlsumbernya; } wclient = 0; if (jmlData>0) { sprintf(ipdest, "%d.%d.%d.%d", envx->GW0, envx->GW1, envx->GW2, envx->GW3); //portENTER_CRITICAL(); //sprintf(datakeserver, "%s?i=%s&p=diesel&j=%d&%s&%s", envx->berkas, envx->SN, jmlData, il, dl); strcpy(datakeserver, envx->berkas); strcat(datakeserver, "?i="); strcat(datakeserver, envx->SN); strcat(datakeserver, "&p=diesel&j="); sprintf(angkaangka, "%d", jmlData); strcat(datakeserver, angkaangka); strcat(datakeserver, "&"); strcat(datakeserver, il); strcat(datakeserver, "&"); strcat(datakeserver, dl); //portEXIT_CRITICAL(); //printf("datakeserver: %s\r\n",datakeserver); webclient_get(ipdest, 80, datakeserver); } } } #endif //#if defined(BOARD_TAMPILAN) || defined (TAMPILAN_MALINGPING) #ifdef SAMPURASUN_SERVER //#ifdef CARI_SUMBERNYA loop++; if (loop > 200) // 50, 40, 80 { loop = 0; sambungan_connect(mul); mul++; if (mul > JML_SUMBER) mul = 0; } #endif #ifdef PAKAI_KIRIM_BALIK anginkecil++; if (anginkecil > 2000) { /* tiap 2 detik */ kirim_balik_connect(target_kirim); anginkecil=0; //giliran++; //if (giliran > JML_SUMBER) mul = 0; } #endif //if (enc28j60WaitForData (uipMAX_BLOCK_TIME) == pdTRUE) if (cek_paket()) { //printf("masuk cekpaket \r\n"); #if 1 paket_per_menit++; /* Let the network device driver read an entire IP packet into the uip_buf. If it returns > 0, there is a packet in the uip_buf buffer. */ if ((uip_len = enc28j60Receive ()) > 0) { if (pucUIP_Buffer->type == htons (UIP_ETHTYPE_IP)) { uip_arp_ipin (); uip_input (); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if (uip_len > 0) { uip_arp_out (); enc28j60Send (); paket_kita++; } } else if (pucUIP_Buffer->type == htons (UIP_ETHTYPE_ARP)) { uip_arp_arpin (); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if (uip_len > 0) enc28j60Send (); } } #endif } else { /* The poll function returned 0, so no packet was received. Instead we check if it is time that we do the periodic processing. */ xCurrentTime = xTaskGetTickCount (); if ((xCurrentTime - xStartTime) >= RT_CLOCK_SECOND) { portBASE_TYPE i; /* Reset the timer. */ xStartTime = xCurrentTime; /* Periodic check of all connections. */ for (i = 0; i < UIP_CONNS; i++) { uip_periodic (i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if (uip_len > 0) { //printf("S:%d", i); uip_arp_out (); enc28j60Send (); } } #if UIP_UDP_KU for (i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic (i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if (uip_len > 0) { uip_arp_out (); enc28j60Send (); } } #endif /* UIP_UDP */ /* Periodically call the ARP timer function. */ if (++xARPTimer == uipARP_FREQUENCY) { uip_arp_timer (); xARPTimer = 0; } } if ((xCurrentTime - timer_menit) >= RT_MENIT) { extern unsigned int error_ENC; timer_menit = xCurrentTime; loop_menit++; /* printf("%d menit, paket = %d, kita=%d, idle=%d\n", loop_menit, paket_per_menit, paket_kita, loop_idle); if (error_ENC != 0) { printf("ERR ENC = %X\n", error_ENC); }*/ paket_per_menit = 0; paket_kita = 0; } } // tanpa paket /* // proses ADC dipindah ke shell 1 Okt 2010// #ifdef PAKAI_ADC #ifdef BOARD_KOMON_A_RTD proses_data_adc(); #endif #ifdef BOARD_KOMON_B_THERMO proses_data_adc(); #endif #ifdef BOARD_KOMON_420_SAJA proses_data_adc(); #endif #endif //*/ #endif } }