################################################################################
# centroid1.py
#
# Post Processor for the centroid M40 machine
# 
#
# Dan Falck, 7th March 2010

import nc
import iso_modal
import math

import datetime

now = datetime.datetime.now()



################################################################################
class Creator(iso_modal.Creator):
    
    def __init__(self):
        iso_modal.Creator.__init__(self)

        self.useCrc = True
        self.useCrcCenterline = True
        self.absolute_flag = True
        self.prev_g91 = ''
        self.safe_z =None
    def SPINDLE(self, format, speed): return(self.SPACE() + 'S' + (format % speed))
################################################################################
#cutter comp

    #def crc_on(self):
    #    self.useCrc = True
    #    self.useCrcCenterline = True

    #def crc_off(self):
    #    self.useCrc = False

################################################################################
# general 

    def comment(self, text):
        self.write(';' + text +'\n')  
    def write_blocknum(self):
        pass 

################################################################################
# settings for absolute or incremental mode
    def absolute(self):
        self.write(self.ABSOLUTE()+'\n')        
        self.absolute_flag = True

    def incremental(self):
        self.write(self.INCREMENTAL()+'\n')
        self.absolute_flag = False

################################################################################
# APT style INSERT- insert anything into program

    def insert(self, text):
        self.write((text + '\n'))

################################################################################
# program begin and end

    def program_begin(self, id, name=''):
        self.write(';time:'+str(now)+'\n')
        self.write('G17 G20 G80 G40 G90\n')
        

    def program_end(self):
        self.write('M05\n')
        self.write('M25\n')
        self.write('G00 X-1.0 Y1.0\n')
        self.write('G17 G80 G40 G90\n')
        self.write('M99\n')

    def program_stop(self, optional=False):
        self.write_blocknum()
        if (optional) : 
            self.write(self.STOP_OPTIONAL() + '\n')
        else : 
            self.write('M05\n')
            self.write('M25\n')
            self.write(self.STOP() + '\n')
            self.prev_g0123 = ''
################################################################################
# coordinate system ie G54-G59

    def workplane(self, id):
        self.write('M25\n')
        if ((id >= 1) and (id <= 6)):
            self.g_list.append(self.WORKPLANE() % (id + self.WORKPLANE_BASE()))
        if ((id >= 7) and (id <= 9)):
            self.g_list.append(((self.WORKPLANE() % (6 + self.WORKPLANE_BASE())) + ('.%i' % (id - 6))))
        self.prev_g0123 = ''            

################################################################################
# clearance plane

    def clearanceplane(self,z=None):
        self.safe_z = z
################################################################################
# return to home
    def rapid_home(self, x=None, y=None, z=None, a=None, b=None, c=None):
        """Rapid relative to home position"""
        self.write('M05\n')              
        self.write('M25\n')
        self.write(self.RAPID())
        self.write(self.X() + (self.fmt % x))
        self.write(self.Y() + (self.fmt % y))
        self.write('\n')                     
                     
################################################################################
# tool info
    def tool_change(self, id):
        self.write_blocknum()
        self.write((self.TOOL() % id) + '\n')
        self.t = id
        self.write('M25\n')
        if self.safe_z == None:
            self.write('G43 H'+ str(id) + ' Z')
            self.write('1.0')
            self.write ('\n')
        else:
            self.write('G43 H'+ str(id) + ' Z')
            self.write(str(self.safe_z))
            self.write ('\n')


    def tool_defn(self, id, name='', params=None):
        #self.write('G43 \n')
        pass

    def write_spindle(self):
        pass


    def spindle(self, s, clockwise):
        if s < 0: 
            clockwise = not clockwise
            s = abs(s)
        
        self.s = self.SPINDLE(self.FORMAT_ANG(), s)
        if clockwise:
           #self.s =  self.SPINDLE_CW() + self.s
            self.s =  self.SPINDLE_CW()                
            self.write(self.s +  '\n')
            self.write('G04 P2.0 \n')
                
        else:
            self.s =  self.SPINDLE_CCW() + self.s

    def end_canned_cycle(self):
        self.write_blocknum()
        self.write(self.SPACE() + self.END_CANNED_CYCLE() + '\n')
        self.prev_drill = ''
        self.prev_g0123 = ''
        self.prev_z = ''   
        self.prev_f = '' 
        self.prev_retract = '' 
        self.write('M05\n')
        self.write('M25\n') 
        self.write('G00 X-1.0 Y1.0\n')

nc.creator = Creator()
