
#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 "smartpins.h" //RJA for smartpin constants


/// RJA Testing
STATIC mp_obj_t p2_pinl(mp_obj_t pin_in) {
   // _pinl(pin_in);
   int n=mp_obj_get_int(pin_in);
   _pinl(n);
    //printf("pin #%d driven low\r\n",n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinl_obj, p2_pinl);

STATIC mp_obj_t p2_pinh(mp_obj_t pin_in) {
   // _pinl(pin_in);
   int n=mp_obj_get_int(pin_in);
   _pinh(n);
    //printf("pin #%d driven low\r\n",n);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(p2_pinh_obj, p2_pinh);

//STATIC mp_obj_t p2_freemem(void) {
//   gc_collect();
//   printf("%d Bytes Memory available\r\n",gc_mem_free());
//   return mp_const_none;
//}
//STATIC MP_DEFINE_CONST_FUN_OBJ_0(p2_freemem_obj, p2_freemem);

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_pinl), MP_ROM_PTR(&p2_pinl_obj) },
    { MP_ROM_QSTR(MP_QSTR_pinh), MP_ROM_PTR(&p2_pinh_obj) },    
    //{ MP_ROM_QSTR(MP_QSTR_freemem), MP_ROM_PTR(&p2_freemem_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,
};

