void goto_learning(void) { if (laser.state == LASER_OFF) { laser_on(); laser_wait_for_reading(); } laser.state = LASER_LEARNING; }
void pioneer_ldv1000_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch (id) { case TID_MULTIJUMP: { // bit 5 of port B on PPI 1 selects the direction of slider movement int direction = (m_portb1 & 0x20) ? 1 : -1; advance_slider(direction); // update down counter and reschedule if (--m_counter != 0) timer.adjust(MULTIJUMP_TRACK_TIME); break; } case TID_VSYNC_OFF: m_vsync = false; break; case TID_VBI_DATA_FETCH: { // appears to return data in reverse order UINT32 lines[3]; lines[0] = get_field_code(LASERDISC_CODE_LINE1718, false); lines[1] = get_field_code(LASERDISC_CODE_LINE17, false); lines[2] = get_field_code(LASERDISC_CODE_LINE16, false); // fill in the details memset(m_vbi, 0, sizeof(m_vbi)); if (focus_on() && laser_on()) { // loop over lines for (int line = 0; line < 3; line++) { UINT8 *dest = &m_vbi[line * 7]; UINT32 data = lines[line]; // the logic only processes leadin/leadout/frame number codes if (data == VBI_CODE_LEADIN || data == VBI_CODE_LEADOUT || (data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) { *dest++ = 0x09 | (((data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) ? 0x02 : 0x00); *dest++ = 0x08; *dest++ = (data >> 16) & 0x0f; *dest++ = (data >> 12) & 0x0f; *dest++ = (data >> 8) & 0x0f; *dest++ = (data >> 4) & 0x0f; *dest++ = (data >> 0) & 0x0f; } } } // signal that data is ready and reset the readback index m_vbiready = true; m_vbiindex = 0; break; } // pass everything else onto the parent default: laserdisc_device::device_timer(timer, id, param, ptr); break; }
void processController(){ if(data_received){ switch(received_command){ case 0x01: write_line_enable = 1; break; // home y axis case 0x02: home_y_axis(); acknowledge(); break; // home z axis case 0x03: home_z_axis(); acknowledge(); break; // turn laser on case 0x04: laser_on(); acknowledge(); break; // turn laser off case 0x05: laser_off(); acknowledge(); break; // next layer case 0x06: // moveToNextLayer here! moveToNextLayer(); toggle_y_Direction(); acknowledge(); break; case 0x07: moveToNextLayer(); acknowledge(); break; case 0x08: move_z_to_end_position(); acknowledge(); break; case 0x09: set_exposing_cycles(); acknowledge(); break; case 0x0a: move_z_relative(); acknowledge(); break; } } if (exposing_done){ moveToNextLine(); data_table[0] = 0; write_line_enable = 0; exposing_done = 0; acknowledge(); } }
int main(void) { // init i/o DEBUG_PORT = 0x00; DEBUG_DDR = 0xFF; init_ports(); uint8_t i; uint8_t output_mask = 1 << OUTPUT_FIRST; for(i=0; i<N_LASERS; i++) { output_mask |= output_mask << 1; output_mask <<= 1; } /* uart_init(0,0,0,0,0); uart_transmit_byte_block('\n'); uart_transmit_byte_block('\r'); */ int state = ON; for(;;) { // if module is disabled, turn off all outputs while(!is_enabled()) { OUTPUT_PORT &= ~output_mask; led_off(); _delay_ms(10); } // indicator led led_on(); // turn all lasers to state X for(i=0; i<N_LASERS; i++) { if(state == ON) laser_on(i); else laser_off(i); } // wait T ms _delay_ms(10); // is input at state X? uint8_t inputs = 0; // read and parse photodetector inputs inputs = DETECTOR_PINS & DETECTOR_MASK; for(i=0; i<N_LASERS; i++) { if(pin_value(inputs, i+5) == state) { laser[i] += 1; if(laser[i] > THRESH) { laser[i] = THRESH; set_output(i, ON); } else { set_output(i, OFF); } } else { if(laser[i] > 0) /* * TODO : should maybe consider setting it to zero directly */ laser[i] -= 1; // No hysteresis implemented yet. if(laser[i] < THRESH) set_output(i, OFF); } } // change state state ^= 1; } // main return 0; }
/** * Read the input buffer and find any recognized commands. One G or M command per line. */ void processCommand() { // blank lines if(buffer[0]==';') return; long cmd; // is there a line number? cmd=parsenumber('N',-1); if(cmd!=-1 && buffer[0]=='N') { // line number must appear first on the line if( cmd != line_number ) { // wrong line number error Serial.print(F("BADLINENUM ")); Serial.println(line_number); return; } // is there a checksum? if(strchr(buffer,'*')!=0) { // yes. is it valid? char checksum=0; int c=0; while(buffer[c]!='*') checksum ^= buffer[c++]; c++; // skip * int against = strtod(buffer+c,NULL); if( checksum != against ) { Serial.print(F("BADCHECKSUM ")); Serial.println(line_number); return; } } else { Serial.print(F("NOCHECKSUM ")); Serial.println(line_number); return; } line_number++; } cmd = parsenumber('G',-1); switch(cmd) { case 0: // move linear case 1: // move linear // Move Linear here do_move(parsenumber('Y',0), parsenumber('Z',0), parsenumber('F',30000)); break; case 3: delay(parsenumber('D',0)); break; case 4: set_exposing_cycles(parsenumber('E',0)); break; // dwell case 5: fill_laser_buffer(parsedistance('D',0)); break; case 6: delay(20); expose_line(parsenumber('E',1000)); break; case 7: create_test_pattern(); expose_line(parsenumber('E',50000)); break; case 29: //home z- axis home_z_axis(); break; case 30: home_y_axis(); break; case 28: // home all axis break; case 90: mode_abs=1; break; // absolute mode case 91: mode_abs=0; break; // relative mode case 92: // set logical position // set position to 0 here break; default: break; } // M Code section cmd = parsenumber('M',-1); switch(cmd) { case 18: // disable motors motors_release(); break; case 19: laser_on(); break; case 20: laser_off(); break; case 21: vat_down(); break; case 22: vat_up(); break; case 100: help(); break; case 110: line_number = parsenumber('N',line_number); break; case 114: // print position here break; default: break; } }