gnokii-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnokii/common/phones nk6100.c, 1.154, 1.155 nk6510.c, 1.125, 1.126 nokia


From: BORBELY Zoltan <address@hidden>
Subject: gnokii/common/phones nk6100.c, 1.154, 1.155 nk6510.c, 1.125, 1.126 nokia.c, 1.34, 1.35
Date: Fri, 24 Oct 2003 12:49:07 +0000

Update of /cvsroot/gnokii/gnokii/common/phones
In directory subversions:/tmp/cvs-serv28077/common/phones

Modified Files:
        nk6100.c nk6510.c nokia.c 
Log Message:
ringtone handling updates


Index: nk6100.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nk6100.c,v
retrieving revision 1.154
retrieving revision 1.155
diff -C2 -d -r1.154 -r1.155
*** nk6100.c    23 Oct 2003 01:13:52 -0000      1.154
--- nk6100.c    24 Oct 2003 12:49:04 -0000      1.155
***************
*** 116,119 ****
--- 116,120 ----
  static gn_error GetRawRingtone(gn_data *data, struct gn_statemachine *state);
  static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state);
+ static gn_error DeleteRingtone(gn_data *data, struct gn_statemachine *state);
  static gn_error PressOrReleaseKey(bool press, gn_data *data, struct 
gn_statemachine *state);
  static gn_error PressOrReleaseKey1(bool press, gn_data *data, struct 
gn_statemachine *state);
***************
*** 352,355 ****
--- 353,358 ----
        case GN_OP_SetRawRingtone:
                return SetRawRingtone(data, state);
+       case GN_OP_DeleteRingtone:
+               return DeleteRingtone(data, state);
        case GN_OP_PlayTone:
                return pnok_play_tone(data, state);
***************
*** 2777,2786 ****
  static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state)
  {
!       unsigned char req[512] = {0x00, 0x01, 0xa0, 0x00, 0x00,
!                                 0x0c, 0x2c, 0x01,
!                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
!                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
!                                 0x02, 0xfc, 0x09};
        gn_error error;
  
        if (!data || !data->ringtone || !data->raw_data || 
!data->raw_data->data)
--- 2780,2790 ----
  static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state)
  {
!       unsigned char req[512] = {0x00, 0x01, 0xa0,
!                                 0x00,                         /* location */
!                                 0x00, 0x0c, 0x2c, 0x01, 0x00, 0x00, 0x00, 
0x00,
!                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00,
!                                 0x00, 0x02, 0xfc, 0x09};      /* data */
        gn_error error;
+       int len;
  
        if (!data || !data->ringtone || !data->raw_data || 
!data->raw_data->data)
***************
*** 2790,2801 ****
        req[3] = data->ringtone->location - 17;
        snprintf(req + 8, 13, "%s", data->ringtone->name);
!       memcpy(req + 24, data->raw_data->data, data->raw_data->length);
  
        if ((error = pnok_extended_cmds_enable(0x01, data, state))) return 
error;
  
!       if (sm_message_send(24 + data->raw_data->length, 0x40, req, state)) 
return GN_ERR_NOTREADY;
        return sm_block(0x40, data, state);
  }
  
  static gn_error get_imei(gn_data *data, struct gn_statemachine *state)
  {
--- 2794,2833 ----
        req[3] = data->ringtone->location - 17;
        snprintf(req + 8, 13, "%s", data->ringtone->name);
!       if (memcmp(data->raw_data->data, req + 20, 3) == 0) {
!               memcpy(req + 20, data->raw_data->data, data->raw_data->length);
!               len = 20 + data->raw_data->length;
!       } else {
!               /* compatibility */
!               memcpy(req + 24, data->raw_data->data, data->raw_data->length);
!               len = 24 + data->raw_data->length;
!       }
  
        if ((error = pnok_extended_cmds_enable(0x01, data, state))) return 
error;
  
!       if (sm_message_send(len, 0x40, req, state)) return GN_ERR_NOTREADY;
        return sm_block(0x40, data, state);
  }
  
+ static gn_error DeleteRingtone(gn_data *data, struct gn_statemachine *state)
+ {
+       gn_ringtone ringtone;
+       gn_raw_data rawdata;
+       unsigned char buf[] = {0x00, 0x02, 0xfc, 0x0b};
+       gn_data d;
+ 
+       if (!data->ringtone) return GN_ERR_INTERNALERROR;
+ 
+       memset(&ringtone, 0, sizeof(ringtone));
+       ringtone.location = (data->ringtone->location < 0) ? 17 : 
data->ringtone->location;
+       memset(&rawdata, 0, sizeof(gn_raw_data));
+       rawdata.data = buf;
+       rawdata.length = sizeof(buf);
+       gn_data_clear(&d);
+       d.ringtone = &ringtone;
+       d.raw_data = &rawdata;
+ 
+       return SetRawRingtone(&d, state);
+ }
+ 
  static gn_error get_imei(gn_data *data, struct gn_statemachine *state)
  {
***************
*** 2887,2893 ****
                data->ringtone->location = message[3] + 17;
                snprintf(data->ringtone->name, sizeof(data->ringtone->name), 
"%s", message + 8);
                if (data->raw_data && data->raw_data->data) {
!                       memcpy(data->raw_data->data, message + 24, length - 24);
!                       data->raw_data->length = length - 24;
                }
                break;
--- 2919,2926 ----
                data->ringtone->location = message[3] + 17;
                snprintf(data->ringtone->name, sizeof(data->ringtone->name), 
"%s", message + 8);
+               if (data->raw_data->length < length - 20) return 
GN_ERR_MEMORYFULL;
                if (data->raw_data && data->raw_data->data) {
!                       memcpy(data->raw_data->data, message + 20, length - 20);
!                       data->raw_data->length = length - 20;
                }
                break;

Index: nokia.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nokia.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** nokia.c     7 Oct 2003 22:08:36 -0000       1.34
--- nokia.c     24 Oct 2003 12:49:05 -0000      1.35
***************
*** 508,513 ****
--- 508,516 ----
        gn_ringtone_note *note;
        int notes[] = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12};
+       int dct4, base;
  
        ringtone->tempo = 120;
+       dct4 = 0;
+       base = 114;
  
  recode:
***************
*** 564,567 ****
--- 567,573 ----
                        /* unknown */
  
+               } else if (c == 0x02) {
+                       /* unknown */
+ 
                } else if (c == 0x05) {
                        /* begin repeat */
***************
*** 593,597 ****
                        gn_ringtone_set_duration(ringtone, note - 
ringtone->notes, 8000 * p);
  
!               } else if (114 <= c && c <= 161) {
                        /* normal tone */
                        if (c == lastc) {
--- 599,603 ----
                        gn_ringtone_set_duration(ringtone, note - 
ringtone->notes, 8000 * p);
  
!               } else if (66 <= c && c <= 161) {
                        /* normal tone */
                        if (c == lastc) {
***************
*** 605,629 ****
                        }
  
!                       note->note = 14 * ((c - 114) / 12) + notes[(c - 114) % 
12];
!                       gn_ringtone_set_duration(ringtone, note - 
ringtone->notes, 8000 * p);
! 
!               } else if (66 <= c && c <= 113) {
!                       /*
!                        * FIXME:
!                        * octave(s) below limit! we should be more
!                        * intelligent in the future -- bozo
!                        */
! 
!                       if (c == lastc) {
!                               lastp += p;
!                               p = lastp;
                        } else {
!                               if (ringtone->notes_count >= 
GN_RINGTONE_MAX_NOTES) return GN_ERR_INVALIDSIZE;
!                               note = ringtone->notes + 
ringtone->notes_count++;
!                               lastc = c;
!                               lastp = p;
                        }
- 
-                       note->note = notes[(c - 66) % 12];
                        gn_ringtone_set_duration(ringtone, note - 
ringtone->notes, 8000 * p);
  
--- 611,624 ----
                        }
  
!                       if (c < base) {
!                               if (!dct4) {
!                                       dct4 = 1;
!                                       base = 90;
!                                       goto recode;
!                               }
!                               note->note = notes[(c - 66) % 12];
                        } else {
!                               note->note = 14 * ((c - base) / 12) + notes[(c 
- base) % 12];
                        }
                        gn_ringtone_set_duration(ringtone, note - 
ringtone->notes, 8000 * p);
  
***************
*** 668,677 ****
  }
  
! gn_error pnok_ringtone_to_raw(char *raw, int *rawlen, const gn_ringtone 
*ringtone)
  {
!       int i, c, p, l, freq;
        int rleft, vtime, vstat;
        const gn_ringtone_note *note;
!       char header[] = {0x00, 0x0a, 0x01};
        char tailer[] = {0x0a, 0x0a, 0x0a, 0xfe, 0x40, 0x20, 0x07, 0x0b, 0xff, 
0xff, 0xff, 0xff};
        char vibr_on[] = {0x0a, 0x01};
--- 663,672 ----
  }
  
! gn_error pnok_ringtone_to_raw(char *raw, int *rawlen, const gn_ringtone 
*ringtone, int dct4)
  {
!       int i, c, p, l, freq, base;
        int rleft, vtime, vstat;
        const gn_ringtone_note *note;
!       char header[] = {0x00, 0x02, 0xfc, 0x0a, 0x01};
        char tailer[] = {0x0a, 0x0a, 0x0a, 0xfe, 0x40, 0x20, 0x07, 0x0b, 0xff, 
0xff, 0xff, 0xff};
        char vibr_on[] = {0x0a, 0x01};
***************
*** 682,685 ****
--- 677,681 ----
        vtime = 0;
        vstat = 1;
+       base = dct4 ? 90 : 114;
  
        if (rleft < sizeof(header)) return GN_ERR_MEMORYFULL;
***************
*** 706,710 ****
                        p++;
                } else {
!                       c = 12 * (note->note / 14) + notes[note->note % 14] + 
114;
                }
                while (p > 1) {
--- 702,706 ----
                        p++;
                } else {
!                       c = 12 * (note->note / 14) + notes[note->note % 14] + 
base;
                }
                while (p > 1) {

Index: nk6510.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nk6510.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -C2 -d -r1.125 -r1.126
*** nk6510.c    23 Oct 2003 00:35:01 -0000      1.125
--- nk6510.c    24 Oct 2003 12:49:05 -0000      1.126
***************
*** 123,126 ****
--- 123,128 ----
  static gn_error NK6510_GetRingtone(gn_data *data, struct gn_statemachine 
*state);
  static gn_error NK6510_SetRingtone(gn_data *data, struct gn_statemachine 
*state);
+ static gn_error NK6510_DeleteRingtone(gn_data *data, struct gn_statemachine 
*state);
+ static gn_error NK6510_PlayTone(gn_data *data, struct gn_statemachine *state);
  static gn_error NK6510_GetProfile(gn_data *data, struct gn_statemachine 
*state);
  static gn_error NK6510_SetProfile(gn_data *data, struct gn_statemachine 
*state);
***************
*** 160,163 ****
--- 162,166 ----
  static gn_error NK6510_IncomingWAP(int messagetype, unsigned char *message, 
int length, gn_data *data, struct gn_statemachine *state);
  static gn_error NK6510_IncomingToDo(int messagetype, unsigned char *message, 
int length, gn_data *data, struct gn_statemachine *state);
+ static gn_error NK6510_IncomingSound(int messagetype, unsigned char *message, 
int length, gn_data *data, struct gn_statemachine *state);
  
  #ifdef  SECURITY
***************
*** 197,200 ****
--- 200,204 ----
        { NK6510_MSG_WAP,       NK6510_IncomingWAP },
        { NK6510_MSG_TODO,      NK6510_IncomingToDo },
+       { NK6510_MSG_SOUND,     NK6510_IncomingSound },
        { 0, NULL }
  };
***************
*** 364,367 ****
--- 368,375 ----
        case GN_OP_GetRingtoneList:
                return NK6510_GetRingtoneList(data, state);
+       case GN_OP_DeleteRingtone:
+               return NK6510_DeleteRingtone(data, state);
+       case GN_OP_PlayTone:
+               return NK6510_PlayTone(data, state);
        default:
                return GN_ERR_NOTIMPLEMENTED;
***************
*** 2496,2505 ****
        /* set raw ringtone result */
        case 0x0f:
!               if (message[4] == 0x00 && message[5] == 0x00) {
!                       break;
!               } else if (message[4] == 0x03 || message[5] == 0x00) {
!                       /* FIXME: some kind of ringtone error */
!                       return GN_ERR_UNKNOWN;
!               } else return GN_ERR_UNHANDLEDFRAME;
                break;
  
--- 2504,2524 ----
        /* set raw ringtone result */
        case 0x0f:
!               if (message[5] != 0x00) return GN_ERR_UNHANDLEDFRAME;
!               switch (message[4]) {
!               case 0x00: break;
!               case 0x03: return GN_ERR_INVALIDLOCATION;
!               default:   return GN_ERR_UNHANDLEDFRAME;
!               }
!               break;
! 
!       /* delete ringtone result */
!       case 0x11:
!               if (message[5] != 0x00) return GN_ERR_UNHANDLEDFRAME;
!               switch (message[4]) {
!               case 0x00: break;
!               case 0x03: return GN_ERR_INVALIDLOCATION;
!               case 0x0a: return GN_ERR_EMPTYLOCATION;
!               default:   return GN_ERR_UNHANDLEDFRAME;
!               }
                break;
  
***************
*** 2551,2563 ****
  static gn_error NK6510_SetRawRingtone(gn_data *data, struct gn_statemachine 
*state)
  {
!       unsigned char req[32768] = {FBUS_FRAME_HEADER, 0x0e, 0x7f, 0xff, 0xfe};
        unsigned char *pos;
  
        if (!data->ringtone || !data->raw_data) return GN_ERR_INTERNALERROR;
-       /* FIXME: where is the location field? */
-       if (data->ringtone->location < 0) data->ringtone->location = 
NK6510_RINGTONE_USERDEF_LOCATION;
  
        dprintf("Setting raw ringtone %d...\n", data->ringtone->location);
!       pos = req + 7;
        *pos = strlen(data->ringtone->name);
        char_unicode_encode(pos + 1, data->ringtone->name, *pos);
--- 2570,2589 ----
  static gn_error NK6510_SetRawRingtone(gn_data *data, struct gn_statemachine 
*state)
  {
!       unsigned char req[32768] = {FBUS_FRAME_HEADER, 0x0e, 0x00, 0x00, 0xfe};
        unsigned char *pos;
  
        if (!data->ringtone || !data->raw_data) return GN_ERR_INTERNALERROR;
  
        dprintf("Setting raw ringtone %d...\n", data->ringtone->location);
! 
!       pos = req + 4;
!       if (data->ringtone->location < 0) {
!               *pos++ = 0x7f;
!               *pos++ = 0xff;
!       } else {
!               *pos++ = data->ringtone->location / 256;
!               *pos++ = data->ringtone->location % 256;
!       }
!       pos++;
        *pos = strlen(data->ringtone->name);
        char_unicode_encode(pos + 1, data->ringtone->name, *pos);
***************
*** 2611,2615 ****
        d.raw_data = &rawdata;
  
!       if ((err = pnok_ringtone_to_raw(rawdata.data, &rawdata.length, 
data->ringtone)) != GN_ERR_NONE)
                return err;
  
--- 2637,2641 ----
        d.raw_data = &rawdata;
  
!       if ((err = pnok_ringtone_to_raw(rawdata.data, &rawdata.length, 
data->ringtone, 1)) != GN_ERR_NONE)
                return err;
  
***************
*** 2617,2620 ****
--- 2643,2663 ----
  }
  
+ static gn_error NK6510_DeleteRingtone(gn_data *data, struct gn_statemachine 
*state)
+ {
+       unsigned char req[] = {FBUS_FRAME_HEADER, 0x10, 0x00, 0x00};
+ 
+       if (!data->ringtone) return GN_ERR_INTERNALERROR;
+ 
+       if (data->ringtone->location < 0) {
+               req[4] = 0x7f;
+               req[5] = 0xfe;
+       } else {
+               req[4] = data->ringtone->location / 256;
+               req[5] = data->ringtone->location % 255;
+       }
+ 
+       SEND_MESSAGE_BLOCK(NK6510_MSG_RINGTONE, 6);
+ }
+ 
  
  /*************/
***************
*** 3873,3876 ****
--- 3916,3974 ----
        dprintf("Setting ToDo\n");
        SEND_MESSAGE_BLOCK(NK6510_MSG_TODO, 10 + strlen(data->todo->text) * 2);
+ }
+ 
+ /********************/
+ /****** SOUND *******/
+ /********************/
+ 
+ static gn_error NK6510_IncomingSound(int messagetype, unsigned char *message, 
int length, gn_data *data, struct gn_statemachine *state)
+ {
+       switch (message[3]) {
+       /* response to init1 - meaning unknown */
+       case 0x01:
+       case 0x02:
+               break;
+ 
+       /* buzzer on/off - meaning unknown */
+       case 0x14:
+       case 0x15:
+       case 0x16:
+               break;
+ 
+       default:
+               return GN_ERR_UNHANDLEDFRAME;
+       }
+ 
+       return GN_ERR_NONE;
+ }
+ 
+ static gn_error NK6510_PlayTone(gn_data *data, struct gn_statemachine *state)
+ {
+       unsigned char init1[] = {0x00, 0x06, 0x01, 0x00, 0x07, 0x00};
+       unsigned char init2[] = {0x00, 0x06, 0x01, 0x14, 0x05, 0x05, 0x00, 0x00,
+                                0x00, 0x01, 0x03, 0x08, 0x05, 0x00, 0x00, 0x08,
+                                0x00, 0x00};
+       unsigned char req[] = {0x00, 0x06, 0x01, 0x14, 0x05, 0x04, 0x00, 0x00,
+                              0x00, 0x03, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01,
+                              0x00, 0x00, 0x03, 0x08, 0x01, 0x00,
+                              0x00, 0x00,      /* frequency */
+                              0x00, 0x00, 0x03, 0x08, 0x02, 0x00, 0x00,
+                              0x05,            /* volume */
+                              0x00, 0x00};
+       gn_error err;
+ 
+       if (!data->tone) return GN_ERR_INTERNALERROR;
+ 
+       if (sm_message_send(6, 0x0b, init1, state)) return GN_ERR_NOTREADY;
+       if ((err = sm_block(NK6510_MSG_SOUND, data, state)) != GN_ERR_NONE) 
return err;
+       if (sm_message_send(18, 0x0b, init2, state)) return GN_ERR_NOTREADY;
+       if ((err = sm_block(NK6510_MSG_SOUND, data, state)) != GN_ERR_NONE) 
return err;
+ 
+       req[31] = data->tone->volume;
+       req[22] = data->tone->frequency / 256;
+       req[23] = data->tone->frequency % 255;
+ 
+       dprintf("Playing tone\n");
+       SEND_MESSAGE_BLOCK(NK6510_MSG_SOUND, 34);
  }
  





reply via email to

[Prev in Thread] Current Thread [Next in Thread]