/*
* ------------------------------
* ECT-R4
* DIO for Emission carve traser R4
* version 1.01.00
* DAte 2024.01.07.00
* by HKsoft@puma
* -----------------------------
*
* -Command-
* >[] 何れかを選択
* >{} 省略可能
* > p=ポート番号 tm=時間(msec) n=数値
*
* IN? p //ボート入力(bit)
* OUT p,[0|1] //ボート出力(bit)
* PULSE p,tm //HIGH→LOW→tm→HIGH or LOW→HIGH→tm→LOW
* DAC:VAL n //DACをセット(12bit)
* DAC:CLS n //CLS:クリア
* ADC:VAL? //ADCの読み込み(現在のCH)
* ADC:VAL? [0|1] //ADCの読み込み(CH指定)
* ADC:AVE? n //ADC Ave n=個数(現在のCH)
* ADC:AVE? [0|1] n //ADC Ave n=個数(CH指定)
* ADC:ADD [0|1] //ADC Set CH(Address)
* MODE [V|I|ST|DM] //MODE
* HV:[PWR|OUT|LF] [ON|OFF] //
* FL [ON|FF] //フィラメントのON/OFF
* HVERR? //HV Error?
* S650? //Set 650uA?
* *IDN?
* *RST
* *DEBUG [0|1]
* -------------------------------------------------------
* 入出力
* serial : 0, 1
* OUT : 38, 40~53,14~18,6~10
* IN-pullup : 22~37, 39, 2,3,4
* IN : 上記以外のすべて(default)
*/
//#define DEB 0 //1=debug mode
#define pMVI 6 //Mode V/*I
#define pMSD 7 //Mode ST/*DM
#define pFL 14 //*Filament ON
#define pHVF 15 //*HV LoopFilter
#define pHVP 16 //*HV Poer ON
#define pHVO 17 //*HV Output
#define pHVE 2 //*HV Error
#define pS6 3 //*Set 650uA
#define pGA 18 //*GAIN
#define pCK 4 //Clock 10Hz
#define pDAC 38 //DAC Clear
#define pDAS 40 //DAC STB
#define pADB 39 //ADC Busy
#define pADA 41 //ADC Address
#define pPL 8 //Power LED
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
typedef struct {
int ix;
String s[10];
} spd;
spd dis;
const byte rstbit[7]={pADA,pDAS,pDAC,pHVF,pFL,pHVP,pHVO};
int prw=0;
int DEB=0;
unsigned long tm;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
//300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
void setup() {
pinMode(pPL, OUTPUT); //LED
DDRA = B00000000; //ADC
PORTA = B11111111;
DDRC = B00000000; //ADC
PORTC = B11111111;
pinMode(pADA, OUTPUT); //ADC Address
pinMode(pADB, INPUT_PULLUP); //ADC Busy
pinMode(pDAC, OUTPUT); //DAC Clear
pinMode(pDAS, OUTPUT); //DAC STB
digitalWrite(pDAS,HIGH);
DDRL = B11111111; //DAC
PORTL = B00000000;
DDRB = B11111111; //DAC
PORTB = B00000000;
pinMode(pHVE, INPUT_PULLUP);
pinMode(pS6, INPUT_PULLUP);
pinMode(pCK, INPUT_PULLUP);
for(int i=14;i<=18;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);
pinMode(i-8,OUTPUT);
}
Serial.begin(115200);
Serial.println("OK");
tm=millis();
}
void loop() {
if(prw==0){
if(millis()-tm >=250){
digitalWrite(pPL,!digitalRead(pPL));
tm=millis();
}
}
delay(10);
}
void clsBuff(){
dis.ix=0;
}
void split(String src, spd *d) {
char *p, *q;
d->ix = 0;
p = q = src.c_str();
while (*q) {
q = strtok(p, " :;,\0\r\n");
p = NULL;
if (q != NULL) {
//Serial.println(q);
d->s[d->ix] = q; //String(q);
//Serial.println(d[n]);
d->ix++;
}
}
}
//シリアル(USB)通信の処理------------------------------------------------
// シリアル入力処理
void serialEvent() {
String cmm = "";
if (Serial.available() > 0) {
// シリアルポートより";"までの文字読み込む
cmm = Serial.readStringUntil('\n');
//while(Serial.available())Serial.read();
if(prw==0){
prw=1;
}
SerialOpe2(cmm);
digitalWrite(pPL,HIGH);
}
}
// シリアル入力処理2
// 最初の文字と以降の数値を得て処理を振り分ける
void SerialOpe2(String strCOM) {
int i;
strCOM.toUpperCase();
SPt("INPUT = " + strCOM,1);
split(strCOM,&dis);
if(dis.s[0]=="IN?")bitIn();
else if(dis.s[0]=="OUT")bitOut();
else if(dis.s[0]=="PULSE")pulse();
else if(dis.s[0]=="DAC")dac();
else if(dis.s[0]=="ADC")adc();
else if(dis.s[0]=="MODE")mode();
else if(dis.s[0]=="HV")hv();
else if(dis.s[0]=="FL")fl();
else if(dis.s[0]=="HVERR?")hvErr();
else if(dis.s[0]=="S650?")s650();
else if(dis.s[0]=="*IDN?")idn();
else if(dis.s[0]=="*RST")reset();
else if(dis.s[0]=="*DEBUG")debug();
}
//----------------------------------------------------------
//*IDN?
void idn(){
Serial.println("Adsystem,ECT-R4u-DIO,2023-12-01,1.0.0");
}
//*RST
void reset(){
byte i;
for(i=0;i<7;i++){
digitalWrite(rstbit[i],HIGH);
}
digitalWrite(pDAC,LOW);
PORTL=0;
i=PINB & 0xF0;
PORTB=i;
digitalWrite(pDAS,LOW);
delayMicroseconds(100);
digitalWrite(pDAS,HIGH);
DEB=0;
}
//Debug Mode
void debug() {
int val=0;
val = dis.s[1].toInt();
DEB=val;
SPt("Debug mode: ON",1);
}
//Bit OUT
void bitOut() {
int bitn;
int sw;
bitn = dis.s[1].toInt();
sw = dis.s[2].toInt();
digitalWrite(bitn, sw);
}
//Bit In?
void bitIn() {
int bitn;
int val;
if(dis.ix<2)return;
bitn = dis.s[1].toInt();
val = digitalRead(bitn);
Serial.println(val);
}
//PULSE OUT
void pulse(){
int bitn;
long val;
if(dis.ix<3)return;
if((bitn = dis.s[1].toInt())<2)return;
if((val=dis.s[2].toInt())==0)return;
digitalWrite(bitn,!digitalRead(bitn));
delay(val);
digitalWrite(bitn,!digitalRead(bitn));
}
//DAC
void dac(){
long val;
byte H,L,t;
if(dis.ix<3)return;
val=dis.s[2].toInt();
if(dis.s[1]=="CLS"){
SPt(String(val),1);
digitalWrite(pDAC,val);
}else if(dis.s[1]=="VAL"){
t=PINB & 0xF0;
L=val & 0xFF;
H=(val >>8)& 0x0F;
PORTL=L;
PORTB=H | t;
digitalWrite(pDAS,LOW);
delayMicroseconds(100);
digitalWrite(pDAS,HIGH);
}
}
int getAD(){
int H,L;
SPt("getAD ",0);
unsigned long ts = millis();
while(digitalRead(pADB)==HIGH){
if(millis()-ts >=10)break;
}
H=PINC & 0x0F;
L=PINA & 0xFF;
//SPt(String(H,BIN)+" "+String(L,BIN),1);
return (H << 8) | L;
}
int getAdAve(int n){
int i;
long sum=0;
for(i=0;i<n;i++){
sum += getAD();
delayMicroseconds(1000);
}
return sum/n;
}
void setAdcAddr(String s){
byte ch=0;
if(s=="0")ch=0;
if(s=="1")ch=1;
digitalWrite(pADA,ch);
}
//ADC:VAL?
//ADC:VAL? [0|1]
//ADC:ADD [0|1]
//ADC:AVE? n
//ADC:AVE? [0|1] n
void adc(){
byte ch=0;
int val,n=1;
SPt("(ADC)"+dis.s[1],1);
if(dis.ix<2)return;
if(dis.ix==2 && dis.s[1]=="VAL?"){ //ADC:VAL?
val=getAD();
Serial.println(val);
return;
}else if(dis.ix>=3 && dis.s[1]=="VAL?"){ //ADC:VAL? [0|1]
setAdcAddr(dis.s[2]);
val=getAD();
Serial.println(val);
return;
}else if(dis.ix>=3 && dis.s[1]=="ADD"){ //ADC:ADD [0|1]
setAdcAddr(dis.s[2]);
return;
}else if(dis.ix>=3 && dis.s[1]=="AVE?"){ //ADC:AVE? n /ADC:AVE? [0|1] n
if(dis.ix>=4){
setAdcAddr(dis.s[2]);
n=dis.s[3].toInt();
}else{
n=dis.s[2].toInt();
}
val=getAdAve(n);
Serial.println(val);
}
}
void mode(){
if(dis.ix<2)return;
if(dis.s[1]=="V")digitalWrite(pMVI,HIGH);
else if(dis.s[1]=="I")digitalWrite(pMVI,LOW);
else if(dis.s[1]=="ST")digitalWrite(pMSD,HIGH);
else if(dis.s[1]=="DM")digitalWrite(pMSD,LOW);
}
void hv(){
byte pin,val;
if(dis.ix<3)return;
if(dis.s[1]=="PWR")pin=pHVP;
else if(dis.s[1]=="OUT")pin=pHVO;
else if(dis.s[1]=="LF")pin=pHVF;
else return;
if(dis.s[2]=="ON")val=LOW;
else if(dis.s[2]=="OFF")val=HIGH;
else val=HIGH;
digitalWrite(pin,val);
}
void fl(){
byte val=HIGH;
if(dis.ix<2)return;
if(dis.s[1]=="ON")val=LOW;
else if(dis.s[1]=="IFF")val=HIGH;
digitalWrite(pFL,val);
}
void hvErr(){
int val;
val=digitalRead(pHVE);
Serial.println(val);
}
void s650(){
int val;
val=digitalRead(pS6);
Serial.println(val);
}
// Debug Serial.print処理-------------------------------
void SPt(String TXT , int SW) {
static String PTX = "";
if (DEB == 0) {
return;
}
if (SW == 0) {
//Serial.print(TXT);
PTX += TXT;
} else {
PTX += TXT;
Serial.println(PTX);
PTX = "";
delay(40);
}
}