int RawGetNext(CRaw * I, int *size, int *version) { PyMOLGlobals *G = I->G; int result = cRaw_EOF; switch (I->mode) { case cRaw_file_stream: if(I->f) { if(!feof(I->f)) { if(fread((char *) I->header, cRaw_header_size, 1, I->f) != 1) { PRINTFD(G, FB_Raw) " RawGetNextType-Debug: Couldn't read header.\n" ENDFD; } else { if(I->swap) { swap_bytes(I->header); swap_bytes(I->header + 1); swap_bytes(I->header + 2); swap_bytes(I->header + 3); } fseek(I->f, -cRaw_header_size, SEEK_CUR); *size = I->header[0]; result = I->header[1]; *version = I->header[2]; } } } } return (result); }
void feedback_Pop(void) { Cfeedback_ *I=&Feedbk; if(I->Depth) { I->Depth--; feedback_Mask=I->Stack+(I->Depth*FB_total); } PRINTFD(FB_feedback_) " feedback: pop\n" ENDFD; }
void feedback_Push(void) { Cfeedback_ *I=&Feedbk; int a; I->Depth++; vla_check(I->Stack,char,(I->Depth+1)*FB_total); feedback_Mask=I->Stack+(I->Depth*FB_total); for(a=0;a<FB_total;a++) { feedback_Mask[a] = feedback_Mask[a-FB_total]; } PRINTFD(FB_feedback_) " feedback: push\n" ENDFD; }
void feedback_SetMask(unsigned int sysmod,unsigned char mask) { int a; if((sysmod>0)&&(sysmod<FB_total)) { feedback_Mask[sysmod] = mask; } else if(!sysmod) { for(a=0;a<FB_total;a++) { feedback_Mask[a] = mask; } } PRINTFD(FB_feedback_) " feedbackSetMask: sysmod %d, mask 0x%02X\n",sysmod,mask ENDFD; }
void feedback_Disable(unsigned int sysmod,unsigned char mask) { int a; if((sysmod>0)&&(sysmod<FB_total)) { feedback_Mask[sysmod] = feedback_Mask[sysmod] & (0xFF-mask); } else if(!sysmod) { for(a=0;a<FB_total;a++) { feedback_Mask[a] = feedback_Mask[a] & (0xFF-mask); } } PRINTFD(FB_feedback_) " feedbackDisable: sysmod %d, mask 0x%02X\n",sysmod,mask ENDFD; }
/*========================================================================*/ struct Rep *RepUpdate(struct Rep *I, struct CoordSet *cs, int state, int rep) { PRINTFD(I->G, FB_Rep) " RepUpdate-Debug: entered: rep %d I->MaxInvalid %d\n", rep, I->MaxInvalid ENDFD; if(I->MaxInvalid) { if(I->MaxInvalid == cRepInvPick) { if((rep == cRepLine) || (rep == cRepCyl) || (rep == cRepRibbon) || (rep == cRepNonbonded)) I->MaxInvalid = cRepInvRep; } if(I->MaxInvalid < cRepInvColor) { } else if(I->MaxInvalid == cRepInvColor) { if(I->fRecolor) { I->fRecolor(I, cs); } else { I = I->fRebuild(I, cs, state, rep); } } else if(I->MaxInvalid <= cRepInvVisib) { if(I->fSameVis) { if(!I->fSameVis(I, cs)) I = I->fRebuild(I, cs, state, rep); } else I = I->fRebuild(I, cs, state, rep); } else if(I->MaxInvalid >= cRepInvCoord) { I = I->fRebuild(I, cs, state, rep); if(!cs->Active[rep]) { I->fFree(I); I = NULL; } /* if(I->fNew) { tmp = I->fNew(cs); if(I->fFree) I->fFree(I); I=tmp; */ } else { I = I->fRebuild(I, cs, state, rep); } if(I) I->MaxInvalid = 0; } return (I); }
/*========================================================================*/ struct Rep *RepRebuild(struct Rep *I, struct CoordSet *cs, int state, int rep) { Rep *tmp = NULL; PRINTFD(I->G, FB_Rep) " RepRebuild-Debug: entered: rep %d I->fNew %p\n", rep, (void *) I->fNew ENDFD; if(I->fNew) { tmp = I->fNew(cs, state); if(tmp) { tmp->fNew = I->fNew; I->fFree(I); } else { /* nothing returned -- visibility is zero... */ cs->Active[rep] = false; /* keep the old object around, but inactive */ tmp = I; } } else I->fFree(I); return (tmp); }
/* ObjectDistMoveWithObject -- updates the vertex positions of a distance measure * * PARAMS * (ObjectDist*) I * the object to update * (ObjectMolecule*) O * the object that moved, causing this function to be called * RETURNS * (integer) 0=nothing moved; 1=something moved */ int ObjectDistMoveWithObject(ObjectDist * I, struct ObjectMolecule * O) { int result = 0, curResult = 0; int i; DistSet* ds; /* bail if the distance object is empty, or it doesn't have any distances */ if (!I || !I->NDSet || !I->DSet ) { return 0; } /* ask each DistSet to move itself, if required */ for (i=0; i<I->NDSet; i++) { ds = I->DSet[i]; if (ds) { curResult = DistSetMoveWithObject(ds, O); result |= curResult; } } PRINTFD(I->Obj.G, FB_ObjectDist) " ObjectDist-Move: Out of Move\n" ENDFD; return result; }
Rep *RepWireBondNew(CoordSet * cs, int state) { PyMOLGlobals *G = cs->State.G; ObjectMolecule *obj = cs->Obj; int a1, a2; unsigned int b1, b2; int a, c1, c2, ord; bool s1, s2; BondType *b; int half_bonds, *other = NULL; float valence; float *v1, *v2; int visFlag; float line_width; int valence_flag = false; AtomInfoType *ai1; int cartoon_side_chain_helper = 0; int ribbon_side_chain_helper = 0; int line_stick_helper = 0; int na_mode; bool *marked = NULL; int valence_found = false; int variable_width = false; float last_line_width = -1.f; int line_color; int hide_long = false; int fancy; const float _0p9 = 0.9F; int ok = true; unsigned int line_counter = 0; OOAlloc(G, RepWireBond); CHECKOK(ok, I); PRINTFD(G, FB_RepWireBond) " RepWireBondNew-Debug: entered.\n" ENDFD; visFlag = false; b = obj->Bond; ai1 = obj->AtomInfo; if(ok && GET_BIT(obj->RepVisCache,cRepLine)){ for(a = 0; a < obj->NBond; a++) { b1 = b->index[0]; b2 = b->index[1]; if((cRepLineBit & ai1[b1].visRep & ai1[b2].visRep)) { visFlag = true; break; } b++; } } if(!visFlag) { OOFreeP(I); return (NULL); /* skip if no dots are visible */ } marked = pymol::calloc<bool>(obj->NAtom); CHECKOK(ok, marked); if (!ok){ OOFreeP(I); return (NULL); } valence_flag = SettingGet_b(G, cs->Setting, obj->Obj.Setting, cSetting_valence); valence = SettingGet_f(G, cs->Setting, obj->Obj.Setting, cSetting_valence_size); cartoon_side_chain_helper = SettingGet_b(G, cs->Setting, obj->Obj.Setting, cSetting_cartoon_side_chain_helper); ribbon_side_chain_helper = SettingGet_b(G, cs->Setting, obj->Obj.Setting, cSetting_ribbon_side_chain_helper); line_stick_helper = SettingGet_b(G, cs->Setting, obj->Obj.Setting, cSetting_line_stick_helper); line_color = SettingGet_color(G, cs->Setting, obj->Obj.Setting, cSetting_line_color); line_width = SettingGet_f(G, cs->Setting, obj->Obj.Setting, cSetting_line_width); if(line_stick_helper && (SettingGet_f(G, cs->Setting, obj->Obj.Setting, cSetting_stick_transparency) > R_SMALL4)) line_stick_helper = false; half_bonds = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_half_bonds); hide_long = SettingGet_b(G, cs->Setting, obj->Obj.Setting, cSetting_hide_long_bonds); na_mode = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_cartoon_nucleic_acid_mode); int na_mode_ribbon = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_ribbon_nucleic_acid_mode); fancy = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_valence_mode) == 1; auto valence_zero_mode = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_valence_zero_mode); b = obj->Bond; for(a = 0; a < obj->NBond; a++) { b1 = b->index[0]; b2 = b->index[1]; if(obj->DiscreteFlag) { if((cs == obj->DiscreteCSet[b1]) && (cs == obj->DiscreteCSet[b2])) { a1 = obj->DiscreteAtmToIdx[b1]; a2 = obj->DiscreteAtmToIdx[b2]; } else { a1 = -1; a2 = -1; } } else { a1 = cs->AtmToIdx[b1]; a2 = cs->AtmToIdx[b2]; } if((a1 >= 0) && (a2 >= 0)) { if(!variable_width) if (AtomInfoCheckBondSetting(G, b, cSetting_line_width)){ variable_width = true; if (valence_found) break; } auto bd_valence_flag = BondSettingGetWD(G, b, cSetting_valence, valence_flag); if(bd_valence_flag) { valence_found = true; if (variable_width) break; } } b++; } RepInit(G, &I->R); I->R.fRender = (void (*)(struct Rep *, RenderInfo * info)) RepWireBondRender; I->R.fFree = (void (*)(struct Rep *)) RepWireBondFree; I->shaderCGO = 0; I->shaderCGO_has_cylinders = 0; I->R.P = NULL; I->R.fRecolor = NULL; I->R.context.object = (void *) obj; I->R.context.state = state; I->R.cs = cs; I->primitiveCGO = CGONew(G); CGOSpecialWithArg(I->primitiveCGO, LINE_LIGHTING, 0.f); CGOSpecial(I->primitiveCGO, LINEWIDTH_FOR_LINES); CGOBegin(I->primitiveCGO, GL_LINES); if(obj->NBond) { if(valence_found) /* build list of up to 2 connected atoms for each atom */ other = ObjectMoleculeGetPrioritizedOtherIndexList(obj, cs); if(ok && (cartoon_side_chain_helper || ribbon_side_chain_helper)) { SideChainHelperMarkNonCartoonBonded(marked, obj, cs, cartoon_side_chain_helper, ribbon_side_chain_helper); } b = obj->Bond; for(a = 0; ok && a < obj->NBond; ++a, ++b) { b1 = b->index[0]; b2 = b->index[1]; ord = b->order; if (ord == 0 && valence_zero_mode == 0) continue; if(obj->DiscreteFlag) { if((cs == obj->DiscreteCSet[b1]) && (cs == obj->DiscreteCSet[b2])) { a1 = obj->DiscreteAtmToIdx[b1]; a2 = obj->DiscreteAtmToIdx[b2]; } else { a1 = -1; a2 = -1; } } else { a1 = cs->AtmToIdx[b1]; a2 = cs->AtmToIdx[b2]; } if((a1 >= 0) && (a2 >= 0)) { AtomInfoType *ati1 = obj->AtomInfo + b1; AtomInfoType *ati2 = obj->AtomInfo + b2; s1 = (ati1->visRep & cRepLineBit); s2 = (ati2->visRep & cRepLineBit); if(s1 ^ s2){ if(!half_bonds) { if(line_stick_helper && (((!s1) && (cRepCylBit & ati1->visRep) && !(cRepCylBit & ati2->visRep)) || ((!s2) && (cRepCylBit & ati2->visRep) && !(cRepCylBit & ati1->visRep)))) s1 = s2 = 1; /* turn on line when both stick and line are alternately shown */ else { s1 = 0; s2 = 0; } } } if(hide_long && (s1 || s2)) { float cutoff = (ati1->vdw + ati2->vdw) * _0p9; v1 = cs->Coord + 3 * a1; v2 = cs->Coord + 3 * a2; ai1 = obj->AtomInfo + b1; if(!within3f(v1, v2, cutoff)) /* atoms separated by more than 90% of the sum of their vdw radii */ s1 = s2 = 0; } if(s1 || s2) { float rgb1[3], rgb2[3]; int terminal = false; auto bd_valence_flag = BondSettingGetWD(G, b, cSetting_valence, valence_flag); auto bd_line_color = BondSettingGetWD(G, b, cSetting_line_color, line_color); if(fancy && bd_valence_flag && (b->order > 1)) { terminal = IsBondTerminal(obj, b1, b2); } if(variable_width) { auto bd_line_width = BondSettingGetWD(G, b, cSetting_line_width, line_width); if (last_line_width!=bd_line_width){ CGOSpecialWithArg(I->primitiveCGO, LINEWIDTH_FOR_LINES, bd_line_width); last_line_width = bd_line_width; } } if(bd_line_color < 0) { if(bd_line_color == cColorObject) { c1 = (c2 = obj->Obj.Color); } else if(ColorCheckRamped(G, bd_line_color)) { c1 = (c2 = bd_line_color); } else { c1 = ati1->color; c2 = ati2->color; } } else { c1 = (c2 = bd_line_color); } v1 = cs->Coord + 3 * a1; v2 = cs->Coord + 3 * a2; if (line_stick_helper && (ati1->visRep & ati2->visRep & cRepCylBit)) { s1 = s2 = 0; } else if ((ati1->flags & ati2->flags & cAtomFlag_polymer)) { // side chain helpers if ((cRepCartoonBit & ati1->visRep & ati2->visRep)) { bool sc_helper = AtomSettingGetWD(G, ati1, cSetting_cartoon_side_chain_helper, cartoon_side_chain_helper); if (!sc_helper) AtomSettingGetIfDefined(G, ati2, cSetting_cartoon_side_chain_helper, &sc_helper); if (sc_helper && SideChainHelperFilterBond(G, marked, ati1, ati2, b1, b2, na_mode, &c1, &c2)) s1 = s2 = 0; } if ((s1 || s2) && (cRepRibbonBit & ati1->visRep & ati2->visRep)) { bool sc_helper = AtomSettingGetWD(G, ati1, cSetting_ribbon_side_chain_helper, ribbon_side_chain_helper); if (!sc_helper) AtomSettingGetIfDefined(G, ati2, cSetting_ribbon_side_chain_helper, &sc_helper); if (sc_helper && SideChainHelperFilterBond(G, marked, ati1, ati2, b1, b2, na_mode_ribbon, &c1, &c2)) s1 = s2 = 0; } } bool isRamped = false; isRamped = ColorGetCheckRamped(G, c1, v1, rgb1, state); isRamped = ColorGetCheckRamped(G, c2, v2, rgb2, state) | isRamped; if (s1 || s2){ if (ord == 0 && valence_zero_mode == 2) { ord = 1; } if (!ord){ RepWireZeroOrderBond(I->primitiveCGO, s1, s2, v1, v2, rgb1, rgb2, b1, b2, a, .15f, .15f, ati1->masked, ati2->masked); } else if (!bd_valence_flag || ord <= 1){ RepLine(I->primitiveCGO, s1, s2, isRamped, v1, v2, rgb1, b1, b2, a, rgb2, ati1->masked, ati2->masked); } else { if (ord == 4){ RepAromatic(I->primitiveCGO, s1, s2, isRamped, v1, v2, other, a1, a2, cs->Coord, rgb1, rgb2, valence, 0, b1, b2, a, ati1->masked, ati2->masked); } else { RepValence(I->primitiveCGO, s1, s2, isRamped, v1, v2, other, a1, a2, cs->Coord, rgb1, rgb2, ord, valence, fancy && !terminal, b1, b2, a, ati1->masked, ati2->masked); } } line_counter++; } } } ok &= !G->Interrupt; } } CGOEnd(I->primitiveCGO); CGOSpecialWithArg(I->primitiveCGO, LINE_LIGHTING, 1.f); CGOStop(I->primitiveCGO); FreeP(marked); FreeP(other); if (!ok || !line_counter){ RepWireBondFree(I); I = NULL; } return (Rep *) I; }
/*------Done in a subroutine to keep main routine stack usage small--------*/ void initialize(void) { watchdog_init(); watchdog_start(); #ifdef RAVEN_LCD_INTERFACE /* First rs232 port for Raven 3290 port */ rs232_init(RS232_PORT_0, USART_BAUD_38400,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8); /* Set input handler for 3290 port */ rs232_set_input(0,raven_lcd_serial_input); #endif /* Second rs232 port for debugging */ rs232_init(RS232_PORT_1, USART_BAUD_57600,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8); /* Redirect stdout to second port */ rs232_redirect_stdout(RS232_PORT_1); clock_init(); #if STACKMONITOR /* Simple stack pointer highwater monitor. Checks for magic numbers in the main * loop. In conjuction with TESTRTIMER, never-used stack will be printed * every STACKMONITOR seconds. */ { extern uint16_t __bss_end; uint16_t p=(uint16_t)&__bss_end; do { *(uint16_t *)p = 0x4242; p+=10; } while (p<SP-10); //don't overwrite our own stack } #endif #define CONF_CALIBRATE_OSCCAL 0 #if CONF_CALIBRATE_OSCCAL { extern uint8_t osccal_calibrated; uint8_t i; PRINTF("\nBefore calibration OSCCAL=%x\n",OSCCAL); for (i=0;i<10;i++) { calibrate_rc_osc_32k(); PRINTF("Calibrated=%x\n",osccal_calibrated); //#include <util/delay_basic.h> //#define delay_us( us ) ( _delay_loop_2(1+(us*F_CPU)/4000000UL) ) // delay_us(50000); } clock_init(); } #endif #if ANNOUNCE_BOOT PRINTF("\n*******Booting %s*******\n",CONTIKI_VERSION_STRING); #endif /* rtimers needed for radio cycling */ rtimer_init(); /* Initialize process subsystem */ process_init(); /* etimers must be started before ctimer_init */ process_start(&etimer_process, NULL); #if RF230BB ctimer_init(); /* Start radio and radio receive process */ NETSTACK_RADIO.init(); /* Set addresses BEFORE starting tcpip process */ rimeaddr_t addr; memset(&addr, 0, sizeof(rimeaddr_t)); get_mac_from_eeprom(addr.u8); #if UIP_CONF_IPV6 memcpy(&uip_lladdr.addr, &addr.u8, 8); #endif rf230_set_pan_addr( get_panid_from_eeprom(), get_panaddr_from_eeprom(), (uint8_t *)&addr.u8 ); rf230_set_channel(get_channel_from_eeprom()); rimeaddr_set_node_addr(&addr); PRINTFD("MAC address %x:%x:%x:%x:%x:%x:%x:%x\n",addr.u8[0],addr.u8[1],addr.u8[2],addr.u8[3],addr.u8[4],addr.u8[5],addr.u8[6],addr.u8[7]); /* Initialize stack protocols */ queuebuf_init(); NETSTACK_RDC.init(); NETSTACK_MAC.init(); NETSTACK_NETWORK.init(); #if ANNOUNCE_BOOT PRINTF("%s %s, channel %u",NETSTACK_MAC.name, NETSTACK_RDC.name,rf230_get_channel()); if (NETSTACK_RDC.channel_check_interval) {//function pointer is zero for sicslowmac unsigned short tmp; tmp=CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval == 0 ? 1:\ NETSTACK_RDC.channel_check_interval()); if (tmp<65535) printf_P(PSTR(", check rate %u Hz"),tmp); } PRINTF("\n"); #if UIP_CONF_IPV6_RPL PRINTF("RPL Enabled\n"); #endif #if UIP_CONF_ROUTER PRINTF("Routing Enabled\n"); #endif #endif /* ANNOUNCE_BOOT */ // rime_init(rime_udp_init(NULL)); // uip_router_register(&rimeroute); process_start(&tcpip_process, NULL); #else /* Original RF230 combined mac/radio driver */ /* mac process must be started before tcpip process! */ process_start(&mac_process, NULL); process_start(&tcpip_process, NULL); #endif /*RF230BB*/ #ifdef RAVEN_LCD_INTERFACE process_start(&raven_lcd_process, NULL); #endif /* Autostart other processes */ autostart_start(autostart_processes); //Give ourselves a prefix // init_net(); /*---If using coffee file system create initial web content if necessary---*/ #if COFFEE_FILES int fa = cfs_open( "/index.html", CFS_READ); if (fa<0) { //Make some default web content PRINTF("No index.html file found, creating upload.html!\n"); PRINTF("Formatting FLASH file system for coffee..."); cfs_coffee_format(); PRINTF("Done!\n"); fa = cfs_open( "/index.html", CFS_WRITE); int r = cfs_write(fa, &"It works!", 9); if (r<0) PRINTF("Can''t create /index.html!\n"); cfs_close(fa); // fa = cfs_open("upload.html"), CFW_WRITE); // <html><body><form action="upload.html" enctype="multipart/form-data" method="post"><input name="userfile" type="file" size="50" /><input value="Upload" type="submit" /></form></body></html> } #endif /* COFFEE_FILES */ /* Add addresses for testing */ #if 0 { uip_ip6addr_t ipaddr; uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); // uip_ds6_prefix_add(&ipaddr,64,0); } #endif /*--------------------------Announce the configuration---------------------*/ #if ANNOUNCE_BOOT #if AVR_WEBSERVER uint8_t i; char buf[80]; unsigned int size; for (i=0;i<UIP_DS6_ADDR_NB;i++) { if (uip_ds6_if.addr_list[i].isused) { httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr,buf); PRINTF("IPv6 Address: %s\n",buf); } } eeprom_read_block (buf,server_name, sizeof(server_name)); buf[sizeof(server_name)]=0; PRINTF("%s",buf); eeprom_read_block (buf,domain_name, sizeof(domain_name)); buf[sizeof(domain_name)]=0; size=httpd_fs_get_size(); #ifndef COFFEE_FILES PRINTF(".%s online with fixed %u byte web content\n",buf,size); #elif COFFEE_FILES==1 PRINTF(".%s online with static %u byte EEPROM file system\n",buf,size); #elif COFFEE_FILES==2 PRINTF(".%s online with dynamic %u KB EEPROM file system\n",buf,size>>10); #elif COFFEE_FILES==3 PRINTF(".%s online with static %u byte program memory file system\n",buf,size); #elif COFFEE_FILES==4 PRINTF(".%s online with dynamic %u KB program memory file system\n",buf,size>>10); #endif /* COFFEE_FILES */ #else PRINTF("Online\n"); #endif /* AVR_WEBSERVER */ #endif /* ANNOUNCE_BOOT */ }
/*------Done in a subroutine to keep main routine stack usage small--------*/ void initialize(void) { watchdog_init(); watchdog_start(); init_lowlevel(); clock_init(); forwarding_enabled = get_forwarding_from_eeprom(); #if ANNOUNCE_BOOT PRINTF("\n*******Booting %s*******\n",CONTIKI_VERSION_STRING); #endif /* rtimers needed for radio cycling */ rtimer_init(); /* Initialize process subsystem */ process_init(); /* etimers must be started before ctimer_init */ process_start(&etimer_process, NULL); #if RF230BB || RF212BB ctimer_init(); /* Start radio and radio receive process */ NETSTACK_RADIO.init(); /* Set addresses BEFORE starting tcpip process */ rimeaddr_t addr; memset(&addr, 0, sizeof(rimeaddr_t)); get_mac_from_eeprom(addr.u8); #if UIP_CONF_IPV6 memcpy(&uip_lladdr.addr, &addr.u8, 8); #endif #if RF230BB rf230_set_pan_addr( get_panid_from_eeprom(), get_panaddr_from_eeprom(), (uint8_t *)&addr.u8 ); rf230_set_channel(CHANNEL_802_15_4); #elif RF212BB rf212_set_pan_addr( get_panid_from_eeprom(), get_panaddr_from_eeprom(), (uint8_t *)&addr.u8 ); #endif extern uint16_t mac_dst_pan_id; extern uint16_t mac_src_pan_id; //set pan_id for frame creation mac_dst_pan_id = get_panid_from_eeprom(); mac_src_pan_id = mac_dst_pan_id; rimeaddr_set_node_addr(&addr); PRINTFD("MAC address %x:%x:%x:%x:%x:%x:%x:%x\n",addr.u8[0],addr.u8[1],addr.u8[2],addr.u8[3],addr.u8[4],addr.u8[5],addr.u8[6],addr.u8[7]); /* Initialize stack protocols */ queuebuf_init(); NETSTACK_RDC.init(); NETSTACK_MAC.init(); NETSTACK_NETWORK.init(); #if ANNOUNCE_BOOT #if RF230BB PRINTF("%s %s, channel %u",NETSTACK_MAC.name, NETSTACK_RDC.name, rf230_get_channel()); #elif RF212BB PRINTF("%s %s, channel %u",NETSTACK_MAC.name, NETSTACK_RDC.name, rf212_get_channel()); #endif /* RF230BB */ if (NETSTACK_RDC.channel_check_interval) {//function pointer is zero for sicslowmac unsigned short tmp; tmp=CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval == 0 ? 1:\ NETSTACK_RDC.channel_check_interval()); if (tmp<65535) printf_P(PSTR(", check rate %u Hz"),tmp); } PRINTF("\n"); #if UIP_CONF_IPV6_RPL PRINTF("RPL Enabled\n"); #endif #if UIP_CONF_ROUTER PRINTF("Routing Enabled\n"); #endif #endif /* ANNOUNCE_BOOT */ // rime_init(rime_udp_init(NULL)); // uip_router_register(&rimeroute); process_start(&tcpip_process, NULL); #else /* Original RF230 combined mac/radio driver */ /* mac process must be started before tcpip process! */ process_start(&mac_process, NULL); process_start(&tcpip_process, NULL); #endif /*RF230BB || RF212BB*/ #if WEBSERVER process_start(&webserver_nogui_process, NULL); #endif /* Handler for HEXABUS UDP Packets */ process_start(&udp_handler_process, NULL); mdns_responder_init(); /* Button Process */ process_start(&button_pressed_process, NULL); /* Init Metering */ metering_init(); /*Init Relay */ relay_init(); /* Autostart other processes */ autostart_start(autostart_processes); /*---If using coffee file system create initial web content if necessary---*/ #if COFFEE_FILES int fa = cfs_open( "/index.html", CFS_READ); if (fa<0) { //Make some default web content PRINTF("No index.html file found, creating upload.html!\n"); PRINTF("Formatting FLASH file system for coffee..."); cfs_coffee_format(); PRINTF("Done!\n"); fa = cfs_open( "/index.html", CFS_WRITE); int r = cfs_write(fa, &"It works!", 9); if (r<0) PRINTF("Can''t create /index.html!\n"); cfs_close(fa); // fa = cfs_open("upload.html"), CFW_WRITE); // <html><body><form action="upload.html" enctype="multipart/form-data" method="post"><input name="userfile" type="file" size="50" /><input value="Upload" type="submit" /></form></body></html> } #endif /* COFFEE_FILES */ /* Add addresses for testing */ #if 0 { uip_ip6addr_t ipaddr; uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); // uip_ds6_prefix_add(&ipaddr,64,0); } #endif /*--------------------------Announce the configuration---------------------*/ #if ANNOUNCE_BOOT #if WEBSERVER uint8_t i; char buf[80]; unsigned int size; for (i=0;i<UIP_DS6_ADDR_NB;i++) { if (uip_ds6_if.addr_list[i].isused) { httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr,buf); PRINTF("IPv6 Address: %s\n",buf); } } eeprom_read_block(buf, (const void*) EE_DOMAIN_NAME, EE_DOMAIN_NAME_SIZE); buf[EE_DOMAIN_NAME_SIZE] = 0; size=httpd_fs_get_size(); #ifndef COFFEE_FILES PRINTF(".%s online with fixed %u byte web content\n",buf,size); #elif COFFEE_FILES==1 PRINTF(".%s online with static %u byte EEPROM file system\n",buf,size); #elif COFFEE_FILES==2 PRINTF(".%s online with dynamic %u KB EEPROM file system\n",buf,size>>10); #elif COFFEE_FILES==3 PRINTF(".%s online with static %u byte program memory file system\n",buf,size); #elif COFFEE_FILES==4 PRINTF(".%s online with dynamic %u KB program memory file system\n",buf,size>>10); #endif /* COFFEE_FILES */ #else PRINTF("Online\n"); #endif /* WEBSERVER */ #endif /* ANNOUNCE_BOOT */ }
int main(void) { /* * Initalize hardware. */ PIO_InitializeInterrupts(0); usbmain(); clock_init(); rtimer_init(); process_init(); process_start(&etimer_process, NULL); ctimer_init(); NETSTACK_RADIO.init(); rimeaddr_t addr; eeprom_init(); memset(&addr, 0, sizeof(rimeaddr_t)); memcpy(&addr.u8, eeprom_getEUI64(), 8); #if UIP_CONF_IPV6 memcpy(&uip_lladdr.addr, &addr.u8, 8); #endif #if RF212BB rf212_set_pan_addr( eeprom_getPanid(), eeprom_getPanaddr(), (uint8_t *)&addr.u8); #endif extern uint16_t mac_dst_pan_id; extern uint16_t mac_src_pan_id; //set pan_id for frame creation mac_dst_pan_id = eeprom_getPanid(); mac_src_pan_id = mac_dst_pan_id; rimeaddr_set_node_addr(&addr); PRINTFD("MAC address %x:%x:%x:%x:%x:%x:%x:%x\n",addr.u8[0],addr.u8[1],addr.u8[2],addr.u8[3],addr.u8[4],addr.u8[5],addr.u8[6],addr.u8[7]); /* Initialize stack protocols */ queuebuf_init(); NETSTACK_RDC.init(); NETSTACK_MAC.init(); NETSTACK_NETWORK.init(); //netstack_init(); process_start(&tcpip_process, NULL); /* * Initialize Contiki and our processes. */ //netstack_init(); autostart_start(autostart_processes); while(1) { int r; do { /* Reset watchdog. */ r = process_run(); } while(r > 0); } }