From 1a40c835bc7e0f5304bb1c94dfb03c661221ff14 Mon Sep 17 00:00:00 2001
From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca>
Date: Wed, 22 Nov 2017 14:16:23 -0500
Subject: [PATCH] Add manual mode.

---
 src/experiment.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 73 insertions(+), 3 deletions(-)

diff --git a/src/experiment.c b/src/experiment.c
index d5d9330..a240e5b 100644
--- a/src/experiment.c
+++ b/src/experiment.c
@@ -51,6 +51,7 @@ static void portd_int0_ca(void);
 static uint8_t _swv_singledir(uint16_t dacindex, uint16_t dacindex_stop, uint16_t dacindex_pulse_height, uint16_t dacindex_step, uint8_t direction);
 static uint8_t _dpv_singledir(uint16_t dacindex, uint16_t dacindex_stop, uint16_t dacindex_pulse_height, uint16_t dacindex_step, uint8_t direction);
 static void pmt_idle(void);
+static void manual_experiment(void);
 
 //interrupt callback setup
 typedef void (*port_callback_t) (void);
@@ -170,6 +171,10 @@ void experiment_handler(char command[]){
             pmt_idle();
             break;
             
+        case 'N':  // Manual mode
+            manual_experiment();
+            break;
+            
         #if BOARD_VER_MAJOR == 1 && BOARD_VER_MINOR >= 2
         case 'P': //potentiometry - time, OCP/poteniometry
             sscanf(command+1, "%u%hhu",&pct1, &o1);
@@ -977,21 +982,86 @@ void ca_experiment(uint16_t steps, uint16_t step_dac[], uint16_t step_seconds[])
 		return;
 }
 
+static void manual_experiment(void){
+    uint16_t volt_dac = 0;
+    
+    while (RTC.STATUS & RTC_SYNCBUSY_bm);
+    RTC.PER = 999;
+    while (RTC.STATUS & RTC_SYNCBUSY_bm);
+    RTC.CTRL = RTC_PRESCALER_DIV1_gc; //1ms tick
+    RTC.CNT = 0;
+    
+    EVSYS.CH0MUX = EVSYS_CHMUX_RTC_OVF_gc; //EV CH0 -- RTC overflow 1s
+    
+    portd_int0_callback = portd_int0_ca; //ADC interrupt
+    
+    tc_enable(&EXP_TC0_0);
+    
+    ads1255_rdatac();
+    ads1255_wakeup();
+    
+    tc_write_period(&EXP_TC0_0,0xffff);
+    tc_write_clock_source(&EXP_TC0_0, TC_CLKSEL_EVCH0_gc);
+    tc_set_direction(&EXP_TC0_0, TC_UP);
+    
+    EXP_TC0_0.CNT = 0;
+    
+    while (1){
+        if (udi_cdc_is_rx_ready()){
+            PORTD.INTCTRL = PORT_INT0LVL_OFF_gc;
+            uint8_t input = getchar();
+            switch (input) {
+                case 'a':
+                    ca_cca_callback();
+                    printf("##ABORT\n");
+                    goto aborting;
+                    break;
+                case 'g':  // Change gain
+                    scanf("%u",&g_gain);
+                    pot_set_gain(); //uses global g_gain, so no params
+                    printf("G %u\n", g_gain);
+                    break;
+                case 'v':  // Change voltage
+                    scanf("%u", &volt_dac);
+                    max5443_set_voltage1(volt_dac);
+                    printf("V %u\n", volt_dac);
+                    printf("S\n"); //signal end of scan
+                    break;
+                default:
+                    break;
+            }
+            PORTD.INTCTRL = PORT_INT0LVL_LO_gc;
+        }
+    }
+    
+aborting:
+    tc_set_cca_interrupt_level(&EXP_TC0_0, TC_INT_LVL_OFF);
+    tc_write_clock_source(&EXP_TC0_0, TC_CLKSEL_OFF_gc);
+    tc_disable(&EXP_TC0_0);
+    volt_exp_stop();
+    ads1255_standby();
+    printf("D\n"); //signal end of experiment
+    return;
+}
+
 static void portd_int0_ca(void){
 	struct
 	{
+        uint8_t com[2];
 		uint16_t time1;
 		uint16_t time2;
 		int32_t current;
 	} data;
 	
+    data.com[0] = 'B';
+    data.com[1] = '\n';
 	data.time1 = EXP_TC0_0.CNT;
 	data.time2 = RTC.CNT;
 	data.current = ads1255_read_fast24();
 
-	printf("B\n");
-	udi_cdc_write_buf(&data, 8);
-	printf("\n");
+//    printf("B\n");
+	udi_cdc_write_buf(&data, 10);
+//    printf("\n");
 }
 
 static void ca_cca_callback(void){
-- 
GitLab