
#include <stdio.h>

#include "py/obj.h"
#include "py/gc.h"
#include "py/mphal.h"

//#include "board.h"
#include "p2.h"
//#include "sdcard.h"

#include "propeller2.h" //needs this too?
#include "smartpins.h" //RJA for smartpin constants

//pinw
STATIC mp_obj_t p2_pinw(mp_obj_t pin_in, mp_obj_t pin_data) {
   int n=mp_obj_get_int(pin_in);
   int d=mp_obj_get_int(pin_data);
   _pinw(n,d);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_pinw_obj, p2_pinw);

//pinl
STATIC mp_obj_t p2_pinl(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   _pinl(n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinl_obj, p2_pinl);

//pinh
STATIC mp_obj_t p2_pinh(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   _pinh(n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinh_obj, p2_pinh);

//pint
STATIC mp_obj_t p2_pint(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   _pinnot(n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pint_obj, p2_pint);

//pinf
STATIC mp_obj_t p2_pinf(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   _pinf(n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinf_obj, p2_pinf);

//pinr
STATIC mp_obj_t p2_pinr(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   int d=_pinr(n);
   return mp_obj_new_int(d);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinr_obj, p2_pinr);

//pinstart
STATIC mp_obj_t p2_pinstart(mp_uint_t n_args, const mp_obj_t *args) {
   int n=mp_obj_get_int(args[0]);
   int m=mp_obj_get_int(args[1]);
   int x=mp_obj_get_int(args[2]);
   int y=mp_obj_get_int(args[3]);
   //Start PinField smart pin(s): DIR=0, then WRPIN=Mode, WXPIN=Xval, WYPIN=Yval, then DIR=1.
   _pinf(n);
   _wrpin(n,m);
   _wxpin(n,x);
   _wypin(n,y);
   _pinh(n);
   //_pinstart(n,m,x,y);  //not in the RISCVP2 version...
   return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(p2_pinstart_obj, 4, p2_pinstart);

//pinclear
STATIC mp_obj_t p2_pinclear(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   //Clear PinField smart pin(s): DIR=0, then WRPIN=0.
   _pinf(n);
   _wrpin(n,0);
   //_pinclear(n); //not in the RISCVP2 version...
   return mp_const_none; 
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinclear_obj, p2_pinclear);

//wrpin
STATIC mp_obj_t p2_wrpin(mp_obj_t pin_in, mp_obj_t pin_data) {
   int n=mp_obj_get_int(pin_in);
   int d=mp_obj_get_int(pin_data);
   _wrpin(n,d);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_wrpin_obj, p2_wrpin);

//wxpin
STATIC mp_obj_t p2_wxpin(mp_obj_t pin_in, mp_obj_t pin_data) {
   int n=mp_obj_get_int(pin_in);
   int d=mp_obj_get_int(pin_data);
   _wxpin(n,d);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_wxpin_obj, p2_wxpin);

//wypin
STATIC mp_obj_t p2_wypin(mp_obj_t pin_in, mp_obj_t pin_data) {
   int n=mp_obj_get_int(pin_in);
   int d=mp_obj_get_int(pin_data);
   _wypin(n,d);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_wypin_obj, p2_wypin);

//akpin
STATIC mp_obj_t p2_akpin(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   _akpin(n);
   return mp_const_none;  
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_akpin_obj, p2_akpin);

//rdpin
STATIC mp_obj_t p2_rdpin(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   int d=_rdpin(n);
   return mp_obj_new_int(d);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_rdpin_obj, p2_rdpin);

/*  RJA:  Not implemented in RISCVP2
//rqpin
STATIC mp_obj_t p2_rqpin(mp_obj_t pin_in) {
   int n=mp_obj_get_int(pin_in);
   int d=_rqpin(n);
   return mp_obj_new_int(d);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_rqpin_obj, p2_rqpin);
*/

//clkfreq
STATIC mp_obj_t p2_clkfreq() {
   int d=_clockfreq();
   return mp_obj_new_int(d);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(p2_clkfreq_obj, p2_clkfreq);

void StartServoUs(int pin, int us)
{//Start servo on provided pin# at given microseconds value
   int x=20000<<16; //20ms
   x+=_clockfreq()/1000000;  //set 1us timing
   //enforce limits on servo position signalling
   if (us<600)
   	us=600;
   if (us>2400)
   	us=2400;
   _pinf(pin);
   _wrpin(pin,P_OE|P_PWM_SAWTOOTH);
   _wxpin(pin,x);
   _wypin(pin,us);
   _pinh(pin);
}


//start servo in degrees
STATIC mp_obj_t p2_startservo(mp_obj_t n, mp_obj_t d) {
   int pin=mp_obj_get_int(n);
   int deg=mp_obj_get_int(d);
   int usecs=deg*10+600;
   StartServoUs(pin,usecs);
   return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_startservo_obj, p2_startservo);

void SetServoUs(int pin, int us)
{//Sets servo on provided pin# at given microseconds value
   int x=20000<<16; //20ms
   x+=_clockfreq()/1000000;  //set 1us timing
   //enforce limits on servo position signalling
   if (us<600)
   	us=600;
   if (us>2400)
   	us=2400;
   _wypin(pin,us);
}


//set servo in degrees
STATIC mp_obj_t p2_setservo(mp_obj_t n, mp_obj_t d) {
   int pin=mp_obj_get_int(n);
   int deg=mp_obj_get_int(d);
   int usecs=deg*10+600;
   SetServoUs(pin,usecs);
   return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_setservo_obj, p2_setservo);

//start servo in microseconds
STATIC mp_obj_t p2_startservous(mp_obj_t n, mp_obj_t u) {
   int pin=mp_obj_get_int(n);
   int us=mp_obj_get_int(u);
   SetServoUs(pin,us);   
   return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_startservous_obj, p2_startservous);

//set servo in microseconds
STATIC mp_obj_t p2_setservous(mp_obj_t n, mp_obj_t u) {
   int pin=mp_obj_get_int(n);
   int us=mp_obj_get_int(u);
   SetServoUs(pin,us);   
   return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(p2_setservous_obj, p2_setservous);

//Stop servo is same as pinclear
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_stopservo_obj, p2_pinclear);


STATIC const mp_rom_map_elem_t p2_module_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_p2) },

    
    { MP_ROM_QSTR(MP_QSTR_pinw), MP_ROM_PTR(&p2_pinw_obj) },
    { MP_ROM_QSTR(MP_QSTR_pinl), MP_ROM_PTR(&p2_pinl_obj) },
    { MP_ROM_QSTR(MP_QSTR_pinh), MP_ROM_PTR(&p2_pinh_obj) },   
    { MP_ROM_QSTR(MP_QSTR_pint), MP_ROM_PTR(&p2_pint_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_pinf), MP_ROM_PTR(&p2_pinf_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_pinr), MP_ROM_PTR(&p2_pinr_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_pinstart), MP_ROM_PTR(&p2_pinstart_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_pinclear), MP_ROM_PTR(&p2_pinclear_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_wrpin), MP_ROM_PTR(&p2_wrpin_obj) },  
    { MP_ROM_QSTR(MP_QSTR_wxpin), MP_ROM_PTR(&p2_wxpin_obj) },  
    { MP_ROM_QSTR(MP_QSTR_wypin), MP_ROM_PTR(&p2_wypin_obj) },
    { MP_ROM_QSTR(MP_QSTR_akpin), MP_ROM_PTR(&p2_akpin_obj) }, 
    { MP_ROM_QSTR(MP_QSTR_rdpin), MP_ROM_PTR(&p2_rdpin_obj) }, 
    //{ MP_ROM_QSTR(MP_QSTR_rqpin), MP_ROM_PTR(&p2_rqpin_obj) },   
    { MP_ROM_QSTR(MP_QSTR_clkfreq), MP_ROM_PTR(&p2_clkfreq_obj) },  
    
    { MP_ROM_QSTR(MP_QSTR_startservo), MP_ROM_PTR(&p2_startservo_obj) },  
    { MP_ROM_QSTR(MP_QSTR_startservous), MP_ROM_PTR(&p2_startservous_obj) },  
    { MP_ROM_QSTR(MP_QSTR_setservo), MP_ROM_PTR(&p2_setservo_obj) },  
    { MP_ROM_QSTR(MP_QSTR_setservous), MP_ROM_PTR(&p2_setservous_obj) },  
    { MP_ROM_QSTR(MP_QSTR_stopservo), MP_ROM_PTR(&p2_stopservo_obj) },  

//Smart pin constants

        { MP_ROM_QSTR(MP_QSTR_P_TRUE_A), MP_ROM_INT(P_TRUE_A)},
	//RJA: TOO BIG for 31 bit short int!  { MP_ROM_QSTR(MP_QSTR_P_INVERT_A), MP_ROM_INT(P_INVERT_A)}, 
	{ MP_ROM_QSTR(MP_QSTR_P_LOCAL_A), MP_ROM_INT(P_LOCAL_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS1_A), MP_ROM_INT(P_PLUS1_A) },
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS2_A), MP_ROM_INT(P_PLUS2_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS3_A), MP_ROM_INT(P_PLUS3_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_OUTBIT_A), MP_ROM_INT(P_OUTBIT_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS3_A), MP_ROM_INT(P_MINUS3_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS2_A), MP_ROM_INT(P_MINUS2_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS1_A), MP_ROM_INT(P_MINUS1_A)},

	{ MP_ROM_QSTR(MP_QSTR_P_TRUE_B), MP_ROM_INT(P_TRUE_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_INVERT_B), MP_ROM_INT(P_INVERT_B)}, 
	{ MP_ROM_QSTR(MP_QSTR_P_LOCAL_B), MP_ROM_INT(P_LOCAL_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS1_B), MP_ROM_INT(P_PLUS1_B) },
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS2_B), MP_ROM_INT(P_PLUS2_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_PLUS3_B), MP_ROM_INT(P_PLUS3_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_OUTBIT_B), MP_ROM_INT(P_OUTBIT_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS3_B), MP_ROM_INT(P_MINUS3_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS2_B), MP_ROM_INT(P_MINUS2_B)},
	{ MP_ROM_QSTR(MP_QSTR_P_MINUS1_B), MP_ROM_INT(P_MINUS1_B)},

	{ MP_ROM_QSTR(MP_QSTR_P_PASS_AB), MP_ROM_INT(P_PASS_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_AND_AB), MP_ROM_INT(P_AND_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_OR_AB), MP_ROM_INT(P_OR_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_XOR_AB), MP_ROM_INT(P_XOR_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_FILT0_AB), MP_ROM_INT(P_FILT0_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_FILT1_AB), MP_ROM_INT(P_FILT1_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_FILT2_AB), MP_ROM_INT(P_FILT2_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_FILT3_AB), MP_ROM_INT(P_FILT3_AB)},

	{ MP_ROM_QSTR(MP_QSTR_P_LOGIC_A), MP_ROM_INT(P_LOGIC_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOGIC_A_FB), MP_ROM_INT(P_LOGIC_A_FB)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOGIC_B_FB), MP_ROM_INT(P_LOGIC_B_FB)},
	{ MP_ROM_QSTR(MP_QSTR_P_SCHMITT_A), MP_ROM_INT(P_SCHMITT_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_SCHMITT_A_FB), MP_ROM_INT(P_SCHMITT_A_FB)},
	{ MP_ROM_QSTR(MP_QSTR_P_SCHMITT_B_FB), MP_ROM_INT(P_SCHMITT_B_FB)},
	{ MP_ROM_QSTR(MP_QSTR_P_COMPARE_AB), MP_ROM_INT(P_COMPARE_AB)},
	{ MP_ROM_QSTR(MP_QSTR_P_COMPARE_AB_FB), MP_ROM_INT(P_COMPARE_AB_FB)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_GIO), MP_ROM_INT(P_ADC_GIO)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_VIO), MP_ROM_INT(P_ADC_VIO)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_FLOAT), MP_ROM_INT(P_ADC_FLOAT)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_1X), MP_ROM_INT(P_ADC_1X)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_3X), MP_ROM_INT(P_ADC_3X)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_10X), MP_ROM_INT(P_ADC_10X)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_30X), MP_ROM_INT(P_ADC_30X)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_100X), MP_ROM_INT(P_ADC_100X)},

	{ MP_ROM_QSTR(MP_QSTR_P_DAC_990R_3V), MP_ROM_INT(P_DAC_990R_3V)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_600R_2V), MP_ROM_INT(P_DAC_600R_2V)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_124R_3V), MP_ROM_INT(P_DAC_124R_3V)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_75R_2V), MP_ROM_INT(P_DAC_75R_2V)},
	{ MP_ROM_QSTR(MP_QSTR_P_LEVEL_A), MP_ROM_INT(P_LEVEL_A)},
	{ MP_ROM_QSTR(MP_QSTR_P_LEVEL_A_FBN), MP_ROM_INT(P_LEVEL_A_FBN)},
	{ MP_ROM_QSTR(MP_QSTR_P_LEVEL_B_FBP), MP_ROM_INT(P_LEVEL_B_FBP)},
	{ MP_ROM_QSTR(MP_QSTR_P_LEVEL_B_FBN), MP_ROM_INT(P_LEVEL_B_FBN)},

	{ MP_ROM_QSTR(MP_QSTR_P_ASYNC_IO), MP_ROM_INT(P_ASYNC_IO)},
	{ MP_ROM_QSTR(MP_QSTR_P_SYNC_IO), MP_ROM_INT(P_SYNC_IO)},
	{ MP_ROM_QSTR(MP_QSTR_P_TRUE_IN), MP_ROM_INT(P_TRUE_IN)},
	{ MP_ROM_QSTR(MP_QSTR_P_INVERT_IN), MP_ROM_INT(P_INVERT_IN)},
	{ MP_ROM_QSTR(MP_QSTR_P_TRUE_OUTPUT), MP_ROM_INT(P_TRUE_OUTPUT)},
	{ MP_ROM_QSTR(MP_QSTR_P_INVERT_OUTPUT), MP_ROM_INT(P_INVERT_OUTPUT)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_FAST), MP_ROM_INT(P_HIGH_FAST)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_1K5), MP_ROM_INT(P_HIGH_1K5)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_15K), MP_ROM_INT(P_HIGH_15K)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_150K), MP_ROM_INT(P_HIGH_150K)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_1MA), MP_ROM_INT(P_HIGH_1MA)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_100UA), MP_ROM_INT(P_HIGH_100UA)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_10UA), MP_ROM_INT(P_HIGH_10UA)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_FLOAT), MP_ROM_INT(P_HIGH_FLOAT)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_FAST), MP_ROM_INT(P_LOW_FAST)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_1K5), MP_ROM_INT(P_LOW_1K5)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_15K), MP_ROM_INT(P_LOW_15K)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_150K), MP_ROM_INT(P_LOW_150K)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_1MA), MP_ROM_INT(P_LOW_1MA)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_100UA), MP_ROM_INT(P_LOW_100UA)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_10UA), MP_ROM_INT(P_LOW_10UA)},
	{ MP_ROM_QSTR(MP_QSTR_P_LOW_FLOAT), MP_ROM_INT(P_LOW_FLOAT)},

	{ MP_ROM_QSTR(MP_QSTR_P_TT_00), MP_ROM_INT(P_TT_00)},
	{ MP_ROM_QSTR(MP_QSTR_P_TT_01), MP_ROM_INT(P_TT_01)},
	{ MP_ROM_QSTR(MP_QSTR_P_TT_10), MP_ROM_INT(P_TT_10)},
	{ MP_ROM_QSTR(MP_QSTR_P_TT_11), MP_ROM_INT(P_TT_11)},
	{ MP_ROM_QSTR(MP_QSTR_P_OE), MP_ROM_INT(P_OE)},
	{ MP_ROM_QSTR(MP_QSTR_P_CHANNEL), MP_ROM_INT(P_CHANNEL)},
	{ MP_ROM_QSTR(MP_QSTR_P_BITDAC), MP_ROM_INT(P_BITDAC)},
	{ MP_ROM_QSTR(MP_QSTR_P_NORMAL), MP_ROM_INT(P_NORMAL)},
	{ MP_ROM_QSTR(MP_QSTR_P_REPOSITORY), MP_ROM_INT(P_REPOSITORY)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_NOISE), MP_ROM_INT(P_DAC_NOISE)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_DITHER_RND), MP_ROM_INT(P_DAC_DITHER_RND)},
	{ MP_ROM_QSTR(MP_QSTR_P_DAC_DITHER_PWM), MP_ROM_INT(P_DAC_DITHER_PWM)},

	{ MP_ROM_QSTR(MP_QSTR_P_PULSE), MP_ROM_INT(P_PULSE)},
	{ MP_ROM_QSTR(MP_QSTR_P_TRANSITION), MP_ROM_INT(P_TRANSITION)},
	{ MP_ROM_QSTR(MP_QSTR_P_NCO_FREQ), MP_ROM_INT(P_NCO_FREQ)},
	{ MP_ROM_QSTR(MP_QSTR_P_NCO_DUTY), MP_ROM_INT(P_NCO_DUTY)},
	{ MP_ROM_QSTR(MP_QSTR_P_PWM_TRIANGLE), MP_ROM_INT(P_PWM_TRIANGLE)},
	{ MP_ROM_QSTR(MP_QSTR_P_PWM_SAWTOOTH), MP_ROM_INT(P_PWM_SAWTOOTH)},
	{ MP_ROM_QSTR(MP_QSTR_P_PWM_SMPS), MP_ROM_INT(P_PWM_SMPS)},
	{ MP_ROM_QSTR(MP_QSTR_P_QUADRATURE), MP_ROM_INT(P_QUADRATURE)},
	{ MP_ROM_QSTR(MP_QSTR_P_REG_UP), MP_ROM_INT(P_REG_UP)},
	{ MP_ROM_QSTR(MP_QSTR_P_REG_UP_DOWN), MP_ROM_INT(P_REG_UP_DOWN)},
	{ MP_ROM_QSTR(MP_QSTR_P_COUNT_RISES), MP_ROM_INT(P_COUNT_RISES)},
	{ MP_ROM_QSTR(MP_QSTR_P_COUNT_HIGHS), MP_ROM_INT(P_COUNT_HIGHS)},

	{ MP_ROM_QSTR(MP_QSTR_P_STATE_TICKS), MP_ROM_INT(P_STATE_TICKS)},
	{ MP_ROM_QSTR(MP_QSTR_P_HIGH_TICKS), MP_ROM_INT(P_HIGH_TICKS)},
	{ MP_ROM_QSTR(MP_QSTR_P_EVENTS_TICKS), MP_ROM_INT(P_EVENTS_TICKS)},
	{ MP_ROM_QSTR(MP_QSTR_P_PERIODS_TICKS), MP_ROM_INT(P_PERIODS_TICKS)},
	{ MP_ROM_QSTR(MP_QSTR_P_PERIODS_HIGHS), MP_ROM_INT(P_PERIODS_HIGHS)},
	{ MP_ROM_QSTR(MP_QSTR_P_COUNTER_TICKS), MP_ROM_INT(P_COUNTER_TICKS)},
	{ MP_ROM_QSTR(MP_QSTR_P_COUNTER_HIGHS), MP_ROM_INT(P_COUNTER_HIGHS)},
	{ MP_ROM_QSTR(MP_QSTR_P_COUNTER_PERIODS), MP_ROM_INT(P_COUNTER_PERIODS)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC), MP_ROM_INT(P_ADC)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_EXT), MP_ROM_INT(P_ADC_EXT)},
	{ MP_ROM_QSTR(MP_QSTR_P_ADC_SCOPE), MP_ROM_INT(P_ADC_SCOPE)},
	{ MP_ROM_QSTR(MP_QSTR_P_USB_PAIR), MP_ROM_INT(P_USB_PAIR)},
	{ MP_ROM_QSTR(MP_QSTR_P_SYNC_TX), MP_ROM_INT(P_SYNC_TX)},
	{ MP_ROM_QSTR(MP_QSTR_P_SYNC_RX), MP_ROM_INT(P_SYNC_RX)},
	{ MP_ROM_QSTR(MP_QSTR_P_ASYNC_TX), MP_ROM_INT(P_ASYNC_TX)},
	{ MP_ROM_QSTR(MP_QSTR_P_ASYNC_RX), MP_ROM_INT(P_ASYNC_RX)},










//#if MICROPY_HW_ENABLE_SDCARD
//    { MP_ROM_QSTR(MP_QSTR_SDCard), MP_ROM_PTR(&pyc_sdcard_type) },
//#endif
    
};

STATIC MP_DEFINE_CONST_DICT(p2_module_globals, p2_module_globals_table);

const mp_obj_module_t p2_module = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&p2_module_globals,
};

