Replacement firmware for Dawson Dynamic OB dish positioner

Dependencies:   ConfigFile PCF8574 TextOLED mbed

Fork of mbed_blinky by Mbed

Committer:
m0dts
Date:
Sun Aug 20 21:30:40 2017 +0000
Revision:
14:ce9c322f95f2
Parent:
4:81cea7a352b0
Functional Version with menu 20/8/2017

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan 0:7dec7e9ac085 1 #include "mbed.h"
m0dts 14:ce9c322f95f2 2 #include "PCF8574.h"
m0dts 14:ce9c322f95f2 3 #include <string>
m0dts 14:ce9c322f95f2 4 #include "ConfigFile.h"
m0dts 14:ce9c322f95f2 5
m0dts 14:ce9c322f95f2 6 LocalFileSystem local("local");
m0dts 14:ce9c322f95f2 7 ConfigFile cfg;
m0dts 14:ce9c322f95f2 8
m0dts 14:ce9c322f95f2 9 //Address of PCF8574 Button and LCD interface IC's
m0dts 14:ce9c322f95f2 10 #define PCF8574_BUTTON_ADDR 1 //A0
m0dts 14:ce9c322f95f2 11 #define PCF8574_LCD_ADDR 0
m0dts 14:ce9c322f95f2 12
m0dts 14:ce9c322f95f2 13 DigitalOut led1(LED1);
m0dts 14:ce9c322f95f2 14 DigitalOut led2(LED2);
m0dts 14:ce9c322f95f2 15 DigitalOut led3(LED3);
m0dts 14:ce9c322f95f2 16 DigitalOut led4(LED4);
m0dts 14:ce9c322f95f2 17
m0dts 14:ce9c322f95f2 18
m0dts 14:ce9c322f95f2 19 //controller pins
m0dts 14:ce9c322f95f2 20 DigitalOut Select_AZ (p20);
m0dts 14:ce9c322f95f2 21 DigitalOut Select_EL (p16);
m0dts 14:ce9c322f95f2 22 DigitalOut Direction (p25);
m0dts 14:ce9c322f95f2 23 PwmOut Drive (p26);
m0dts 14:ce9c322f95f2 24 DigitalIn Endstop_AZ (p18);
m0dts 14:ce9c322f95f2 25 DigitalIn Endstop_EL (p15);
m0dts 14:ce9c322f95f2 26 InterruptIn Pulse(p17);
m0dts 14:ce9c322f95f2 27 DigitalOut rfled(p12);
m0dts 14:ce9c322f95f2 28
m0dts 14:ce9c322f95f2 29 //LCD pin connections to PCF8574
m0dts 14:ce9c322f95f2 30 #define rs_pin 0
m0dts 14:ce9c322f95f2 31 #define e_pin 1
m0dts 14:ce9c322f95f2 32 #define d4_pin 2
m0dts 14:ce9c322f95f2 33 #define d5_pin 3
m0dts 14:ce9c322f95f2 34 #define d6_pin 4
m0dts 14:ce9c322f95f2 35 #define d7_pin 5
m0dts 14:ce9c322f95f2 36
m0dts 14:ce9c322f95f2 37 //scaling for pulses per degree
m0dts 14:ce9c322f95f2 38 #define Az_scale = 15.378
m0dts 14:ce9c322f95f2 39 #define El_scale = 5.155
m0dts 14:ce9c322f95f2 40
m0dts 14:ce9c322f95f2 41 PCF8574 pcf_lcd(p9,p10,PCF8574_LCD_ADDR,true);
m0dts 14:ce9c322f95f2 42 PCF8574 pcf_button(p9,p10,PCF8574_BUTTON_ADDR,true);
m0dts 14:ce9c322f95f2 43
m0dts 14:ce9c322f95f2 44 Ticker Refresh_timer;
dan 0:7dec7e9ac085 45
m0dts 14:ce9c322f95f2 46 int _column;
m0dts 14:ce9c322f95f2 47 int _row;
m0dts 14:ce9c322f95f2 48 int Az_Count;
m0dts 14:ce9c322f95f2 49 int El_Count;
m0dts 14:ce9c322f95f2 50 char buffer[20];
m0dts 14:ce9c322f95f2 51 char Last_Direction=0;
m0dts 14:ce9c322f95f2 52 char Up=0,Down=0,Left=0,Right=0,OK=0;
m0dts 14:ce9c322f95f2 53 float Azimuth,Elevation;
m0dts 14:ce9c322f95f2 54 float pwm_freq=0.00005;//30khz
m0dts 14:ce9c322f95f2 55 float pwm_duty=0.5;
m0dts 14:ce9c322f95f2 56 float Az_ref=0,El_ref=0;
m0dts 14:ce9c322f95f2 57 float Az_zero=0;
m0dts 14:ce9c322f95f2 58 float El_zero=0;
m0dts 14:ce9c322f95f2 59 int temp;
m0dts 14:ce9c322f95f2 60 float temp2;
m0dts 14:ce9c322f95f2 61
m0dts 14:ce9c322f95f2 62
m0dts 14:ce9c322f95f2 63 //settings available in menu
m0dts 14:ce9c322f95f2 64 int setting_count=6;
m0dts 14:ce9c322f95f2 65 int setting_val[] = {0,270,0,60,Az_zero,El_zero};
dan 0:7dec7e9ac085 66
m0dts 14:ce9c322f95f2 67 char * const setting_name[] = {
m0dts 14:ce9c322f95f2 68 "Az CCW Limit:",
m0dts 14:ce9c322f95f2 69 "Az CW Limit:",
m0dts 14:ce9c322f95f2 70 "El Low Limit:",
m0dts 14:ce9c322f95f2 71 "El High Limit:",
m0dts 14:ce9c322f95f2 72 "Set Current Az:",
m0dts 14:ce9c322f95f2 73 "Set Current El:",
m0dts 14:ce9c322f95f2 74 };
m0dts 14:ce9c322f95f2 75
m0dts 14:ce9c322f95f2 76
m0dts 14:ce9c322f95f2 77
m0dts 14:ce9c322f95f2 78
m0dts 14:ce9c322f95f2 79 void writeByte(int byte);
m0dts 14:ce9c322f95f2 80 void writeCommand(int command);
m0dts 14:ce9c322f95f2 81 void locate(int column, int row);
m0dts 14:ce9c322f95f2 82 void cls();
m0dts 14:ce9c322f95f2 83 void init();
m0dts 14:ce9c322f95f2 84 void write4bit(int value);
m0dts 14:ce9c322f95f2 85 void character(int column, int row, int c);
m0dts 14:ce9c322f95f2 86 int address(int column, int row);
m0dts 14:ce9c322f95f2 87 void writeData(int data);
m0dts 14:ce9c322f95f2 88 void writestring(int column, int row, string c);
m0dts 14:ce9c322f95f2 89 void count_rise();
m0dts 14:ce9c322f95f2 90 void count_fall();
m0dts 14:ce9c322f95f2 91 void Refresh_oled(bool anytime);
m0dts 14:ce9c322f95f2 92 void menu(void);
m0dts 14:ce9c322f95f2 93 void WriteSettings(void);
m0dts 14:ce9c322f95f2 94 void ReadSettings(void);
m0dts 14:ce9c322f95f2 95
m0dts 14:ce9c322f95f2 96
m0dts 14:ce9c322f95f2 97
m0dts 14:ce9c322f95f2 98 //start of main program
dan 0:7dec7e9ac085 99 int main() {
m0dts 14:ce9c322f95f2 100 uint8_t val;
m0dts 14:ce9c322f95f2 101
m0dts 14:ce9c322f95f2 102 El_Count=0;
m0dts 14:ce9c322f95f2 103 Az_Count=0;
m0dts 14:ce9c322f95f2 104
m0dts 14:ce9c322f95f2 105 Endstop_AZ.mode(PullUp);
m0dts 14:ce9c322f95f2 106 Pulse.mode(PullUp);
m0dts 14:ce9c322f95f2 107
m0dts 14:ce9c322f95f2 108 rfled=0;
m0dts 14:ce9c322f95f2 109
m0dts 14:ce9c322f95f2 110 pcf_button=0xff;
m0dts 14:ce9c322f95f2 111
m0dts 14:ce9c322f95f2 112
m0dts 14:ce9c322f95f2 113 if(cfg.read("/local/settings.cfg")){
m0dts 14:ce9c322f95f2 114 char cfgval[10];
m0dts 14:ce9c322f95f2 115 for(int i=0;i<setting_count;i++){
m0dts 14:ce9c322f95f2 116 cfg.getValue(setting_name[i], &cfgval[0], sizeof(setting_val));
m0dts 14:ce9c322f95f2 117 setting_val[i]=atoi(cfgval);
m0dts 14:ce9c322f95f2 118 }
m0dts 14:ce9c322f95f2 119 }
m0dts 14:ce9c322f95f2 120
m0dts 14:ce9c322f95f2 121 init();
m0dts 14:ce9c322f95f2 122 sprintf(buffer,"Az/El Controller");
m0dts 14:ce9c322f95f2 123 writestring(2,0,buffer);
m0dts 14:ce9c322f95f2 124 sprintf(buffer,"M0DTS 2017");
m0dts 14:ce9c322f95f2 125 writestring(4,1,buffer);
m0dts 14:ce9c322f95f2 126 sprintf(buffer,"rob@m0dts.co.uk");
m0dts 14:ce9c322f95f2 127 writestring(2,2,buffer);
m0dts 14:ce9c322f95f2 128 wait(2);
m0dts 14:ce9c322f95f2 129 cls();
m0dts 14:ce9c322f95f2 130 sprintf(buffer,"Az/El Controller");
m0dts 14:ce9c322f95f2 131 writestring(0,0,buffer);
m0dts 14:ce9c322f95f2 132
m0dts 14:ce9c322f95f2 133
m0dts 14:ce9c322f95f2 134 Refresh_oled(true);
m0dts 14:ce9c322f95f2 135
m0dts 14:ce9c322f95f2 136 Pulse.rise(&count_rise);
m0dts 14:ce9c322f95f2 137 Pulse.fall(&count_fall);
m0dts 14:ce9c322f95f2 138 Drive.period(pwm_freq);
m0dts 14:ce9c322f95f2 139
m0dts 14:ce9c322f95f2 140
m0dts 14:ce9c322f95f2 141
m0dts 14:ce9c322f95f2 142
dan 0:7dec7e9ac085 143 while(1) {
m0dts 14:ce9c322f95f2 144
m0dts 14:ce9c322f95f2 145 val = pcf_button.read();
m0dts 14:ce9c322f95f2 146 Up = ~(val>>3)&0x01;
m0dts 14:ce9c322f95f2 147 Left = ~(val>>4)&0x01;
m0dts 14:ce9c322f95f2 148 Right = ~(val>>5)&0x01;
m0dts 14:ce9c322f95f2 149 Down = ~(val>>6)&0x01;
m0dts 14:ce9c322f95f2 150 OK = ~(val>>7)&0x01;
m0dts 14:ce9c322f95f2 151
m0dts 14:ce9c322f95f2 152 if(OK){
m0dts 14:ce9c322f95f2 153 //menu
m0dts 14:ce9c322f95f2 154 menu();
m0dts 14:ce9c322f95f2 155 wait_ms(200);
m0dts 14:ce9c322f95f2 156 cls();
m0dts 14:ce9c322f95f2 157 sprintf(buffer,"Az/El Controller");
m0dts 14:ce9c322f95f2 158 writestring(0,0,buffer);
m0dts 14:ce9c322f95f2 159 Refresh_oled(true);
m0dts 14:ce9c322f95f2 160 }
m0dts 14:ce9c322f95f2 161
m0dts 14:ce9c322f95f2 162
m0dts 14:ce9c322f95f2 163 if(Up){
m0dts 14:ce9c322f95f2 164 Last_Direction=0;
m0dts 14:ce9c322f95f2 165 Select_EL=1;
m0dts 14:ce9c322f95f2 166 Select_AZ=0;
m0dts 14:ce9c322f95f2 167 Direction=1;
m0dts 14:ce9c322f95f2 168 temp2 = 0.1;
m0dts 14:ce9c322f95f2 169 Drive.write(temp2);
m0dts 14:ce9c322f95f2 170 while(Up & Elevation<=setting_val[3]){
m0dts 14:ce9c322f95f2 171 if(temp2<pwm_duty){
m0dts 14:ce9c322f95f2 172 temp2+=0.01;
m0dts 14:ce9c322f95f2 173 Drive.write(temp2);
m0dts 14:ce9c322f95f2 174 }
m0dts 14:ce9c322f95f2 175 Up = ~(pcf_button.read()>>3)&0x01;
m0dts 14:ce9c322f95f2 176 Refresh_oled(false);
m0dts 14:ce9c322f95f2 177 }
m0dts 14:ce9c322f95f2 178 Drive.write(0.0f);
m0dts 14:ce9c322f95f2 179 wait_ms(100);
m0dts 14:ce9c322f95f2 180 Up=0;
m0dts 14:ce9c322f95f2 181 Refresh_oled(true);
m0dts 14:ce9c322f95f2 182 }
m0dts 14:ce9c322f95f2 183
m0dts 14:ce9c322f95f2 184 if(Down){
m0dts 14:ce9c322f95f2 185 if(!Endstop_EL){
m0dts 14:ce9c322f95f2 186 Last_Direction=1;
m0dts 14:ce9c322f95f2 187 Select_EL=1;
m0dts 14:ce9c322f95f2 188 Select_AZ=0;
m0dts 14:ce9c322f95f2 189 Direction=0;
m0dts 14:ce9c322f95f2 190 temp2 = 0.1;
m0dts 14:ce9c322f95f2 191 Drive.write(temp2);
m0dts 14:ce9c322f95f2 192 while(Down & !Endstop_EL & Elevation>=setting_val[2]){
m0dts 14:ce9c322f95f2 193 if(temp2<pwm_duty){
m0dts 14:ce9c322f95f2 194 temp2+=0.01;
m0dts 14:ce9c322f95f2 195 Drive.write(temp2);
m0dts 14:ce9c322f95f2 196 }
m0dts 14:ce9c322f95f2 197 Down = ~(pcf_button.read()>>6)&0x01;
m0dts 14:ce9c322f95f2 198 Refresh_oled(false);
m0dts 14:ce9c322f95f2 199 }
m0dts 14:ce9c322f95f2 200 Drive.write(0.0f);
m0dts 14:ce9c322f95f2 201 wait_ms(100);
m0dts 14:ce9c322f95f2 202 Down=0;
m0dts 14:ce9c322f95f2 203 Refresh_oled(true);
m0dts 14:ce9c322f95f2 204 }
m0dts 14:ce9c322f95f2 205 }
m0dts 14:ce9c322f95f2 206
m0dts 14:ce9c322f95f2 207 if(Left){
m0dts 14:ce9c322f95f2 208 if(!Endstop_AZ){
m0dts 14:ce9c322f95f2 209 Last_Direction=2;
m0dts 14:ce9c322f95f2 210 Select_EL=0;
m0dts 14:ce9c322f95f2 211 Select_AZ=1;
m0dts 14:ce9c322f95f2 212 Direction=1;
m0dts 14:ce9c322f95f2 213 temp2 = 0.1;
m0dts 14:ce9c322f95f2 214 Drive.write(temp2);
m0dts 14:ce9c322f95f2 215 while(Left & !Endstop_AZ & Azimuth>=setting_val[0]){
m0dts 14:ce9c322f95f2 216 if(temp2<pwm_duty){
m0dts 14:ce9c322f95f2 217 temp2+=0.01;
m0dts 14:ce9c322f95f2 218 Drive.write(temp2);
m0dts 14:ce9c322f95f2 219 }
m0dts 14:ce9c322f95f2 220 Left = ~(pcf_button.read()>>4)&0x01;
m0dts 14:ce9c322f95f2 221 Refresh_oled(false);
m0dts 14:ce9c322f95f2 222 }
m0dts 14:ce9c322f95f2 223 Drive.write(0.0f);
m0dts 14:ce9c322f95f2 224 wait_ms(100);
m0dts 14:ce9c322f95f2 225 Left=0;
m0dts 14:ce9c322f95f2 226 Refresh_oled(true);
m0dts 14:ce9c322f95f2 227 }
m0dts 14:ce9c322f95f2 228 }
m0dts 14:ce9c322f95f2 229
m0dts 14:ce9c322f95f2 230 if(Right){
m0dts 14:ce9c322f95f2 231 Last_Direction=3;
m0dts 14:ce9c322f95f2 232 Select_EL=0;
m0dts 14:ce9c322f95f2 233 Select_AZ=1;
m0dts 14:ce9c322f95f2 234 Direction=0;
m0dts 14:ce9c322f95f2 235 temp = Az_Count;
m0dts 14:ce9c322f95f2 236 temp2 = 0.1;
m0dts 14:ce9c322f95f2 237 Drive.write(temp2);
m0dts 14:ce9c322f95f2 238 while(Right & Azimuth<=setting_val[1]){
m0dts 14:ce9c322f95f2 239 if(temp2<pwm_duty){
m0dts 14:ce9c322f95f2 240 temp2+=0.01;
m0dts 14:ce9c322f95f2 241 Drive.write(temp2);
m0dts 14:ce9c322f95f2 242 }
m0dts 14:ce9c322f95f2 243 Right = ~(pcf_button.read()>>5)&0x01;
m0dts 14:ce9c322f95f2 244 Refresh_oled(false);
m0dts 14:ce9c322f95f2 245 }
m0dts 14:ce9c322f95f2 246 Drive.write(0.0f);
m0dts 14:ce9c322f95f2 247 wait_ms(100);
m0dts 14:ce9c322f95f2 248 Right=0;
m0dts 14:ce9c322f95f2 249 Refresh_oled(true);
m0dts 14:ce9c322f95f2 250 }
stevep 4:81cea7a352b0 251 }
dan 0:7dec7e9ac085 252 }
m0dts 14:ce9c322f95f2 253
m0dts 14:ce9c322f95f2 254 void menu(void){
m0dts 14:ce9c322f95f2 255
m0dts 14:ce9c322f95f2 256 //grab current az/el
m0dts 14:ce9c322f95f2 257
m0dts 14:ce9c322f95f2 258 setting_val[4]=(int)Azimuth;
m0dts 14:ce9c322f95f2 259 setting_val[5]=(int)Elevation;
m0dts 14:ce9c322f95f2 260
m0dts 14:ce9c322f95f2 261 int pos=0;
m0dts 14:ce9c322f95f2 262 cls();
m0dts 14:ce9c322f95f2 263 sprintf(buffer,"Menu");
m0dts 14:ce9c322f95f2 264 sprintf(buffer + strlen(buffer)," %i:",pos+1);
m0dts 14:ce9c322f95f2 265 writestring(0,0,buffer);
m0dts 14:ce9c322f95f2 266 sprintf(buffer,setting_name[pos]);
m0dts 14:ce9c322f95f2 267 writestring(0,1,buffer);
m0dts 14:ce9c322f95f2 268 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 269 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 270 sprintf(buffer,"%i",setting_val[pos]);
m0dts 14:ce9c322f95f2 271 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 272 wait_ms(200);
m0dts 14:ce9c322f95f2 273
m0dts 14:ce9c322f95f2 274 int val;
m0dts 14:ce9c322f95f2 275 while(1){
m0dts 14:ce9c322f95f2 276 val = pcf_button.read();
m0dts 14:ce9c322f95f2 277 Up = ~(val>>3)&0x01;
m0dts 14:ce9c322f95f2 278 Left = ~(val>>4)&0x01;
m0dts 14:ce9c322f95f2 279 Right = ~(val>>5)&0x01;
m0dts 14:ce9c322f95f2 280 Down = ~(val>>6)&0x01;
m0dts 14:ce9c322f95f2 281 OK = ~(val>>7)&0x01;
m0dts 14:ce9c322f95f2 282
m0dts 14:ce9c322f95f2 283 if(OK){
m0dts 14:ce9c322f95f2 284 break;
m0dts 14:ce9c322f95f2 285 }
m0dts 14:ce9c322f95f2 286
m0dts 14:ce9c322f95f2 287 if(Down){
m0dts 14:ce9c322f95f2 288 cls();
m0dts 14:ce9c322f95f2 289 pos++;
m0dts 14:ce9c322f95f2 290 if (pos==setting_count){
m0dts 14:ce9c322f95f2 291 pos=setting_count-1;
m0dts 14:ce9c322f95f2 292 }
m0dts 14:ce9c322f95f2 293 sprintf(buffer,"Menu");
m0dts 14:ce9c322f95f2 294 sprintf(buffer + strlen(buffer)," %i:",pos+1);
m0dts 14:ce9c322f95f2 295 writestring(0,0,buffer);
m0dts 14:ce9c322f95f2 296
m0dts 14:ce9c322f95f2 297 sprintf(buffer,setting_name[pos]);
m0dts 14:ce9c322f95f2 298 writestring(0,1,buffer);
m0dts 14:ce9c322f95f2 299 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 300 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 301 sprintf(buffer,"%i",setting_val[pos]);
m0dts 14:ce9c322f95f2 302 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 303
m0dts 14:ce9c322f95f2 304 if(pos==setting_count-1){
m0dts 14:ce9c322f95f2 305 sprintf(buffer,"OK=Save");
m0dts 14:ce9c322f95f2 306 writestring(13,3,buffer);
m0dts 14:ce9c322f95f2 307 }
m0dts 14:ce9c322f95f2 308 wait_ms(200);
m0dts 14:ce9c322f95f2 309 }
m0dts 14:ce9c322f95f2 310
m0dts 14:ce9c322f95f2 311
m0dts 14:ce9c322f95f2 312 if(Up){
m0dts 14:ce9c322f95f2 313 pos--;
m0dts 14:ce9c322f95f2 314 if (pos<0){pos=0;}
m0dts 14:ce9c322f95f2 315 cls();
m0dts 14:ce9c322f95f2 316 sprintf(buffer,"Menu");
m0dts 14:ce9c322f95f2 317 sprintf(buffer + strlen(buffer)," %i:",pos+1);
m0dts 14:ce9c322f95f2 318 writestring(0,0,buffer);
m0dts 14:ce9c322f95f2 319 sprintf(buffer,setting_name[pos]);
m0dts 14:ce9c322f95f2 320 writestring(0,1,buffer);
m0dts 14:ce9c322f95f2 321 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 322 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 323 sprintf(buffer,"%i",setting_val[pos]);
m0dts 14:ce9c322f95f2 324 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 325 wait_ms(200);
m0dts 14:ce9c322f95f2 326 }
m0dts 14:ce9c322f95f2 327
m0dts 14:ce9c322f95f2 328
m0dts 14:ce9c322f95f2 329 if(Left){
m0dts 14:ce9c322f95f2 330 switch (pos) {
m0dts 14:ce9c322f95f2 331 case 0:
m0dts 14:ce9c322f95f2 332 if(setting_val[pos]>0){
m0dts 14:ce9c322f95f2 333 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 334 }
m0dts 14:ce9c322f95f2 335 break;
m0dts 14:ce9c322f95f2 336 case 1:
m0dts 14:ce9c322f95f2 337 if(setting_val[pos]>setting_val[0]){
m0dts 14:ce9c322f95f2 338 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 339 }
m0dts 14:ce9c322f95f2 340 break;
m0dts 14:ce9c322f95f2 341 case 2:
m0dts 14:ce9c322f95f2 342 if(setting_val[pos]>0){
m0dts 14:ce9c322f95f2 343 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 344 }
m0dts 14:ce9c322f95f2 345 break;
m0dts 14:ce9c322f95f2 346 case 3:
m0dts 14:ce9c322f95f2 347 if(setting_val[pos]>setting_val[2]){
m0dts 14:ce9c322f95f2 348 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 349 }
m0dts 14:ce9c322f95f2 350 break;
m0dts 14:ce9c322f95f2 351 case 4:
m0dts 14:ce9c322f95f2 352 if(setting_val[pos]>0){
m0dts 14:ce9c322f95f2 353 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 354 }
m0dts 14:ce9c322f95f2 355 break;
m0dts 14:ce9c322f95f2 356 case 5:
m0dts 14:ce9c322f95f2 357 if(setting_val[pos]>0){
m0dts 14:ce9c322f95f2 358 setting_val[pos]-=1;
m0dts 14:ce9c322f95f2 359 }
m0dts 14:ce9c322f95f2 360 break;
m0dts 14:ce9c322f95f2 361
m0dts 14:ce9c322f95f2 362 }
m0dts 14:ce9c322f95f2 363
m0dts 14:ce9c322f95f2 364 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 365 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 366 sprintf(buffer,"%i",setting_val[pos]);
m0dts 14:ce9c322f95f2 367 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 368 wait_ms(50);
m0dts 14:ce9c322f95f2 369 }
m0dts 14:ce9c322f95f2 370
m0dts 14:ce9c322f95f2 371 if(Right){
m0dts 14:ce9c322f95f2 372 switch (pos) {
m0dts 14:ce9c322f95f2 373 case 0: //360
m0dts 14:ce9c322f95f2 374 if(setting_val[pos]<setting_val[1]){
m0dts 14:ce9c322f95f2 375 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 376 }
m0dts 14:ce9c322f95f2 377 case 1: //360
m0dts 14:ce9c322f95f2 378 if(setting_val[pos]<360){
m0dts 14:ce9c322f95f2 379 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 380 }
m0dts 14:ce9c322f95f2 381 break;
m0dts 14:ce9c322f95f2 382 case 2: //90
m0dts 14:ce9c322f95f2 383 if(setting_val[pos]<setting_val[3]){
m0dts 14:ce9c322f95f2 384 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 385 }
m0dts 14:ce9c322f95f2 386 break;
m0dts 14:ce9c322f95f2 387 case 3: //90
m0dts 14:ce9c322f95f2 388 if(setting_val[pos]<90){
m0dts 14:ce9c322f95f2 389 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 390 }
m0dts 14:ce9c322f95f2 391 break;
m0dts 14:ce9c322f95f2 392 case 4: //360
m0dts 14:ce9c322f95f2 393 if(setting_val[pos]<360){
m0dts 14:ce9c322f95f2 394 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 395 }
m0dts 14:ce9c322f95f2 396 break;
m0dts 14:ce9c322f95f2 397 case 5: //90
m0dts 14:ce9c322f95f2 398 if(setting_val[pos]<90){
m0dts 14:ce9c322f95f2 399 setting_val[pos]+=1;
m0dts 14:ce9c322f95f2 400 }
m0dts 14:ce9c322f95f2 401 break;
m0dts 14:ce9c322f95f2 402 }
m0dts 14:ce9c322f95f2 403
m0dts 14:ce9c322f95f2 404 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 405 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 406 sprintf(buffer,"%i",setting_val[pos]);
m0dts 14:ce9c322f95f2 407 writestring(0,2,buffer);
m0dts 14:ce9c322f95f2 408 wait_ms(50);
m0dts 14:ce9c322f95f2 409 }
m0dts 14:ce9c322f95f2 410 }
m0dts 14:ce9c322f95f2 411 cls();
m0dts 14:ce9c322f95f2 412 sprintf(buffer,"Saving...");
m0dts 14:ce9c322f95f2 413 writestring(2,2,buffer);
m0dts 14:ce9c322f95f2 414
m0dts 14:ce9c322f95f2 415 //store settings here
m0dts 14:ce9c322f95f2 416 for(int i=0;i<setting_count;i++){
m0dts 14:ce9c322f95f2 417 sprintf(buffer,"%i",setting_val[i]);
m0dts 14:ce9c322f95f2 418 cfg.setValue(setting_name[i], buffer) ;
m0dts 14:ce9c322f95f2 419 }
m0dts 14:ce9c322f95f2 420
m0dts 14:ce9c322f95f2 421 cfg.write("/local/settings.cfg", "# Az/El Controller Settings");
m0dts 14:ce9c322f95f2 422 cfg.removeAll();
m0dts 14:ce9c322f95f2 423
m0dts 14:ce9c322f95f2 424 //reset counters.... big problem!
m0dts 14:ce9c322f95f2 425 Az_Count=0;
m0dts 14:ce9c322f95f2 426 El_Count=0;
m0dts 14:ce9c322f95f2 427
m0dts 14:ce9c322f95f2 428 //save delay?!
m0dts 14:ce9c322f95f2 429 wait_ms(300);
m0dts 14:ce9c322f95f2 430 }
m0dts 14:ce9c322f95f2 431
m0dts 14:ce9c322f95f2 432 void count_rise(void){
m0dts 14:ce9c322f95f2 433 if(Up|Right){
m0dts 14:ce9c322f95f2 434 if(Up){
m0dts 14:ce9c322f95f2 435 El_Count++;
m0dts 14:ce9c322f95f2 436 }
m0dts 14:ce9c322f95f2 437 if(Right){
m0dts 14:ce9c322f95f2 438 Az_Count++;
m0dts 14:ce9c322f95f2 439 }
m0dts 14:ce9c322f95f2 440 //catch pulses after button released
m0dts 14:ce9c322f95f2 441 }else{
m0dts 14:ce9c322f95f2 442 if(Last_Direction==0)//up
m0dts 14:ce9c322f95f2 443 El_Count++;
m0dts 14:ce9c322f95f2 444 if(Last_Direction==3)//right
m0dts 14:ce9c322f95f2 445 Az_Count++;
m0dts 14:ce9c322f95f2 446 }
m0dts 14:ce9c322f95f2 447 }
m0dts 14:ce9c322f95f2 448
m0dts 14:ce9c322f95f2 449 void count_fall(void){
m0dts 14:ce9c322f95f2 450 if(Down|Left){
m0dts 14:ce9c322f95f2 451 if(Down){
m0dts 14:ce9c322f95f2 452 El_Count--;
m0dts 14:ce9c322f95f2 453 }
m0dts 14:ce9c322f95f2 454 if(Left){
m0dts 14:ce9c322f95f2 455 Az_Count--;
m0dts 14:ce9c322f95f2 456 }
m0dts 14:ce9c322f95f2 457 //catch pulses after button released
m0dts 14:ce9c322f95f2 458 }else{
m0dts 14:ce9c322f95f2 459 if(Last_Direction==1)//down
m0dts 14:ce9c322f95f2 460 El_Count--;
m0dts 14:ce9c322f95f2 461 if(Last_Direction==2)//left
m0dts 14:ce9c322f95f2 462 Az_Count--;
m0dts 14:ce9c322f95f2 463 }
m0dts 14:ce9c322f95f2 464 }
m0dts 14:ce9c322f95f2 465
m0dts 14:ce9c322f95f2 466
m0dts 14:ce9c322f95f2 467 void Refresh_oled(bool anytime){
m0dts 14:ce9c322f95f2 468
m0dts 14:ce9c322f95f2 469 Elevation = ((float)El_Count/15.378)+setting_val[5];
m0dts 14:ce9c322f95f2 470 Azimuth = ((float)Az_Count/5.155)+setting_val[4];
m0dts 14:ce9c322f95f2 471
m0dts 14:ce9c322f95f2 472 if(Up){
m0dts 14:ce9c322f95f2 473 sprintf(buffer,"El:% 05.1f",Elevation);
m0dts 14:ce9c322f95f2 474 writestring(11,3,buffer);
m0dts 14:ce9c322f95f2 475 buffer[0]=85;//'U'
m0dts 14:ce9c322f95f2 476 buffer[1]=0;
m0dts 14:ce9c322f95f2 477 writestring(19,3,buffer);
m0dts 14:ce9c322f95f2 478 }
m0dts 14:ce9c322f95f2 479 if(Down){
m0dts 14:ce9c322f95f2 480 sprintf(buffer,"El:% 05.1f",Elevation);
m0dts 14:ce9c322f95f2 481 writestring(11,3,buffer);
m0dts 14:ce9c322f95f2 482 buffer[0]=68;//'D'
m0dts 14:ce9c322f95f2 483 buffer[1]=0;
m0dts 14:ce9c322f95f2 484 writestring(19,3,buffer);
m0dts 14:ce9c322f95f2 485 }
m0dts 14:ce9c322f95f2 486 if(Left){
m0dts 14:ce9c322f95f2 487 sprintf(buffer,"Az:% 06.1f",Azimuth);
m0dts 14:ce9c322f95f2 488 writestring(0,3,buffer);
m0dts 14:ce9c322f95f2 489 buffer[0]=127;//arrow left
m0dts 14:ce9c322f95f2 490 buffer[1]=0;
m0dts 14:ce9c322f95f2 491 writestring(9,3,buffer);
m0dts 14:ce9c322f95f2 492 }
m0dts 14:ce9c322f95f2 493 if(Right){
m0dts 14:ce9c322f95f2 494 sprintf(buffer,"Az:% 06.1f",Azimuth);
m0dts 14:ce9c322f95f2 495 writestring(0,3,buffer);
m0dts 14:ce9c322f95f2 496 buffer[0]=126;//arrow right
m0dts 14:ce9c322f95f2 497 buffer[1]=0;
m0dts 14:ce9c322f95f2 498 writestring(9,3,buffer);
m0dts 14:ce9c322f95f2 499 }
m0dts 14:ce9c322f95f2 500
m0dts 14:ce9c322f95f2 501 if(!(Up|Down|Left|Right)){
m0dts 14:ce9c322f95f2 502 sprintf(buffer," ");
m0dts 14:ce9c322f95f2 503 writestring(9,3,buffer);
m0dts 14:ce9c322f95f2 504 writestring(19,3,buffer);
m0dts 14:ce9c322f95f2 505 if(anytime){
m0dts 14:ce9c322f95f2 506 sprintf(buffer,"Az:% 06.1f",Azimuth);
m0dts 14:ce9c322f95f2 507 writestring(0,3,buffer);
m0dts 14:ce9c322f95f2 508 sprintf(buffer,"El:% 05.1f",Elevation);
m0dts 14:ce9c322f95f2 509 writestring(11,3,buffer);
m0dts 14:ce9c322f95f2 510 }
m0dts 14:ce9c322f95f2 511
m0dts 14:ce9c322f95f2 512 if(Endstop_AZ|Endstop_EL){
m0dts 14:ce9c322f95f2 513 if(Endstop_AZ){
m0dts 14:ce9c322f95f2 514 sprintf(buffer,"L");
m0dts 14:ce9c322f95f2 515 writestring(9,3,buffer);
m0dts 14:ce9c322f95f2 516 }
m0dts 14:ce9c322f95f2 517
m0dts 14:ce9c322f95f2 518 if(Endstop_EL){
m0dts 14:ce9c322f95f2 519 sprintf(buffer,"L");
m0dts 14:ce9c322f95f2 520 writestring(19,3,buffer);
m0dts 14:ce9c322f95f2 521 }
m0dts 14:ce9c322f95f2 522 }
m0dts 14:ce9c322f95f2 523 }
m0dts 14:ce9c322f95f2 524
m0dts 14:ce9c322f95f2 525
m0dts 14:ce9c322f95f2 526
m0dts 14:ce9c322f95f2 527 }
m0dts 14:ce9c322f95f2 528
m0dts 14:ce9c322f95f2 529
m0dts 14:ce9c322f95f2 530 //LCD routines ***********************************************************************************************
m0dts 14:ce9c322f95f2 531
m0dts 14:ce9c322f95f2 532 void writeCommand(int command) {
m0dts 14:ce9c322f95f2 533 pcf_lcd.write(rs_pin,0x00);
m0dts 14:ce9c322f95f2 534 writeByte(command);
m0dts 14:ce9c322f95f2 535 }
m0dts 14:ce9c322f95f2 536
m0dts 14:ce9c322f95f2 537 void writeData(int data) {
m0dts 14:ce9c322f95f2 538 pcf_lcd.write(rs_pin,0x01);
m0dts 14:ce9c322f95f2 539 wait_us(10);
m0dts 14:ce9c322f95f2 540 writeByte(data);
m0dts 14:ce9c322f95f2 541 }
m0dts 14:ce9c322f95f2 542
m0dts 14:ce9c322f95f2 543 void writeByte(int value) {
m0dts 14:ce9c322f95f2 544 //send MSB 4 bits
m0dts 14:ce9c322f95f2 545 write4bit(value>>4);
m0dts 14:ce9c322f95f2 546 //send LSB 4 bits
m0dts 14:ce9c322f95f2 547 write4bit(value);
m0dts 14:ce9c322f95f2 548 }
m0dts 14:ce9c322f95f2 549
m0dts 14:ce9c322f95f2 550 void writestring(int column, int row, string c) {
m0dts 14:ce9c322f95f2 551 int a = address(column, row);
m0dts 14:ce9c322f95f2 552 writeCommand(a);
m0dts 14:ce9c322f95f2 553 for (int i = 0; c[i] != '\0'; i++){
m0dts 14:ce9c322f95f2 554 writeData(c[i]);
m0dts 14:ce9c322f95f2 555 }
m0dts 14:ce9c322f95f2 556 }
m0dts 14:ce9c322f95f2 557
m0dts 14:ce9c322f95f2 558 void write4bit(int value) {
m0dts 14:ce9c322f95f2 559 pcf_lcd.write(d7_pin,(value>>3)&0x01);
m0dts 14:ce9c322f95f2 560 pcf_lcd.write(d6_pin,(value>>2)&0x01);
m0dts 14:ce9c322f95f2 561 pcf_lcd.write(d5_pin,(value>>1)&0x01);
m0dts 14:ce9c322f95f2 562 pcf_lcd.write(d4_pin,value&0x01);
m0dts 14:ce9c322f95f2 563 wait_us(10);
m0dts 14:ce9c322f95f2 564 pcf_lcd.write(e_pin,0x01);
m0dts 14:ce9c322f95f2 565 wait_us(10);
m0dts 14:ce9c322f95f2 566 pcf_lcd.write(e_pin,0x00);
m0dts 14:ce9c322f95f2 567 }
m0dts 14:ce9c322f95f2 568
m0dts 14:ce9c322f95f2 569 void cls() {
m0dts 14:ce9c322f95f2 570 writeCommand(0x01); // cls, and set cursor to 0
m0dts 14:ce9c322f95f2 571 wait_ms(2); // This command takes 1.64 ms
m0dts 14:ce9c322f95f2 572 locate(0, 0);
m0dts 14:ce9c322f95f2 573 }
m0dts 14:ce9c322f95f2 574
m0dts 14:ce9c322f95f2 575 void locate(int column, int row) {
m0dts 14:ce9c322f95f2 576 _column = column;
m0dts 14:ce9c322f95f2 577 _row = row;
m0dts 14:ce9c322f95f2 578 }
m0dts 14:ce9c322f95f2 579
m0dts 14:ce9c322f95f2 580 void init() {
m0dts 14:ce9c322f95f2 581 //set default pin state for enable and reset
m0dts 14:ce9c322f95f2 582 pcf_lcd.write(e_pin,0);
m0dts 14:ce9c322f95f2 583 pcf_lcd.write(rs_pin,0);
m0dts 14:ce9c322f95f2 584
m0dts 14:ce9c322f95f2 585 //Enter 4bit mode, write 2 twice
m0dts 14:ce9c322f95f2 586 write4bit(0x2); //0010
m0dts 14:ce9c322f95f2 587 write4bit(0x2); //0010
m0dts 14:ce9c322f95f2 588 write4bit(0x8); //1000 english_japanese (default), 5x8 font, 2 line+
m0dts 14:ce9c322f95f2 589 wait_ms(10);
m0dts 14:ce9c322f95f2 590
m0dts 14:ce9c322f95f2 591 //display off, cursor off, blink off
m0dts 14:ce9c322f95f2 592 writeCommand(0x8);
m0dts 14:ce9c322f95f2 593 wait_ms(1);
m0dts 14:ce9c322f95f2 594
m0dts 14:ce9c322f95f2 595 //clear display
m0dts 14:ce9c322f95f2 596 writeCommand(0x1);
m0dts 14:ce9c322f95f2 597 wait_ms(1);
m0dts 14:ce9c322f95f2 598
m0dts 14:ce9c322f95f2 599 //display home
m0dts 14:ce9c322f95f2 600 writeCommand(0x2);
m0dts 14:ce9c322f95f2 601 wait_ms(1);
m0dts 14:ce9c322f95f2 602
m0dts 14:ce9c322f95f2 603 //increment, no shift
m0dts 14:ce9c322f95f2 604 writeCommand(0x6);
m0dts 14:ce9c322f95f2 605 wait_ms(1);
m0dts 14:ce9c322f95f2 606
m0dts 14:ce9c322f95f2 607 //display on, cursor off, blink off
m0dts 14:ce9c322f95f2 608 writeCommand(0x0c);
m0dts 14:ce9c322f95f2 609 wait_ms(1);
m0dts 14:ce9c322f95f2 610
m0dts 14:ce9c322f95f2 611 }
m0dts 14:ce9c322f95f2 612
m0dts 14:ce9c322f95f2 613 void character(int column, int row, int c) {
m0dts 14:ce9c322f95f2 614 int a = address(column, row);
m0dts 14:ce9c322f95f2 615 writeCommand(a);
m0dts 14:ce9c322f95f2 616 writeData(c);//data
m0dts 14:ce9c322f95f2 617 }
m0dts 14:ce9c322f95f2 618
m0dts 14:ce9c322f95f2 619
m0dts 14:ce9c322f95f2 620
m0dts 14:ce9c322f95f2 621 int address(int column, int row) {
m0dts 14:ce9c322f95f2 622 switch (row) {
m0dts 14:ce9c322f95f2 623 case 0:
m0dts 14:ce9c322f95f2 624 return 0x80 + column;
m0dts 14:ce9c322f95f2 625 case 1:
m0dts 14:ce9c322f95f2 626 return 0xc0 + column;
m0dts 14:ce9c322f95f2 627 case 2:
m0dts 14:ce9c322f95f2 628 return 0x94 + column;
m0dts 14:ce9c322f95f2 629 case 3:
m0dts 14:ce9c322f95f2 630 return 0xd4 + column;
m0dts 14:ce9c322f95f2 631 default:
m0dts 14:ce9c322f95f2 632 return 0x80 + column;
m0dts 14:ce9c322f95f2 633 }
m0dts 14:ce9c322f95f2 634 }
m0dts 14:ce9c322f95f2 635
m0dts 14:ce9c322f95f2 636
m0dts 14:ce9c322f95f2 637
m0dts 14:ce9c322f95f2 638
m0dts 14:ce9c322f95f2 639
m0dts 14:ce9c322f95f2 640